📫 Simple mail client for Vim.
⚠️ Project archived. Have a look at himalaya, its successor.
Simple mail client for Vim, inspired by (Neo)Mutt and Alpine.
(Neo)Mutt and Alpine are very good terminal mail clients, but they lack of Vim mappings. You can emulate, but it requires a lot of time, patience and configuration. Why trying to emulate, when you can have it in Vim? VimL and Python are strong enough to do so. The aim of Iris is to provide a simple mail client that:
You need either Neovim or Vim8+ with:
Before using Iris, you need to configure it:
let g:iris_name = "My name" let g:iris_mail = "[email protected]"
let g:iris_imap_host = "your.imap.host" let g:iris_imap_port = 993 let g:iris_imap_login = "Your IMAP login" "Default to g:iris_mail
let g:iris_smtp_host = "your.smtp.host" "Default to g:iris_imap_host let g:iris_smtp_port = 587 let g:iris_smtp_login = "Your IMAP login" "Default to g:iris_mail
On startup, Iris always asks for your IMAP and SMTP passwords. To avoid this, you can save your password in a file and encrypt it via GPG:
gpg --encrypt --sign --armor --output myfile.gpg myfile
let g:iris_imap_passwd_filepath = "/path/to/imap.gpg" let g:iris_smtp_passwd_filepath = "/path/to/smtp.gpg"
iris_smtp_password_filepathmust be absolute paths. For example the path
~/passwords/imap.gpgwould not work because of the
If you want to use something else than GPG, you can set up your custom command. For eg., with the MacOSX
let g:iris_imap_passwd_show_cmd = "security find-internet-password -gs IMAP_KEY -w" let g:iris_smtp_passwd_show_cmd = "security find-internet-password -gs SMTP_KEY -w"
On startup, Iris spawns two Python jobs: one for the API, one for the idle mode. The last one allows you to receive notifications on new mails. You can disable this option or change the default timeout (every 15s):
let g:iris_idle_enabled = 1 let g:iris_idle_timeout = 15
By default, Iris fetches your last 50 mails:
let g:iris_emails_chunk_size = 50
Note: the pagination is based on message sequences which is not necessary consecutive. It makes the pagination less accurate (doesn't fetch always the same amount of mails) but more performant.
let g:iris_download_dir = "~/Downloads"
Function | Default keybind | Override --- | --- | --- Preview (text) ||
nmap (iris-preview-text-email)Preview (html) |
go preview) |
nmap gp (iris-preview-html-email)Download attachments |
go attachments) |
nmap ga (iris-download-attachments)New mail |
go new) |
nmap gn (iris-new-email)Previous page | (for
page backward) |
nmap (iris-prev-page-emails)Next page | (for
page forward) |
nmap (iris-next-page-emails)Change folder |
go folder) |
nmap gf (iris-change-folder)
nmap gr (iris-reply-email)
go reply all)
nmap gR (iris-reply-all-email)
nmap gf (iris-forward-email)
Iris is based on the builtin
mail.vimfiletype and syntax. An email should contains a list of headers followed by the message:
To: [email protected] Subject: Welcome
nmap gs (iris-send-email)
By default, Iris will display a basic prompt to select your folders:
Iris supports those fuzzy finders:
Note: Iris will use the first fuzzy finder available automatically.
Flags appears in the first column of the email list view. There is 5 different flags:
Nif it's a new email
Rif it has been replied
Fif it has been flagged
Dif it's a draft
@if it contains an attachment
In order to autocomplete addresses, Iris keeps a
.contactsfile that contains emails of your contacts. It's updated each time you send a new email (only the
Toheader is used). You can extract existing addresses from all your emails:
Note: the completion may need to be triggered manually via
Git commit messages follow the Angular Convention, but contain only a subject.
Use imperative, present tense: “change” not “changed” nor “changes”
Don't capitalize first letter
No dot (.) at the end
Code should be as clean as possible, variables and functions use the snake case convention. A line should never contain more than
Tests should be added for each new functionality. Be sure to run tests before proposing a pull request.