A Much Longer Journey Into File Annotation
How I ended up writing my first Vim Plugin…
In a previous
post, I took a short look into how I’d gone from tagging my files
using a small shell script, and how I’d changed my method to use a Vim
iabbrev
.
I thought that would be the end of my journey, but I decided to use the opportunity to make a small Vim plugin which made the whole process a lot more easy to configure if there’s extra functionality required.
The Good, The Bad, & The Ugly
The plugin I ended up creating has some really nice elements, some elements I struggled with, and some problems I’m yet to solve…
The Good
I needed a way to let someone using the file input their signature (e.g., “Julian Orchard hello@julianorchard.co.uk”), and I came up with a way of doing that which works really well in my opinion.
Once the plugin is installed (I use Vim-Plug for regular
Vim, and with Neovim I use Packer.nvim), you
can define either a string in your .vimrc
file, or a
list.
For example;
" A String
let g:desc_author = "Julian Orchard <hello@julianorchard.co.uk>"
" A List
let g:desc_author = [["desc", "Julian Orchard <hello@julianorchard.co.uk>"],
\["des2", "Another Signature <me@julianorchard.co.uk>"]]
This conveniently solves the issue of how to easily define a
signature, but also makes it possible for the user of the plugin to
change the iabbrev
keyword used. The list doesn’t
have to have multiple values; if you want to reclaim the word
desc
(the default keyword), you can just do something like
this:
let g:desc_author = [["trigger_desc", "Julian Orchard <hello@julianorchard.co.uk>"]
I was really happy with this solution, but what happens if someone
doesn’t add anything to their .vimrc
file?
Initially, I just removed the line from the description, if no
g:desc_author
was defined, but I came up with a pretty nice
alternative… you can add this as an iabbrev
to your config
files independently too, I think it’s pretty good:
iab <expr> ~g substitute(system('git config --global user.name') . " <" .
\system('git config --global user.email') . ">", '\n', '', 'g')
This gets your git config --global user.name
and
user.email
variables, and uses them to create the
signature. Mine is
julianorchard <hello@julianorchard.co.uk>
, for
example.
The Bad
I think using iabbrev
might have been a mistake, in
hindsight. I didn’t find it very flexible in how it works, and figuring
out I needed <expr>
took longer than it should have;
it wasn’t very intuitive.
The code also repeats itself more than I’d like as a result. It’s not
too bad, but I have four different iabbrev
’s in the final
version;
- One for block comments and there is a signature to add
- One for line comments and there is a signature to add
- One for block comments and there is no signature to add
- One for line comments and there is no signature to add
It’s just not as clean as I’d like, and I think I’d have more flexibility using a remapped keybinding or some other feature.
The Ugly
I’m fairly certain the autocmd
’s I have made use of do
not work in the most performative way. I don’t notice an impact from
them, but each time the user goes into insert mode, the
iabbrev
is updated.
Perfectionist
Unfortunately, I am a bit of a perfectionist, and I’m not 100% happy with the plugin, but I have to praise myself; for my first Vim plugin, I’m pretty content with it.
I’ve tested it with my Neovim config, which is new for me, and it seems to also work well.
That’s it.
Edit, almost immediately after publishing:
No, that’s not it! The plugin is here if you want to check it out, or have any much appreciated feedback! That’s it.