asyncomplete-muttgoobook.vim/README.md

111 lines
4.9 KiB
Markdown

# asyncomplete-muttgoobook.vim
A vim plugin for mail files to select email addresses from the mutt aliases file, and Google Contacts (using goobook).
## Prerequisites
* This has been tested with the
[vim-plug](https://github.com/junegunn/vim-plug) minimalist Vim plugin
manager. Other plugin managers may work.
* This is designed to work with the
[asyncomplete](https://github.com/prabirshrestha/asyncomplete.vim) code
completion subsystem, which is writtin in pure Vim (v8) script.
* [goobook](http://gitlab.com/goobook/goobook) for interacting with your Google
Contacts from the command line. This has been tested with Goobook 3.5.2, but
1.x may work if your distribution still uses Python 2.7+.
* This is designed to work in mutt, but is not mutt-specific (except for
reading _${HOME}/.mutt/aliases_). Using vim to edit the file type `mail`
should be enough to get it working.
As of this writing (2023-04-30), this has only been tested in Vim v9, but is
also writtin in Vim v8 script so should work in older versions.
## Installation
1. Clone this repository into your Vim plugin directory. For vim-plug in Vim
on Linux, this is usually _${HOME}/.vim/plugged_, but vim-plug will place
it here automatically if you merely configure $MYVIMRC properly. Place the
following line between `call plug#begin(..)` and `call plug#end()`:
```vim
call plug#begin('...')
" ...
Plug 'https://git.eldon.me/trey/asyncomplete-muttgoobook.vim'
" ...
call plug#end()
```
Then, inside Vim, run `:PlugInstall`. You can check that the muttgoobook
plugin is installed successfully with `:PlugStatus`.
1. Configure Vim in $MYVIMRC to load the `muttgoobook` source using the
following:
```vim
autocmd User asyncomplete_setup call asyncomplete#register_source({
\ 'name': 'muttgoobook',
\ 'allowlist': ['mail'],
\ 'completor': function('asyncomplete#sources#muttgoobook#completor'),
\ })
```
If you want to have other file types to use this plugin, you may add them
to the `allowlist` above.
1. By default, this plugin tries to determine if the cursor is in an email
address field ('From:', 'To:', 'Cc:', 'Bcc:', in English). The matching is
case-insensitive. If you use another language, that names these fields
differently, you can modify this in $MYVIMRC by adding the
`g:muttgoobook_address_fields` global variable. This is designed to be a
Vim regular expression, replace `['from', 'to', 'b\?cc']` accordingly:
```vim
let g:muttgoobook_address_fields = '^\s*\(from\|to\|b\?cc\):\s*'
```
The above pattern is the default if this variable isn't specified.
1. Also, if your mutt aliases file is in a different path than
_${HOME}/.mutt/aliases_, you can override it in $MYVIMRC with the global
variable `g:mutt_aliases`:
```vim
let g:mutt_aliases = '~/.mutt/aliases'
```
Again, what appears above is the default if not set explicitly to
something else. Any double-quotes (`"`) and backslashes (`\`) in the mutt
aliases file will be removed before pasting the results of the completion
to the currently edited mail file.
## How to use it
If asyncomplete is installed correctly and is working, editing
a file type of `mail` should show the popup completion menu after you've typed
the first three characters of the name or email address, as long as the cursor
is in a `From:`, `To:`, `Cc:`, or `Bcc` field. Case doesn't matter for the
name of the address field, and the cursor can be in a multi-line list of
names/email addresses.
The listing of the popup completion menu will show mutt aliases and names from
goobook that match the string entered thus far. You can further limit the
results returned in the popup completion menu by typing more characters.
Select the alias or name and press `Enter`, and the value from the alias will
be pasted (for mutt aliases), and the name and email address from Google
Contacts (goobook). Values from mutt aliases will be pasted verbatim except
backslashes (`\`) and double-quotes (`"`) will be removed. Email addresses
from goobook will appear between angle brackets (`<` and `>`).
NOTE: If you're entering multiple names and email addresses, one at a time
separated by commas (`,`), subsequent names and addresses need to be on a
separate line. mutt requires these subsequent lines to be prefixed with spaces
or tabs, or else it won't consider the subsequent lines to be part of the same
address field. This does not apply to multiple addresses in the same mutt
alias.
## TODO
* possibly set up some kind of trigger to post an email address from the mutt
aliases file or Google Contacts, within the body of the message.
* Groups from Google Contacts have not been tested, the behavior may be
undefined if the goobook query returns multiple addresses.
* Maybe integrate with other CLI contact services, but the project may need to
be renamed
* Perform more testing!