Need help with iris.vim?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

soywod
148 Stars 5 Forks MIT License 82 Commits 17 Opened issues

Description

đź“« Simple mail client for Vim.

Services available

!
?

Need anything else?

Contributors list

# 247,549
Vim
taskwar...
python3
Neovim
81 commits
# 289,866
Neovim
React
C
Zsh
1 commit

đź“« Iris.vim

Simple mail client for Vim, inspired by (Neo)Mutt and Alpine.

image

Table of contents

Motivation

(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:

  • Allows you to manage your mails inside Vim
  • Does not slow down neither Vim nor your workflow (async+lazy)
  • Is built on the top of a robust Python IMAP client to avoid implementing IMAP protocol logic

Requirements

You need either Neovim or Vim8+ with:

  • Python3 support enabled
    :echo has("python3")
  • Job enabled
    :echo has("job")
  • Channel enabled
    :echo has("channel")

Installation

For eg. with

vim-plug
:

Plug "soywod/iris.vim"

Configuration

Before using Iris, you need to configure it:

Identity (required)

let g:iris_name  = "My name"
let g:iris_mail = "[email protected]"

IMAP (required)

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

SMTP (required)

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

Passwords

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"

Note:

iris_imap_passwd_filepath
&
iris_smtp_password_filepath
must be absolute paths. For example the path
~/passwords/imap.gpg
would 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

security
tool:
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"

Idle mode

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

Pagination

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.

Attachments

let g:iris_download_dir = "~/Downloads"

Usage

Email list

:Iris

Function | Default keybind | Override --- | --- | --- Preview (text) |

 | 
nmap  (iris-preview-text-email)
Preview (html) |
gp
(for
go preview
) |
nmap gp (iris-preview-html-email)
Download attachments |
ga
(for
go attachments
) |
nmap ga (iris-download-attachments)
New mail |
gn
(for
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 |
gf
(for
go folder
) |
nmap gf (iris-change-folder)

Email text preview

Function

Default keybind Override
Reply

gr
(for
go reply
)
nmap gr (iris-reply-email)
Reply all
gR
(for
go reply all
)
nmap gR (iris-reply-all-email)
Forward
gf
(for
go forward
)
nmap gf (iris-forward-email)

Email composition

Iris is based on the builtin

mail.vim
filetype and syntax. An email should contains a list of headers followed by the message:
To: [email protected]
Subject: Welcome

Hello world!

Function

Default keybind Override
Save draft

:w
Send
gs
(for
go send
)
nmap gs (iris-send-email)

Folders

By default, Iris will display a basic prompt to select your folders:

:IrisFolder

Iris supports those fuzzy finders:

Note: Iris will use the first fuzzy finder available automatically.

Flags

Flags appears in the first column of the email list view. There is 5 different flags:

  • N
    if it's a new email
  • R
    if it has been replied
  • F
    if it has been flagged
  • D
    if it's a draft
  • @
    if it contains an attachment

Contacts

In order to autocomplete addresses, Iris keeps a

.contacts
file that contains emails of your contacts. It's updated each time you send a new email (only the
To
header is used). You can extract existing addresses from all your emails:
:IrisExtractContacts

Note: the completion may need to be triggered manually via

, see
:h i_CTRL-X_CTRL-U
.

Contributing

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

80
characters.

Tests should be added for each new functionality. Be sure to run tests before proposing a pull request.

Credits

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.