• Stars
    star
    156
  • Rank 239,589 (Top 5 %)
  • Language
    Vim Script
  • License
    MIT License
  • Created about 6 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

📫 Simple mail client for Vim.

⚠️ Project archived. Have a look at himalaya, its successor.

📫 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) <Enter> nmap <cr> <plug>(iris-preview-text-email)
Preview (html) gp (for go preview) nmap gp <plug>(iris-preview-html-email)
Download attachments ga (for go attachments) nmap ga <plug>(iris-download-attachments)
New mail gn (for go new) nmap gn <plug>(iris-new-email)
Previous page <Ctrl+b> (for page backward) nmap <c-b> <plug>(iris-prev-page-emails)
Next page <Ctrl+f> (for page forward) nmap <c-f> <plug>(iris-next-page-emails)
Change folder gf (for go folder) nmap gf <plug>(iris-change-folder)

Email text preview

Function Default keybind Override
Reply gr (for go reply) nmap gr <plug>(iris-reply-email)
Reply all gR (for go reply all) nmap gR <plug>(iris-reply-all-email)
Forward gf (for go forward) nmap gf <plug>(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: mail@test.com
Subject: Welcome

Hello world!
Function Default keybind Override
Save draft :w
Send gs (for go send) nmap gs <plug>(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 <C-x><C-u>, 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

More Repositories

1

himalaya

CLI to manage emails
Rust
2,976
star
2

react-pin-field

📟 React component for entering PIN codes.
TypeScript
358
star
3

kronos.vim

A simple task and time manager. Project moved here:
Vim Script
200
star
4

unfog

⏱ Minimalist CLI task & time manager, written in Haskell.
Haskell
172
star
5

keepeye.vim

A Vim plugin to keep your eyes safe.
Vim Script
97
star
6

unfog.vim

⏱ Vim plugin for Unfog CLI task & time manager.
Vim Script
69
star
7

phonetics.vim

A vim plugin for checking and listening to English phonetics.
Vim Script
17
star
8

kronos

A synchronized cross-platform task and time manager.
17
star
9

react-captain

⚓ A collection of strongly typed React hooks and contexts.
TypeScript
16
star
10

comodoro

CLI to manage your time using the Pomodoro technique.
Rust
15
star
11

pin-field

📟 Native web component for entering PIN codes.
TypeScript
8
star
12

dvorak-alt-intl

The dvorak alternative international no dead keys layout exported from linux to mac and windows
8
star
13

c-map

A simple key-val array written in C
C
7
star
14

bufmark.vim

A buffer bookmark manager.
Vim Script
5
star
15

autosess.vim

An automatic vim sessions and view manager.
Vim Script
5
star
16

himalaya.vim

📫 Vim plugin for Himalaya CLI email client.
Vim Script
4
star
17

typescript.vim

Ts(x) files syntax and indent support for Vim.
Vim Script
4
star
18

dotfiles

🏠 Personal configuration managed by NixOS
Nix
4
star
19

catalyx

⚗️ Collection of native Web Components.
TypeScript
3
star
20

factae

💰 A simple billing tool for micro-enterprises
JavaScript
3
star
21

attestation-deplacement-derogatoire

Application mobile de génération d'attestation de déplacement dérogatoire.
TypeScript
3
star
22

kronos.server

A realtime server for Kronos protocol.
TypeScript
3
star
23

kvothe

The composer assistant
JavaScript
2
star
24

c-server

A simple Unix Web server written in C
C
2
star
25

soywod

Personal website.
TypeScript
2
star
26

cardamom

📇 Simple CLI to synchronize and query contacts from CardDAV servers
Rust
2
star
27

croplet

Rust
1
star
28

file64

A base64 file converter in Golang.
Go
1
star
29

mml

CLI to deal with Emacs MIME message Meta Language (MML).
Rust
1
star
30

advent-of-code-2021

Rust
1
star
31

react-use-bireducer

React hook for managing effectful reducers.
TypeScript
1
star
32

himalaya-repl

REPL to manage emails
Nix
1
star