Browse Source

docs/meli.7: complete guide document

137-memory-eating
Manos Pitsidianakis 3 weeks ago
parent
commit
7c7115427d
  1. 22
      README.md
  2. 73
      build.rs
  3. 2
      docs/meli.1
  4. 430
      docs/meli.7
  5. 16
      src/main.rs

22
README.md

@ -24,11 +24,13 @@ Official mirrors:
## Documentation
See also [Quickstart tutorial](https://meli.delivery/documentation.html#quick-start).
See a comprehensive tour of `meli` in the manual page [`meli(7)`](./docs/meli.7).
After installing meli, see `meli(1)`, `meli.conf(5)` and `meli-themes(5)` for documentation. Sample configuration and theme files can be found in the `docs/samples/` subdirectory. Manual pages are also [hosted online](https://meli.delivery/documentation.html "meli documentation").
See also the [Quickstart tutorial](https://meli.delivery/documentation.html#quick-start) online.
meli by default looks for a configuration file in this location: `$XDG_CONFIG_HOME/meli/config.toml`
After installing `meli`, see `meli(1)`, `meli.conf(5)`, `meli(7)` and `meli-themes(5)` for documentation. Sample configuration and theme files can be found in the `docs/samples/` subdirectory. Manual pages are also [hosted online](https://meli.delivery/documentation.html "meli documentation").
`meli` by default looks for a configuration file in this location: `$XDG_CONFIG_HOME/meli/config.toml`
You can run meli with arbitrary configuration files by setting the `$MELI_CONFIG`
environment variable to their locations, i.e.:
@ -46,12 +48,12 @@ For a quick start, build and install locally:
Available subcommands for `make` are listed with `make help`. The Makefile *should* be POSIX portable and not require a specific `make` version.
meli requires rust 1.39 and rust's package manager, Cargo. Information on how
`meli` requires rust 1.39 and rust's package manager, Cargo. Information on how
to get it on your system can be found here: <https://doc.rust-lang.org/cargo/getting-started/installation.html>
With Cargo available, the project can be built with `make` and the resulting binary will then be found under `target/release/meli`. Run `make install` to install the binary and man pages. This requires root, so I suggest you override the default paths and install it in your `$HOME`: `make PREFIX=$HOME/.local install`.
You can build and run meli with one command: `cargo run --release`.
You can build and run `meli` with one command: `cargo run --release`.
### Build features
@ -63,8 +65,8 @@ Some functionality is held behind "feature gates", or compile-time flags. The fo
- `jmap` provides support for connecting to a jmap server and use it as a mail backend (off by default)
- `sqlite3` provides support for builting fast search indexes in local sqlite3 databases (on by default)
- `cli-docs` includes the manpage documentation compiled by either `mandoc` or `man` binary to plain text in `meli`'s command line. Embedded documentation can be viewed with the subcommand `meli man [PAGE]`
- `svgscreenshot` provides support for taking screenshots of the current view of meli and saving it as SVG files. Its only purpose is taking screenshots for the official meli webpage. (off by default)
- `debug-tracing` enables various trace debug logs from various places around the meli code base. The trace log is printed in `stderr`. (off by default)
- `svgscreenshot` provides support for taking screenshots of the current view of `meli` and saving it as SVG files. Its only purpose is taking screenshots for the official `meli` webpage. (off by default)
- `debug-tracing` enables various trace debug logs from various places around the `meli` code base. The trace log is printed in `stderr`. (off by default)
### Build Debian package (*deb*)
@ -75,11 +77,11 @@ A `*.deb` package can be built with `make deb-dist`
### Using notmuch
To use the optional notmuch backend feature, you must have `libnotmuch5` installed in your system. In Debian-like systems, install the `libnotmuch5` packages. meli detects the library's presence on runtime.
To use the optional notmuch backend feature, you must have `libnotmuch5` installed in your system. In Debian-like systems, install the `libnotmuch5` packages. `meli` detects the library's presence on runtime.
### Using GPG
To use the optional gpg feature, you must have `libgpgme` installed in your system. In Debian-like systems, install the `libgpgme11` package. meli detects the library's presence on runtime.
To use the optional gpg feature, you must have `libgpgme` installed in your system. In Debian-like systems, install the `libgpgme11` package. `meli` detects the library's presence on runtime.
### Building with JMAP
@ -102,7 +104,7 @@ cargo run
There is a debug/tracing log feature that can be enabled by using the flag
`--feature debug-tracing` after uncommenting the features in `Cargo.toml`. The logs
are printed in stderr, thus you can run meli with a redirection (i.e `2> log`)
are printed in stderr, thus you can run `meli` with a redirection (i.e `2> log`)
Code style follows the default rustfmt profile.

73
build.rs

@ -45,62 +45,31 @@ fn main() {
use std::io::prelude::*;
use std::path::Path;
use std::process::Command;
let out_dir = env::var("OUT_DIR").unwrap();
let mut out_dir_path = Path::new(&out_dir).to_path_buf();
out_dir_path.push("meli.txt.gz");
let output = Command::new("mandoc")
.args(MANDOC_OPTS)
.arg("docs/meli.1")
.output()
.or_else(|_| Command::new("man").arg("-l").arg("docs/meli.1").output())
.unwrap();
let file = File::create(&out_dir_path).unwrap();
let mut gz = GzBuilder::new()
.comment(output.stdout.len().to_string().into_bytes())
.write(file, Compression::default());
gz.write_all(&output.stdout).unwrap();
gz.finish().unwrap();
out_dir_path.pop();
let mut cl = |filepath: &str, output: &str| {
out_dir_path.push(output);
let output = Command::new("mandoc")
.args(MANDOC_OPTS)
.arg(filepath)
.output()
.or_else(|_| Command::new("man").arg("-l").arg(filepath).output())
.unwrap();
out_dir_path.push("meli.conf.txt.gz");
let output = Command::new("mandoc")
.args(MANDOC_OPTS)
.arg("docs/meli.conf.5")
.output()
.or_else(|_| {
Command::new("man")
.arg("-l")
.arg("docs/meli.conf.5")
.output()
})
.unwrap();
let file = File::create(&out_dir_path).unwrap();
let mut gz = GzBuilder::new()
.comment(output.stdout.len().to_string().into_bytes())
.write(file, Compression::default());
gz.write_all(&output.stdout).unwrap();
gz.finish().unwrap();
out_dir_path.pop();
let file = File::create(&out_dir_path).unwrap();
let mut gz = GzBuilder::new()
.comment(output.stdout.len().to_string().into_bytes())
.write(file, Compression::default());
gz.write_all(&output.stdout).unwrap();
gz.finish().unwrap();
out_dir_path.pop();
};
out_dir_path.push("meli-themes.txt.gz");
let output = Command::new("mandoc")
.args(MANDOC_OPTS)
.arg("docs/meli-themes.5")
.output()
.or_else(|_| {
Command::new("man")
.arg("-l")
.arg("docs/meli-themes.5")
.output()
})
.unwrap();
let file = File::create(&out_dir_path).unwrap();
let mut gz = GzBuilder::new()
.comment(output.stdout.len().to_string().into_bytes())
.write(file, Compression::default());
gz.write_all(&output.stdout).unwrap();
gz.finish().unwrap();
cl("docs/meli.1", "meli.txt.gz");
cl("docs/meli.conf.5", "meli.conf.txt.gz");
cl("docs/meli-themes.5", "meli-themes.txt.gz");
cl("docs/meli.7", "meli.7.txt.gz");
}
}

2
docs/meli.1

@ -262,7 +262,7 @@ and
.Ic colors
and
.Ic ignore_tags
for how to set tag colors and tag visiblity)
for how to set tag colors and tag visibility)
.Sh COMPOSING
.Ss Opening the message Composer tab
To create a new mail message, press

430
docs/meli.7

@ -40,10 +40,9 @@
.Pc Ns
..
.de Command
.Bd -ragged
.Bd -offset 1n -ragged
.Cm \\$*
.Ed
.sp
..
.Dd September 4, 2022
.Dt MELI 7
@ -72,7 +71,16 @@ is a terminal mail client aiming for extensive and user-frendly configurability.
^^ (`-=-=-=-=-`)
`-=-=-=-=-` ^^
.Ed
.Sh STARTING WITH meli
.Sh INTRODUCTION
To quit
.Nm
press
.Shortcut q general quit
at any time.
To go to the next tab on the right, press
.ShortcutPeriod T general next_tab
\&.
.Pp
When launched for the first time,
.Nm
will search for its configuration directory,
@ -164,6 +172,42 @@ It is exited with the
.Aq Esc
key.
.El
.Sh ACTIVE SHORTCUTS POPUP
By pressing
.Shortcut \&? general toggle_help
at any time, the shortcuts popup display status gets toggled.
You can find all valid shortcuts for the current UI state you are in.
.Bd -literal -offset center
β”Œβ”€shortcuts──Press ? to close────────────────────────────────┐
β”‚ β–€β”‚
β”‚ use COMMAND "search" to find shortcuts β–ˆβ”‚
β”‚ Use Up, Down, Left, Right to scroll. β–ˆβ”‚
β”‚ β–ˆβ”‚
β”‚ pager β–ˆβ”‚
β”‚ β–ˆβ”‚
β”‚ PageDown page_down β–ˆβ”‚
β”‚ PageUp page_up β”‚
β”‚ j scroll_down β”‚
β”‚ k scroll_up β”‚
β”‚ β”‚
β”‚ view mail β”‚
β”‚ β”‚
β”‚ c add_addresses_to_contacts β”‚
β”‚ e edit β”‚
β”‚ u toggle_url_mode β”‚
β”‚ a open_attachment β”‚
β”‚ m open_mailcap β”‚
β”‚ R reply β”‚
β”‚ C-r reply_to_author β”‚
β”‚ C-g reply_to_all β”‚
β”‚ C-f forward β”‚
β”‚ M-r view_raw_source β”‚
β”‚ h toggle_expand_headers β–„β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
.Ed
.Bd -ragged -offset 3n
.Em Shows\ active\ shortcuts\ in\ order\ of\ the\ widget\ hierarchy\&.
.Ed
.Sh MAIN VIEW
.Bd -literal -offset center
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
@ -237,9 +281,7 @@ Entering an account name will show you a page with details about the account and
.Pp
While focused in the sidebar, you can
.Dq collapse
a mailbox tree, if it has children, and you can
.Dq uncollapse
it with
a mailbox tree, if it has children, and you can open it with
.ShortcutPeriod Space listing toggle_mailbox_collapse
\&.
You can have mailbox trees collapsed on startup by default by setting a mailbox's
@ -278,7 +320,8 @@ with lots of e-mails.
β”ˆβ”ˆβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
.Ed
.Pp
Some commands may accept a number qualifier.
Some commands may accept a number modifier.
.Tg number-modifier
For example, scroll down commands can receive a multiplier
.Em n
to scroll down
@ -295,39 +338,289 @@ mode will populate this buffer.
To erase it, press the
.Aq Esc
key.
.Sh ACTIVE SHORTCUTS POPUP
.Sh MAIL LIST
There are four different list styles:
.Bl -hyphen -compact
.It
.Qq plain
which shows one line per e-mail.
.It
.Qq threaded
which shows a threaded view with drawn tree structure.
.It
.Qq compact
which shows one line per thread which can include multiple e-mails.
.It
.Qq conversations
which shows more than one line per thread which can include multiple e-mails with more details about the thread.
.El
.Bd -ragged
.Sy Plain view\&.
.Ed
.Bd -literal -offset center
β”Œβ”€shortcuts──Press ? to close────────────────────────────────┐
β”‚ β–€β”‚
β”‚ use COMMAND "search" to find shortcuts β–ˆβ”‚
β”‚ Use Up, Down, Left, Right to scroll. β–ˆβ”‚
β”‚ β–ˆβ”‚
β”‚ pager β–ˆβ”‚
β”‚ β–ˆβ”‚
β”‚ PageDown page_down β–ˆβ”‚
β”‚ PageUp page_up β”‚
β”‚ j scroll_down β”‚
β”‚ k scroll_up β”‚
β”‚42 Fri, 02 Sep 2022 19:51 xxxxxxxxxxxxx < [PATCH 3/8] β”‚
β”‚43 Fri, 02 Sep 2022 19:51 xxxxxxxxxxxxx < [PATCH 2/8] β”‚
β”‚44 Fri, 02 Sep 2022 19:51 xxxxxxxxxxxxx < [PATCH 1/8] β”‚
|45 Fri, 02 Sep 2022 19:51 xxxxxxxxxxxxx < [PATCH 0/8] |
β”‚46 Fri, 02 Sep 2022 18:18 xxxxxxxx <xxxxx Re: [PATCH 3β”‚
.Ed
.Bd -ragged
.Sy Threaded view\&.
.Ed
.Bd -literal -offset center
β”‚12 9 hours ago xxxxxxxxxxxxxxx [PATCH v3 0β”‚
β”‚13 9 hours ago xxxxxxxxxxxxxxx β”œβ”€>[PATCH β”‚
β”‚14 9 hours ago xxxxxxxxxxxxxxx β”œβ”€>[PATCH β”‚
|15 9 hours ago xxxxxxxxxxxxxxx β”œβ”€>[PATCH |
β”‚16 9 hours ago xxxxxxxxxxxxxxx β”œβ”€>[PATCH β”‚
β”‚17 9 hours ago xxxxxxxxxxxxxxx └─>[PATCH β”‚
β”‚18 2022-08-23 01:23:51 xxxxxxxxxxxxxxx [RFC v4 00/β”‚
β”‚19 2022-08-23 01:23:52 xxxxxxxxxxxxxxx β”œβ”€>[RFC v4β”‚
|20 2022-08-30 10:30:16 xxxxxxxxxxxxxxx β”‚ └─> |
β”‚21 6 days ago xxxxxxxxxxxxxxx β”‚ └─> β”‚
β”‚22 2022-08-23 01:23:53 xxxxxxxxxxxxxxx β”œβ”€>[RFC v4β”‚
.Ed
.Bd -ragged
.Sy Compact view\&.
.Ed
.Bd -literal -offset center
β”‚18 2022-…:38 xxxxxxxxxxxxxxx [PATCH v3 3/3] u…_l() (2) β”‚
|19 2022-…:49 xxxxxxxxxxxxxxx [PATCH v8 0/7] A…e (3) |
β”‚20 2022-…:10 xxxxxxxxxxxxxxx [PATCH v8 2/7] f…s (2) β”‚
β”‚21 2022-…:38 xxxxxxxxxxxxxxx [PATCH v8 3/7] b…s (2) β”‚
β”‚22 2022-…:53 xxxxxxxxxxxxxxx [PATCH v6 00/10] p…g (31) β”‚
.Ed
.Bd -ragged
.Sy Conversations view\&.
.Ed
.Bd -literal -offset center
β”‚[PATCH v2] xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (5) β”‚
|1 day ago▁▁▁▁xxxxxxxxxxxxx <xxxxxxxxxxxxx@xxxxxxxxxx>, xxxxxβ”‚
β”‚ |
β”‚[PATCH v2 0/8] xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxβ”‚
β”‚1 day ago▁▁▁▁xxxxxxxxxxxxxxx <xxxxxxxxxx@xxxxxxxxxxxxxx>, xxβ”‚
| β”‚
β”‚[PATCH 0/2] xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (4) |
β”‚2 days ago▁▁▁▁xxxxxxxxxxxxxxxx <xxxxxxxx@xxxxxxxxxxx>, xxxxxβ”‚
β”‚ β”‚
β”‚ view mail β”‚
β”‚[PATCH 0/8] xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (12) β”‚
β”‚2 days ago▁▁▁▁xxxxxxxxxxxxx <xxxxxxxx@xxxxxxxxxx>, xxxxxxxxxβ”‚
.Ed
.sp
.sp
.Sy Performing actions on entries and/or selections\&.
.Pp
Press
.Shortcut v listing select_entry
to toggle the selection of a single entry.
.Qq select_entry
can be prefixed by a number modifier and affixed by a scrolling motion (up or down) to select multiple entries.
.Tg number-modifier
Simple set operations can be performed on a selection with these shortcut modifiers:
.sp
.Bl -hyphen -compact
.It
Union modifier:
.Shortcut Ctrl-u listing union_modifier
.It
Difference modifier:
.Shortcut Ctrl-d listing diff_modifier
.It
Intersection modifier:
.Shortcut Ctrl-i listing intersection_modifier
.El
.Pp
To set an entry as
.Qq read
\&, use the
.Shortcut n listing set_seen
shortcut.
To set an entry as
.Qq unread
\&, use the command
.Command set unseen
.sp
which also has its complement
.Command set seen
.sp
action.
.Pp
For e-mail backends that support tags
.Po
like
.Qq IMAP
or
.Qq notmuch Ns
.Pc
you can use the following commands on entries and selections to modify them:
.Command tag add TAG
.Command tag remove TAG
.sp
(see
.Xr meli.conf 5 TAGS Ns
, settings
.Ic colors
and
.Ic ignore_tags
for how to set tag colors and tag visibility)
.Sh PAGER
You can open an e-mail entry by pressing
.ShortcutPeriod Enter listing open_entry
\&. This brings up the e-mail view with the e-mail content inside a pager.
.Bd -literal -offset center
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚Date: Sat, 21 May 2022 16:16:11 +0300 β–€β”‚
β”‚From: Narrator <narrator@example.com> β–ˆβ”‚
β”‚To: Stanley <427@example.com> β–ˆβ”‚
β”‚Subject: The e-mail ending β–ˆβ”‚
β”‚Message-ID: <gambheerata@example.com> β–ˆβ”‚
β”‚ β–ˆβ”‚
β”‚The story, and the choices, or what have you, and thereforeβ–ˆβ”‚
β”‚by becoming it is! So on and so forth, until inevitably, we β”‚
β”‚all until the end of time. At which time, everything all at β”‚
β”‚once, so now you see? Blah, blah, blah, rah, rah, rah... β”‚
β”‚We've eaten too much and it can't be just yet. No, no! β”‚
β”‚Until two-hundred and forty-five! But the logic of β”‚
β”‚elimination, working backwards, the deduction therefore β”‚
β”‚becomes impossible to manufacture. It went on for nearly β”‚
β”‚ten thousand years, until just yesterday. Here and there, β”‚
β”‚forward and back, and never a moment before lunchtime. It β”‚
β”‚can't be! It's the only thing there is! How many billions β”‚
β”‚left until so much more than forever ago! Which is why I β”‚
β”‚say: β”‚
β”‚ β”‚
β”‚ c add_addresses_to_contacts β”‚
β”‚ e edit β”‚
β”‚ u toggle_url_mode β”‚
β”‚ a open_attachment β”‚
β”‚ m open_mailcap β”‚
β”‚ R reply β”‚
β”‚ C-r reply_to_author β”‚
β”‚ C-g reply_to_all β”‚
β”‚ C-f forward β”‚
β”‚ M-r view_raw_source β”‚
β”‚ h toggle_expand_headers β–„β”‚
β”‚The story, and the choices, or what have you, and therefore β”‚
β”‚by becoming it is! So on and so forth, until inevitably, weβ–„β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
.Ed
.Bd -ragged -offset 3n
.Em Shows\ active\ shortcuts\ in\ order\ of\ the\ widget\ hierarchy\&.
.Em The\ pager\ displaying\ an\ e-mail\&.
.Ed
.Pp
The pager is simple to use.
Scroll with the following:
.Bl -hang -width 27n
.It Go to next pager page
.Shortcut PageDown pager page_down
.It Go to previous pager page
.Shortcut PageUp pager page_up
.It Scroll down pager.
.Shortcut j pager scroll_down
.It Scroll up pager.
.Shortcut k pager scroll_up
.El
.sp
All scrolling shortcuts can be prefixed with a number modifier
.Tg number-modifier
which will act as a multiplier.
.Pp
The pager can enter a special
.Em url
mode which will prefix all detected hyperlinks and e-mail addresses with a number inside square brackets
.ShortcutPeriod u pager toggle_url_mode
\&.
Writing down a chosen number as a number modifier
.Tg number-modifier
and pressing
.Shortcut g envelope_view go_to_url
will attempt to open the link with the system's default open command
.Po
.Xr xdg-open 1
in supported OSes,
and
.Xr open 1
on MacOS
.Pc Ns
\&.
To override with a custom launcher, see
.Qo
.Li pager
.Qc
configuration setting
.Qo
.Li url_launcher
.Qc
.Po
see
.Xr meli.conf 5 PAGER
for more details
.Pc Ns
\&.
.Sh MAIL VIEW
Other things you can do when viewing e-mail:
.Bl -bullet -compact
.It
Most importantly, you can exit the mail view with:
.Shortcut i listing exit_entry
.It
Add addresses from the e-mail headers to contacts:
.Shortcut c envelope_view add_addresses_to_contacts
.It
Open an attachment by entering its index as a number modifier and pressing:
.Tg number-modifier
.Shortcut a envelope_view open_attachment
.It
Open an attachment by its
.Xr mailcap 4
entry by entering its index as a number modifier and pressing:
.Shortcut m envelope_view open_mailcap
.It
Reply to envelope:
.Shortcut R envelope_view reply
.It
Reply to author:
.Shortcut Ctrl-r envelope_view reply_to_author
.It
Reply to all/Reply to list/Follow up:
.Shortcut Ctrl-g envelope_view reply_to_all
.It
Forward email:
.Shortcut Ctrl-f envelope_view forward
.It
Expand extra headers: (References and others)
.Shortcut h envelope_view toggle_expand_headerk
.It
View envelope source in a pager: (toggles between raw and decoded source)
.Shortcut M-r envelope_view view_raw_source
.It
Return to envelope_view if viewing raw source or attachment:
.Shortcut r envelope_view return_to_normal_view
.El
.Sh COMPOSING
To compose an e-mail, you can either start with an empty draft by pressing
.Shortcut m listing new_mail
which opens a composer view in a new tab.
To reply to a specific e-mail, when in envelope view you can select the specific action you want to take:
.sp
.Bl -bullet -compact
.It
Reply to envelope.
.Shortcut R envelope_view reply
.It
Reply to author.
.Shortcut Ctrl-r envelope_view reply_to_author
.It
Reply to all.
.Shortcut Ctrl-g envelope_view reply_to_all
.El
.sp
To launch your editor, press
.ShortcutPeriod e composing edit_mail
\&.
To send your draft, press
.ShortcutPeriod s composing send_mail
\&.
To save the draft without submission, enter the command
.Command close
.sp
and select
.Qq save as draft Ns
\&.
You can return to the draft by going to your
.Qq Drafts
mailbox and selecting
.ShortcutPeriod e envelope_view edit_mail
\&.
.Bd -literal -offset center
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ mail▐ contact list ▐ composing β–β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ”‚
@ -389,39 +682,48 @@ If you enable the embed terminal option, you can launch your terminal editor of
.Bf -emphasis
.Xr neovim 1 Ns
\ running\ inside\ the\ composing\ tab\&.
The\ double\ line\ border\ annotates\ the\ area\ of\ the\ embedded\ terminal,\ the\ actual\ embedding\ is\ seamless\&.
.Ef
The\ double\ line\ border\ annotates\ the\ area\ of\ the\ embedded\ terminal,
the\ actual\ embedding\ is\ seamless\&.
.Ed
.Sh PAGER
.Bd -literal -offset center
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚Date: Sat, 21 May 2022 16:16:11 +0300 β–€β”‚
β”‚From: Narrator <narrator@example.com> β–ˆβ”‚
β”‚To: Stanley <427@example.com> β–ˆβ”‚
β”‚Subject: The e-mail ending β–ˆβ”‚
β”‚Message-ID: <gambheerata@example.com> β–ˆβ”‚
β”‚ β–ˆβ”‚
β”‚The story, and the choices, or what have you, and thereforeβ–ˆβ”‚
β”‚by becoming it is! So on and so forth, until inevitably, we β”‚
β”‚all until the end of time. At which time, everything all at β”‚
β”‚once, so now you see? Blah, blah, blah, rah, rah, rah... β”‚
β”‚We've eaten too much and it can't be just yet. No, no! β”‚
β”‚Until two-hundred and forty-five! But the logic of β”‚
β”‚elimination, working backwards, the deduction therefore β”‚
β”‚becomes impossible to manufacture. It went on for nearly β”‚
β”‚ten thousand years, until just yesterday. Here and there, β”‚
β”‚forward and back, and never a moment before lunchtime. It β”‚
β”‚can't be! It's the only thing there is! How many billions β”‚
β”‚left until so much more than forever ago! Which is why I β”‚
β”‚say: β”‚
β”‚ β”‚
β”‚The story, and the choices, or what have you, and therefore β”‚
β”‚by becoming it is! So on and so forth, until inevitably, weβ–„β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
.Ed
.Bd -ragged -offset 3n
.Em The pager displaying an e-mail\&.
.Ed
.Ss composing mail commands
.Bl -tag -width 36n
.It Cm add-attachment Ar PATH
in composer, add
.Ar PATH
as an attachment
.It Cm add-attachment < Ar CMD Ar ARGS
in composer, pipe
.Ar CMD Ar ARGS
output into an attachment
.It Cm add-attachment-file-picker
Launch command defined in the configuration value
.Ic file_picker_command
in
.Xr meli.conf 5 TERMINAL
.It Cm add-attachment-file-picker < Ar CMD Ar ARGS
Launch command
.Ar CMD Ar ARGS Ns
\&.
The command should print file paths in stderr, separated by NULL bytes.
.It Cm remove-attachment Ar INDEX
remove attachment with given index
.It Cm toggle sign
toggle between signing and not signing this message.
If the gpg invocation fails then the mail won't be sent.
See
.Xr meli.conf 5 PGP
for PGP configuration.
.It Cm save-draft
saves a copy of the draft in the Draft folder
.El
.\" TODO add contacts section
.Sh THEMES
See
.Xr meli-themes 5
for documentation on how to theme
.Nm Ns
\&.
.Sh SEE ALSO
.Xr meli 1 ,
.Xr meli.conf 5 ,
@ -436,3 +738,5 @@ This software carries no warranty of any kind.
(See COPYING for full copyright and warranty notices.)
.Pp
.Lk https://meli.delivery
.Lk https://github.com/meli/meli
.Lk https://crates.io/crates/meli

16
src/main.rs

@ -74,9 +74,10 @@ fn notify(
#[cfg(feature = "cli-docs")]
fn parse_manpage(src: &str) -> Result<ManPages> {
match src {
"" | "meli" | "main" => Ok(ManPages::Main),
"meli.conf" | "conf" | "config" | "configuration" => Ok(ManPages::Conf),
"meli-themes" | "themes" | "theming" | "theme" => Ok(ManPages::Themes),
"" | "meli" | "meli.1" | "main" => Ok(ManPages::Main),
"meli.7" | "guide" => Ok(ManPages::Guide),
"meli.conf" | "meli.conf.5" | "conf" | "config" | "configuration" => Ok(ManPages::Conf),
"meli-themes" | "meli-themes.5" | "themes" | "theming" | "theme" => Ok(ManPages::Themes),
_ => Err(MeliError::new(format!(
"Invalid documentation page: {}",
src
@ -94,6 +95,8 @@ enum ManPages {
Conf = 1,
/// meli-themes(5)
Themes = 2,
/// meli(7)
Guide = 3,
}
#[derive(Debug, StructOpt)]
@ -143,7 +146,7 @@ enum SubCommand {
#[derive(Debug, StructOpt)]
struct ManOpt {
#[structopt(default_value = "meli", possible_values=&["meli", "conf", "themes"], value_name="PAGE", parse(try_from_str = parse_manpage))]
#[structopt(default_value = "meli", possible_values=&["meli", "conf", "themes", "meli.7", "guide"], value_name="PAGE", parse(try_from_str = parse_manpage))]
#[cfg(feature = "cli-docs")]
page: ManPages,
/// If true, output text in stdout instead of spawning $PAGER.
@ -196,10 +199,11 @@ fn run_app(opt: Opt) -> Result<()> {
#[cfg(feature = "cli-docs")]
Some(SubCommand::Man(manopt)) => {
let ManOpt { page, no_raw } = manopt;
const MANPAGES: [&[u8]; 3] = [
const MANPAGES: [&[u8]; 4] = [
include_bytes!(concat!(env!("OUT_DIR"), "/meli.txt.gz")),
include_bytes!(concat!(env!("OUT_DIR"), "/meli.conf.txt.gz")),
include_bytes!(concat!(env!("OUT_DIR"), "/meli-themes.txt.gz")),
include_bytes!(concat!(env!("OUT_DIR"), "/meli.7.txt.gz")),
];
use flate2::bufread::GzDecoder;
use std::io::prelude::*;
@ -242,7 +246,7 @@ fn run_app(opt: Opt) -> Result<()> {
}
#[cfg(not(feature = "cli-docs"))]
Some(SubCommand::Man(_manopt)) => {
return Err(MeliError::new("error: this version of meli was not build with embedded documentation. You might have it installed as manpages (eg `man meli`), otherwise check https://meli.delivery"));
return Err(MeliError::new("error: this version of meli was not build with embedded documentation (cargo feature `cli-docs`). You might have it installed as manpages (eg `man meli`), otherwise check https://meli.delivery"));
}
Some(SubCommand::CompiledWith) => {
#[cfg(feature = "notmuch")]

Loading…
Cancel
Save