1723 lines
54 KiB
Org Mode
1723 lines
54 KiB
Org Mode
#+TITLE: Mail Configuration
|
||
#+SETUPFILE: ./setup/org-setup-file.org
|
||
|
||
Installation:
|
||
#+begin_src bash :tangle no
|
||
paru -S mbsync msmtp neomutt lynx urlview
|
||
#+end_src
|
||
|
||
* Claude Code — Email Assistant
|
||
#+begin_src markdown :tangle ~/.config/neomutt/CLAUDE.md :comments none :mkdirp yes
|
||
# Email Refinement Assistant
|
||
|
||
You are helping refine professional emails composed in Neomutt.
|
||
The file you receive is a raw email in RFC 2822 format: a header block
|
||
(lines like `From:`, `To:`, `Subject:`, `Cc:`) followed by a blank line,
|
||
then the body text.
|
||
|
||
## Your task
|
||
|
||
When asked to "refine" (or similar), edit the file directly so that a diff
|
||
can be reviewed. Apply all of the following:
|
||
|
||
- **Subject**: if it starts with `Re:`, this is a reply — do not change it; otherwise make it specific, informative and professional (avoid vague subjects like "Question" or "Update")
|
||
- **Grammar & spelling**: fix all errors
|
||
- **Clarity**: remove ambiguity; one idea per sentence
|
||
- **Conciseness**: cut filler words, redundant phrases and unnecessary
|
||
preamble; get to the point quickly
|
||
- **Tone**: professional but natural; avoid overly formal or stiff language
|
||
- **Structure**: ensure a proper greeting, clear body paragraphs and a
|
||
polite closing
|
||
- **Signature**: do not modify anything from the `-- ` line onwards (dash dash space — the trailing space is required by RFC 3676 and must not be removed)
|
||
- **Line breaks**: write one sentence per line in the body
|
||
|
||
## Constraints
|
||
|
||
- Preserve the header block exactly (do not reorder or remove headers),
|
||
only edit the `Subject:` value, and of course the main code text
|
||
- **Single edit**: you MUST apply every change (subject, grammar, tone, structure) in one single call to the file edit tool — do not make multiple sequential edits
|
||
- Do not invent facts or add content that was not implied by the original
|
||
- Preserve the author's intent and voice
|
||
#+end_src
|
||
|
||
* =mbsync= - Synchronize Mailboxes
|
||
:PROPERTIES:
|
||
:header-args:conf: :tangle ~/.config/isync/mbsyncrc
|
||
:header-args:conf+: :comments both :mkdirp yes
|
||
:CUSTOM_ID: mbsync
|
||
:END:
|
||
http://isync.sourceforge.net/
|
||
|
||
** Global Defaults
|
||
#+BEGIN_SRC conf
|
||
# Automatically create missing mailboxes, both locally and on the server
|
||
Create Both
|
||
# Save the synchronization state files in the relevant directory
|
||
SyncState *
|
||
# Permanently remove all messages [on the Far/Near] marked for deletion.
|
||
Expunge Both
|
||
#+END_SRC
|
||
|
||
** Gmail Account
|
||
#+BEGIN_SRC conf
|
||
IMAPAccount gmail
|
||
Host imap.gmail.com
|
||
User dehaeze.thomas@gmail.com
|
||
PassCmd "pass email/dehaeze.thomas@gmail.com"
|
||
TLSType IMAPS
|
||
AuthMechs LOGIN
|
||
CertificateFile /etc/ssl/certs/ca-certificates.crt
|
||
#+END_SRC
|
||
|
||
#+BEGIN_SRC conf
|
||
IMAPStore gmail-remote
|
||
Account gmail
|
||
|
||
MaildirStore gmail-local
|
||
Path ~/.local/share/mails/gmail/
|
||
Inbox ~/.local/share/mails/gmail/Inbox
|
||
|
||
Channel gmail-Home
|
||
Far :gmail-remote:INBOX
|
||
Near :gmail-local:Inbox
|
||
|
||
Channel gmail-Drafts
|
||
Far :gmail-remote:"[Gmail]/Drafts"
|
||
Near :gmail-local:Drafts
|
||
|
||
Channel gmail-Sent
|
||
Far :gmail-remote:"[Gmail]/Sent Mail"
|
||
Near :gmail-local:Sent
|
||
|
||
Channel gmail-Trash
|
||
Far :gmail-remote:"[Gmail]/Trash"
|
||
Near :gmail-local:Trash
|
||
|
||
Channel gmail-Archive
|
||
Far :gmail-remote:"[Imap]/Archive"
|
||
Near :gmail-local:Archive
|
||
#+END_SRC
|
||
|
||
#+BEGIN_SRC conf
|
||
# Catch-all for everything else: note that the `Patterns` have to exclude both
|
||
# the remote and local names for all the folders we want to exclude (except
|
||
# "INBOX", which is special-cased, it would seem).
|
||
Channel gmail
|
||
Far :gmail-remote:
|
||
Near :gmail-local:
|
||
# Exclude everything under the internal [Gmail] folder, except the interesting folders
|
||
Patterns *
|
||
Patterns !INBOX
|
||
Patterns ![Gmail]*
|
||
Patterns !Drafts
|
||
Patterns !Sent Mail
|
||
Patterns !Trash
|
||
# Patterns ![Imap]/Archive
|
||
#+END_SRC
|
||
|
||
#+BEGIN_SRC conf
|
||
# For doing a quick sync of just the INBOX with `mbsync gmail-download`.
|
||
Channel gmail-download
|
||
Far :gmail-remote:INBOX
|
||
Near :gmail-local:Inbox
|
||
Create Near
|
||
Expunge Near
|
||
Sync Pull
|
||
#+END_SRC
|
||
|
||
** ESRF Account
|
||
#+BEGIN_SRC conf
|
||
IMAPAccount esrf
|
||
Host imaps.esrf.fr
|
||
User dehaeze
|
||
PassCmd "pass email/thomas.dehaeze@esrf.fr"
|
||
TLSType IMAPS
|
||
AuthMechs LOGIN
|
||
#+END_SRC
|
||
|
||
#+BEGIN_SRC conf
|
||
IMAPStore esrf-remote
|
||
Account esrf
|
||
|
||
MaildirStore esrf-local
|
||
Path ~/.local/share/mails/esrf/
|
||
Inbox ~/.local/share/mails/esrf/Inbox
|
||
|
||
Channel esrf-Home
|
||
Far :esrf-remote:INBOX
|
||
Near :esrf-local:Inbox
|
||
|
||
Channel esrf-Drafts
|
||
Far :esrf-remote:Drafts
|
||
Near :esrf-local:Drafts
|
||
|
||
Channel esrf-Archive
|
||
Far :esrf-remote:Archive
|
||
Near :esrf-local:Archive
|
||
|
||
Channel esrf-Sent
|
||
Far :esrf-remote:Sent
|
||
Near :esrf-local:Sent
|
||
|
||
Channel esrf-Trash
|
||
Far :esrf-remote:Trash
|
||
Near :esrf-local:Trash
|
||
#+END_SRC
|
||
|
||
#+BEGIN_SRC conf
|
||
Channel esrf
|
||
Far :esrf-remote:
|
||
Near :esrf-local:
|
||
#+END_SRC
|
||
|
||
For doing a quick sync of just the INBOX with =mbsync esrf-download=.
|
||
#+BEGIN_SRC conf
|
||
Channel esrf-download
|
||
Far :esrf-remote:INBOX
|
||
Near :esrf-local:Inbox
|
||
Create Near
|
||
Expunge Near
|
||
Sync Pull
|
||
#+END_SRC
|
||
|
||
* =msmtp= - Send Mails
|
||
:PROPERTIES:
|
||
:header-args:conf: :tangle ~/.config/msmtp/config
|
||
:header-args:conf+: :comments both :mkdirp yes
|
||
:CUSTOM_ID: msmtp
|
||
:END:
|
||
https://marlam.de/msmtp/
|
||
|
||
** Defaults
|
||
#+BEGIN_SRC conf
|
||
defaults
|
||
auth on
|
||
tls on
|
||
tls_certcheck off
|
||
#+END_SRC
|
||
|
||
** Gmail Account
|
||
#+BEGIN_SRC conf
|
||
account gmail
|
||
host smtp.gmail.com
|
||
port 587
|
||
protocol smtp
|
||
from dehaeze.thomas@gmail.com
|
||
user dehaeze.thomas@gmail.com
|
||
passwordeval "pass email/dehaeze.thomas@gmail.com"
|
||
# proxy_host localhost
|
||
# proxy_port 8080
|
||
#+END_SRC
|
||
|
||
** ESRF Account
|
||
#+BEGIN_SRC conf
|
||
account esrf
|
||
host smtps.esrf.fr
|
||
port 465
|
||
protocol smtp
|
||
from thomas.dehaeze@esrf.fr
|
||
user dehaeze
|
||
tls_starttls off
|
||
passwordeval "pass email/thomas.dehaeze@esrf.fr"
|
||
#+END_SRC
|
||
|
||
** Default Account
|
||
#+BEGIN_SRC conf
|
||
account default : esrf
|
||
#+END_SRC
|
||
|
||
* =mu= - Mail Indexer
|
||
:PROPERTIES:
|
||
:header-args:conf: :tangle ~/.config/neomutt/neomuttrc
|
||
:header-args:conf+: :comments both :mkdirp yes
|
||
:CUSTOM_ID: mu
|
||
:END:
|
||
|
||
=Mu= ([[https://github.com/djcb/mu][github]]) it used as a "maildir indexer/searcher".
|
||
Useful commands are described in the [[http://www.djcbsoftware.nl/code/mu/cheatsheet.html][Cheat-sheet]].
|
||
|
||
For instance, to find mails with =pdf= attachments:
|
||
#+begin_src bash :eval no :tangle no
|
||
mu find 'mime:application/pdf'
|
||
#+end_src
|
||
|
||
* =neomutt= - Mail Client
|
||
:PROPERTIES:
|
||
:header-args:conf: :tangle ~/.config/neomutt/neomuttrc
|
||
:header-args:conf+: :comments both :mkdirp yes
|
||
:CUSTOM_ID: neomutt
|
||
:END:
|
||
https://neomutt.org/
|
||
|
||
Documentation:
|
||
#+begin_src bash :results none :exports code :tangle no
|
||
man neomutt
|
||
man neomuttrc
|
||
#+end_src
|
||
|
||
** Bindings
|
||
*** Unding all the key bindings
|
||
#+begin_src conf
|
||
bind generic,pager,editor,index a noop
|
||
bind generic,pager,editor,index b noop
|
||
bind generic,pager,editor,index c noop
|
||
bind generic,pager,editor,index d noop
|
||
bind generic,pager,editor,index e noop
|
||
bind generic,pager,editor,index f noop
|
||
bind generic,pager,editor,index g noop
|
||
bind generic,pager,editor,index h noop
|
||
bind generic,pager,editor,index i noop
|
||
bind generic,pager,editor,index j noop
|
||
bind generic,pager,editor,index k noop
|
||
bind generic,pager,editor,index l noop
|
||
bind generic,pager,editor,index m noop
|
||
bind generic,pager,editor,index n noop
|
||
bind generic,pager,editor,index o noop
|
||
bind generic,pager,editor,index p noop
|
||
bind generic,pager,editor,index q noop
|
||
bind generic,pager,editor,index r noop
|
||
bind generic,pager,editor,index s noop
|
||
bind generic,pager,editor,index t noop
|
||
bind generic,pager,editor,index u noop
|
||
bind generic,pager,editor,index v noop
|
||
bind generic,pager,editor,index w noop
|
||
bind generic,pager,editor,index x noop
|
||
bind generic,pager,editor,index y noop
|
||
bind generic,pager,editor,index z noop
|
||
bind generic,pager,editor,index A noop
|
||
bind generic,pager,editor,index B noop
|
||
bind generic,pager,editor,index C noop
|
||
bind generic,pager,editor,index D noop
|
||
bind generic,pager,editor,index E noop
|
||
bind generic,pager,editor,index F noop
|
||
bind generic,pager,editor,index G noop
|
||
bind generic,pager,editor,index H noop
|
||
bind generic,pager,editor,index I noop
|
||
bind generic,pager,editor,index J noop
|
||
bind generic,pager,editor,index K noop
|
||
bind generic,pager,editor,index L noop
|
||
bind generic,pager,editor,index M noop
|
||
bind generic,pager,editor,index N noop
|
||
bind generic,pager,editor,index O noop
|
||
bind generic,pager,editor,index P noop
|
||
bind generic,pager,editor,index Q noop
|
||
bind generic,pager,editor,index R noop
|
||
bind generic,pager,editor,index S noop
|
||
bind generic,pager,editor,index T noop
|
||
bind generic,pager,editor,index U noop
|
||
bind generic,pager,editor,index V noop
|
||
bind generic,pager,editor,index W noop
|
||
bind generic,pager,editor,index X noop
|
||
bind generic,pager,editor,index Y noop
|
||
bind generic,pager,editor,index Z noop
|
||
|
||
bind generic,pager,editor,index <Tab> noop
|
||
bind generic,pager,editor,index <Space> noop
|
||
bind generic,pager,editor,index <PageUp> noop
|
||
bind generic,pager,editor,index <PageDown> noop
|
||
bind generic,pager,editor,index <Home> noop
|
||
bind generic,pager,editor,index <End> noop
|
||
bind generic,pager,editor,index <Insert> noop
|
||
bind generic,pager,editor,index <Delete> noop
|
||
bind generic,pager,editor,index <Up> noop
|
||
bind generic,pager,editor,index <Down> noop
|
||
bind generic,pager,editor,index <Left> noop
|
||
bind generic,pager,editor,index <Right> noop
|
||
bind generic,pager,editor,index <Enter> noop
|
||
bind generic,pager,editor,index <Return> noop
|
||
|
||
bind generic,pager,editor,index | noop
|
||
|
||
bind generic,pager,editor,index 1 noop
|
||
bind generic,pager,editor,index 2 noop
|
||
bind generic,pager,editor,index 3 noop
|
||
bind generic,pager,editor,index 4 noop
|
||
bind generic,pager,editor,index 5 noop
|
||
bind generic,pager,editor,index 6 noop
|
||
bind generic,pager,editor,index 7 noop
|
||
bind generic,pager,editor,index 8 noop
|
||
bind generic,pager,editor,index 9 noop
|
||
bind generic,pager,editor,index 0 noop
|
||
bind generic,pager,editor,index ! noop
|
||
bind generic,pager,editor,index @ noop
|
||
bind generic,pager,editor,index $ noop
|
||
bind generic,pager,editor,index % noop
|
||
bind generic,pager,editor,index ^ noop
|
||
bind generic,pager,editor,index & noop
|
||
bind generic,pager,editor,index * noop
|
||
bind generic,pager,editor,index ( noop
|
||
bind generic,pager,editor,index ) noop
|
||
|
||
bind generic,pager,editor,index \Ca noop
|
||
bind generic,pager,editor,index \Cb noop
|
||
bind generic,pager,editor,index \Cc noop
|
||
bind generic,pager,editor,index \Cd noop
|
||
bind generic,pager,editor,index \Ce noop
|
||
bind generic,pager,editor,index \Cf noop
|
||
bind generic,pager,editor,index \Cg noop
|
||
bind generic,pager,editor,index \Ch noop
|
||
bind generic,pager,editor,index \Ci noop
|
||
bind generic,pager,editor,index \Cj noop
|
||
bind generic,pager,editor,index \Ck noop
|
||
bind generic,pager,editor,index \Cl noop
|
||
bind generic,pager,editor,index \Cm noop
|
||
bind generic,pager,editor,index \Cn noop
|
||
bind generic,pager,editor,index \Co noop
|
||
bind generic,pager,editor,index \Cp noop
|
||
bind generic,pager,editor,index \Cq noop
|
||
bind generic,pager,editor,index \Cr noop
|
||
bind generic,pager,editor,index \Cs noop
|
||
bind generic,pager,editor,index \Ct noop
|
||
bind generic,pager,editor,index \Cu noop
|
||
bind generic,pager,editor,index \Cv noop
|
||
bind generic,pager,editor,index \Cw noop
|
||
bind generic,pager,editor,index \Cx noop
|
||
bind generic,pager,editor,index \Cy noop
|
||
bind generic,pager,editor,index \Cz noop
|
||
bind generic,pager,editor,index \CA noop
|
||
bind generic,pager,editor,index \CB noop
|
||
bind generic,pager,editor,index \CC noop
|
||
bind generic,pager,editor,index \CD noop
|
||
bind generic,pager,editor,index \CE noop
|
||
bind generic,pager,editor,index \CF noop
|
||
bind generic,pager,editor,index \CG noop
|
||
bind generic,pager,editor,index \CH noop
|
||
bind generic,pager,editor,index \CI noop
|
||
bind generic,pager,editor,index \CJ noop
|
||
bind generic,pager,editor,index \CK noop
|
||
bind generic,pager,editor,index \CL noop
|
||
bind generic,pager,editor,index \CM noop
|
||
bind generic,pager,editor,index \CN noop
|
||
bind generic,pager,editor,index \CO noop
|
||
bind generic,pager,editor,index \CP noop
|
||
bind generic,pager,editor,index \CQ noop
|
||
bind generic,pager,editor,index \CR noop
|
||
bind generic,pager,editor,index \CS noop
|
||
bind generic,pager,editor,index \CT noop
|
||
bind generic,pager,editor,index \CU noop
|
||
bind generic,pager,editor,index \CV noop
|
||
bind generic,pager,editor,index \CW noop
|
||
bind generic,pager,editor,index \CX noop
|
||
bind generic,pager,editor,index \CY noop
|
||
bind generic,pager,editor,index \CZ noop
|
||
|
||
bind generic,pager,editor,index \C<Tab> noop
|
||
bind generic,pager,editor,index \C<Space> noop
|
||
bind generic,pager,editor,index \C<PageUp> noop
|
||
bind generic,pager,editor,index \C<PageDown> noop
|
||
bind generic,pager,editor,index \C<Home> noop
|
||
bind generic,pager,editor,index \C<End> noop
|
||
bind generic,pager,editor,index \C<Insert> noop
|
||
bind generic,pager,editor,index \C<Delete> noop
|
||
bind generic,pager,editor,index \C<Up> noop
|
||
bind generic,pager,editor,index \C<Down> noop
|
||
bind generic,pager,editor,index \C<Left> noop
|
||
bind generic,pager,editor,index \C<Right> noop
|
||
bind generic,pager,editor,index \C<Enter> noop
|
||
bind generic,pager,editor,index \C<Return> noop
|
||
|
||
bind generic,pager,editor,index \C1 noop
|
||
bind generic,pager,editor,index \C2 noop
|
||
bind generic,pager,editor,index \C3 noop
|
||
bind generic,pager,editor,index \C4 noop
|
||
bind generic,pager,editor,index \C5 noop
|
||
bind generic,pager,editor,index \C6 noop
|
||
bind generic,pager,editor,index \C7 noop
|
||
bind generic,pager,editor,index \C8 noop
|
||
bind generic,pager,editor,index \C9 noop
|
||
bind generic,pager,editor,index \C0 noop
|
||
bind generic,pager,editor,index \C! noop
|
||
bind generic,pager,editor,index \C$ noop
|
||
bind generic,pager,editor,index \C% noop
|
||
bind generic,pager,editor,index \C^ noop
|
||
bind generic,pager,editor,index \C& noop
|
||
bind generic,pager,editor,index \C* noop
|
||
bind generic,pager,editor,index \C( noop
|
||
bind generic,pager,editor,index \C) noop
|
||
|
||
bind generic,pager,editor,index <Esc>a noop
|
||
bind generic,pager,editor,index <Esc>b noop
|
||
bind generic,pager,editor,index <Esc>c noop
|
||
bind generic,pager,editor,index <Esc>d noop
|
||
bind generic,pager,editor,index <Esc>e noop
|
||
bind generic,pager,editor,index <Esc>f noop
|
||
bind generic,pager,editor,index <Esc>g noop
|
||
bind generic,pager,editor,index <Esc>h noop
|
||
bind generic,pager,editor,index <Esc>i noop
|
||
bind generic,pager,editor,index <Esc>j noop
|
||
bind generic,pager,editor,index <Esc>k noop
|
||
bind generic,pager,editor,index <Esc>l noop
|
||
bind generic,pager,editor,index <Esc>m noop
|
||
bind generic,pager,editor,index <Esc>n noop
|
||
bind generic,pager,editor,index <Esc>o noop
|
||
bind generic,pager,editor,index <Esc>p noop
|
||
bind generic,pager,editor,index <Esc>q noop
|
||
bind generic,pager,editor,index <Esc>r noop
|
||
bind generic,pager,editor,index <Esc>s noop
|
||
bind generic,pager,editor,index <Esc>t noop
|
||
bind generic,pager,editor,index <Esc>u noop
|
||
bind generic,pager,editor,index <Esc>v noop
|
||
bind generic,pager,editor,index <Esc>w noop
|
||
bind generic,pager,editor,index <Esc>x noop
|
||
bind generic,pager,editor,index <Esc>y noop
|
||
bind generic,pager,editor,index <Esc>z noop
|
||
bind generic,pager,editor,index <Esc>A noop
|
||
bind generic,pager,editor,index <Esc>B noop
|
||
bind generic,pager,editor,index <Esc>C noop
|
||
bind generic,pager,editor,index <Esc>D noop
|
||
bind generic,pager,editor,index <Esc>E noop
|
||
bind generic,pager,editor,index <Esc>F noop
|
||
bind generic,pager,editor,index <Esc>G noop
|
||
bind generic,pager,editor,index <Esc>H noop
|
||
bind generic,pager,editor,index <Esc>I noop
|
||
bind generic,pager,editor,index <Esc>J noop
|
||
bind generic,pager,editor,index <Esc>K noop
|
||
bind generic,pager,editor,index <Esc>L noop
|
||
bind generic,pager,editor,index <Esc>M noop
|
||
bind generic,pager,editor,index <Esc>N noop
|
||
bind generic,pager,editor,index <Esc>O noop
|
||
bind generic,pager,editor,index <Esc>P noop
|
||
bind generic,pager,editor,index <Esc>Q noop
|
||
bind generic,pager,editor,index <Esc>R noop
|
||
bind generic,pager,editor,index <Esc>S noop
|
||
bind generic,pager,editor,index <Esc>T noop
|
||
bind generic,pager,editor,index <Esc>U noop
|
||
bind generic,pager,editor,index <Esc>V noop
|
||
bind generic,pager,editor,index <Esc>W noop
|
||
bind generic,pager,editor,index <Esc>X noop
|
||
bind generic,pager,editor,index <Esc>Y noop
|
||
bind generic,pager,editor,index <Esc>Z noop
|
||
|
||
bind generic,pager,editor,index <Esc><Tab> noop
|
||
bind generic,pager,editor,index <Esc><Space> noop
|
||
bind generic,pager,editor,index <Esc><PageUp> noop
|
||
bind generic,pager,editor,index <Esc><PageDown> noop
|
||
bind generic,pager,editor,index <Esc><Home> noop
|
||
bind generic,pager,editor,index <Esc><End> noop
|
||
bind generic,pager,editor,index <Esc><Insert> noop
|
||
bind generic,pager,editor,index <Esc><Delete> noop
|
||
bind generic,pager,editor,index <Esc><Up> noop
|
||
bind generic,pager,editor,index <Esc><Down> noop
|
||
bind generic,pager,editor,index <Esc><Left> noop
|
||
bind generic,pager,editor,index <Esc><Right> noop
|
||
bind generic,pager,editor,index <Esc><Enter> noop
|
||
bind generic,pager,editor,index <Esc><Return> noop
|
||
|
||
bind generic,pager,editor,index <Esc>1 noop
|
||
bind generic,pager,editor,index <Esc>2 noop
|
||
bind generic,pager,editor,index <Esc>3 noop
|
||
bind generic,pager,editor,index <Esc>4 noop
|
||
bind generic,pager,editor,index <Esc>5 noop
|
||
bind generic,pager,editor,index <Esc>6 noop
|
||
bind generic,pager,editor,index <Esc>7 noop
|
||
bind generic,pager,editor,index <Esc>8 noop
|
||
bind generic,pager,editor,index <Esc>9 noop
|
||
bind generic,pager,editor,index <Esc>0 noop
|
||
bind generic,pager,editor,index <Esc>! noop
|
||
bind generic,pager,editor,index <Esc>@ noop
|
||
bind generic,pager,editor,index <Esc>$ noop
|
||
bind generic,pager,editor,index <Esc>% noop
|
||
bind generic,pager,editor,index <Esc>^ noop
|
||
bind generic,pager,editor,index <Esc>& noop
|
||
bind generic,pager,editor,index <Esc>* noop
|
||
bind generic,pager,editor,index <Esc>( noop
|
||
bind generic,pager,editor,index <Esc>) noop
|
||
#+end_src
|
||
|
||
*** Quit Neomutt
|
||
#+begin_src conf
|
||
bind index,pager,compose Q exit
|
||
macro index q "<shell-escape>if [ $TMUX ]; then tmux detach; fi<enter>"
|
||
#+end_src
|
||
|
||
*** Generic
|
||
#+begin_src conf
|
||
bind generic Q exit
|
||
|
||
bind generic <Return> select-entry
|
||
bind generic l select-entry
|
||
|
||
bind generic,index k previous-entry
|
||
bind generic,index j next-entry
|
||
|
||
bind generic,index 0 first-entry
|
||
bind generic,index $ last-entry
|
||
|
||
bind generic,index \031 previous-entry # Mouse wheel
|
||
bind generic,index \005 next-entry # Mouse wheel
|
||
|
||
bind generic,index gg first-entry
|
||
bind generic,index G last-entry
|
||
|
||
bind generic,index,pager \Cu half-up
|
||
bind generic,index,pager \Cd half-down
|
||
|
||
bind generic,index,pager \Ce next-line
|
||
bind generic,index,pager \Cy previous-line
|
||
#+end_src
|
||
|
||
*** Index (list of mails)
|
||
#+begin_src conf
|
||
bind index <space> collapse-thread
|
||
|
||
bind index,pager K previous-entry
|
||
bind index,pager J next-entry
|
||
|
||
bind index l display-message
|
||
bind index <Return> display-message
|
||
|
||
macro index h "<change-folder>?" "Go back to the list of mailboxes"
|
||
bind pager h exit
|
||
|
||
macro index c "<change-folder>?<toggle-mailboxes>" "change folder"
|
||
|
||
bind index,pager u undelete-message
|
||
|
||
bind index,pager P print-message
|
||
|
||
# Compose a new email (not a reply) to the sender
|
||
bind index,pager @ compose-to-sender
|
||
|
||
# Marl All message as read
|
||
macro index \Cr \
|
||
"<tag-pattern>~O<enter><tag-prefix><clear-flag>O<untag-pattern>.<enter><tag-pattern>~N<enter><tag-prefix><clear-flag>N<untag-pattern>.<enter>" \
|
||
"mark all new as read"
|
||
#+end_src
|
||
|
||
#+begin_src conf
|
||
bind index U toggle-new
|
||
#+end_src
|
||
|
||
Copy and move mails
|
||
#+BEGIN_SRC conf
|
||
macro index C "<copy-message>?<toggle-mailboxes>" "copy a message to a mailbox"
|
||
macro index M "<save-message>?<toggle-mailboxes>" "move a message to a mailbox"
|
||
#+END_SRC
|
||
|
||
*** Pager (One mail opened)
|
||
#+BEGIN_SRC conf
|
||
bind pager k previous-line
|
||
bind pager j next-line
|
||
bind pager l view-attachments
|
||
|
||
# Display mode information
|
||
bind pager i display-toggle-weed
|
||
|
||
bind pager gg top
|
||
bind pager 0 top
|
||
|
||
bind pager G bottom
|
||
bind pager $ bottom
|
||
|
||
bind pager q exit
|
||
|
||
macro pager L "<pipe-message> urlscan<Enter>" "call urls
|
||
#+END_SRC
|
||
|
||
#+begin_src conf
|
||
bind index z collapse-thread
|
||
bind index Z collapse-all
|
||
#+end_src
|
||
|
||
Write/Reply/Forward mail
|
||
#+BEGIN_SRC conf
|
||
bind index,pager p recall-message
|
||
bind index,pager m mail
|
||
bind index,pager r reply
|
||
bind index,pager R group-reply
|
||
bind index,pager b bounce-message
|
||
bind index,pager f forward-message
|
||
#+END_SRC
|
||
|
||
Sync Mailbox
|
||
#+begin_src conf
|
||
bind index,pager s sync-mailbox
|
||
#+end_src
|
||
|
||
Sync email
|
||
#+BEGIN_SRC conf
|
||
macro index,pager e "<shell-escape>$HOME/.config/neomutt/bin/get_new_esrf_mail.sh<enter>"
|
||
macro index,pager o "<shell-escape>$HOME/.config/neomutt/bin/get_new_mail.sh<enter>"
|
||
macro index,pager O "<shell-escape>$HOME/.config/neomutt/bin/get_new_mail.sh -a<enter>"
|
||
#+END_SRC
|
||
|
||
Make quick html view macro
|
||
#+BEGIN_SRC conf
|
||
macro index,pager H "<view-attachments><search>html<enter><view-mailcap><exit>"
|
||
#+END_SRC
|
||
|
||
Open mail with Vim
|
||
#+begin_src conf
|
||
macro index,pager V "<view-attachments><search>plain<enter><view-mailcap><exit>"
|
||
#+end_src
|
||
|
||
Labels
|
||
#+BEGIN_SRC conf
|
||
bind index,pager y edit-label
|
||
bind index,pager Y modify-labels
|
||
#+END_SRC
|
||
|
||
*** Limit
|
||
#+begin_src conf
|
||
bind index L limit
|
||
macro index a <limit>all<enter>
|
||
#+end_src
|
||
|
||
*** Search
|
||
#+begin_src conf
|
||
bind generic,index,pager / search
|
||
|
||
bind index,pager n search-next
|
||
bind index,pager N search-opposite
|
||
#+end_src
|
||
|
||
*** Attachments
|
||
#+begin_src conf
|
||
bind attach l view-attach
|
||
|
||
bind attach h exit
|
||
bind attach q exit
|
||
|
||
bind attach <return> view-mailcap
|
||
|
||
macro attach W <save-entry><kill-line>$HOME/Downloads/<enter>y "Save entry"
|
||
#+end_src
|
||
|
||
*** Compose
|
||
#+BEGIN_SRC conf
|
||
bind compose p postpone-message
|
||
|
||
bind compose R rename-attachment
|
||
|
||
bind compose a attach-file
|
||
#+END_SRC
|
||
|
||
Open another instance of Neomutt in read-only mode while composing
|
||
#+BEGIN_SRC conf
|
||
# macro compose M "<shell-escape>$TERMINAL -e \"neomutt -R\"<enter>"
|
||
#+END_SRC
|
||
|
||
Attach multiple files using yazi
|
||
#+begin_src conf
|
||
macro compose A "<shell-escape>bash $HOME/.config/neomutt/bin/yazipick<enter><enter-command>source /tmp/yazipick<enter><shell-escape>bash $HOME/.config/neomutt/bin/yazipick clean<enter>" "Attach with Yazi"
|
||
#+end_src
|
||
|
||
**** Attach with yazi
|
||
:PROPERTIES:
|
||
:header-args: :tangle ~/.config/neomutt/bin/yazipick
|
||
:header-args+: :comments both :mkdirp yes
|
||
:header-args+: :shebang "#!/usr/bin/env bash"
|
||
:END:
|
||
#+begin_src bash
|
||
# Define temporary file path
|
||
tmpfile="/tmp/yazipick"
|
||
|
||
# Check if a parameter is passed to the script
|
||
if [ -z "$1" ]; then
|
||
# Select files using yazi and save them to tmpfile
|
||
yazi --chooser-file "$tmpfile"
|
||
|
||
# Only proceed if files were actually selected
|
||
if [ -s "$tmpfile" ]; then
|
||
awk 'BEGIN {printf "push "} {printf "<attach-file>\"%s\"<enter>", $0} END {print ""}' "$tmpfile" > "$tmpfile.tmp" &&
|
||
mv "$tmpfile.tmp" "$tmpfile"
|
||
fi
|
||
|
||
elif [ "$1" == "clean" ]; then
|
||
# Clean up the temporary file if "clean" is passed as argument
|
||
rm -f "$tmpfile"
|
||
fi
|
||
#+end_src
|
||
|
||
**** Send HTML mails using Org mode
|
||
#+BEGIN_SRC conf
|
||
macro compose Y "<first-entry>\
|
||
<pipe-entry>$HOME/.config/neomutt/bin/convert-multipart.sh<enter>\
|
||
<enter-command>source /tmp/neomutt-commands<enter>"
|
||
#+END_SRC
|
||
|
||
*** Browser
|
||
#+begin_src conf
|
||
bind browser l select-entry
|
||
macro browser h "<top-page><select-entry>"
|
||
|
||
bind browser q exit
|
||
#+end_src
|
||
|
||
*** Generic
|
||
Enter Command
|
||
#+begin_src conf
|
||
bind generic,index,pager : enter-command
|
||
#+end_src
|
||
|
||
*** Sidebar
|
||
#+BEGIN_SRC conf
|
||
bind index,pager \Cp sidebar-prev
|
||
bind index,pager \Cn sidebar-next
|
||
bind index,pager \Co sidebar-open
|
||
|
||
bind index,pager \Ch sidebar-toggle-visible
|
||
#+END_SRC
|
||
|
||
*** Reload Configuration
|
||
#+begin_src conf
|
||
macro generic,index,pager,editor ,<Space> ":source $HOME/.config/neomutt/neomuttrc\n" "Reload mutt's configuration file"
|
||
#+end_src
|
||
|
||
*** urlview - Open URL in emails
|
||
Use =urlview= to extract urls from the mail.
|
||
#+begin_src conf
|
||
macro attach,compose,index,pager \cw "\
|
||
:set my_tmp_pipe_decode=\$pipe_decode\n\
|
||
:set pipe_decode\n\
|
||
<pipe-message>urlview\n\
|
||
:set pipe_decode=\$my_tmp_pipe_decode\n\
|
||
:unset my_tmp_pipe_decode\n" \
|
||
'call urlview to extract URLs out of a message'
|
||
#+end_src
|
||
|
||
*** Searching using Mu
|
||
#+begin_src conf
|
||
macro index,pager \Cf "<shell-escape>$HOME/.config/neomutt/bin/search_mail.sh<enter><change-folder-readonly>$HOME/.local/share/mails/search<enter>" \
|
||
"test"
|
||
# macro index,pager \Cf "<shell-escape>mu find --clearlinks --format=links --linksdir=$HOME/.local/share/mails/search " \
|
||
# "mu find"
|
||
macro index,pager gf "<change-folder-readonly>$HOME/.local/share/mails/search<enter>" \
|
||
"mu find results"
|
||
#+end_src
|
||
|
||
*** Link to Orgmode
|
||
#+begin_src conf
|
||
macro index,pager S "<pipe-message>$HOME/.config/neomutt/bin/mutt-save-org-link.py\n"
|
||
#+end_src
|
||
|
||
**** Link mail to orgmode - Script
|
||
:PROPERTIES:
|
||
:header-args: :tangle ~/.config/neomutt/bin/mutt-save-org-link.py
|
||
:header-args+: :comments both :mkdirp yes
|
||
:header-args+: :shebang "#!/usr/bin/env python3"
|
||
:END:
|
||
|
||
#+begin_src python
|
||
#!/usr/bin/env python3
|
||
|
||
import sys
|
||
import email
|
||
from email import policy
|
||
import platform
|
||
import subprocess # Keep for potential fallback or notification
|
||
import pyperclip # Use pyperclip for clipboard
|
||
|
||
def notify_user(title, message):
|
||
"""Attempt to send a desktop notification (optional)."""
|
||
system = platform.system()
|
||
try:
|
||
if system == 'Linux':
|
||
subprocess.Popen(['notify-send', '--urgency=low', '--icon=mail-message-new', title, message])
|
||
elif system == 'Darwin': # macOS
|
||
# Requires 'terminal-notifier' (brew install terminal-notifier)
|
||
# Or use osascript
|
||
subprocess.Popen([
|
||
'osascript', '-e',
|
||
f'display notification "{message}" with title "{title}"'
|
||
])
|
||
# Add Windows notification if needed
|
||
except FileNotFoundError:
|
||
# notify-send or osascript not found, ignore
|
||
pass
|
||
except Exception as e:
|
||
print(f"Notification failed: {e}", file=sys.stderr)
|
||
|
||
|
||
# --- Main Script ---
|
||
|
||
# Parse the email from standard input
|
||
try:
|
||
message_bytes = sys.stdin.buffer.read()
|
||
# Use policy.default for robust parsing of modern emails
|
||
message = email.message_from_bytes(message_bytes, policy=policy.default)
|
||
except Exception as e:
|
||
print(f"Error parsing email: {e}", file=sys.stderr)
|
||
notify_user("Mutt Org Link Error", f"Failed to parse email: {e}")
|
||
sys.exit(1)
|
||
|
||
# Grab the relevant message headers, handling potential missing headers
|
||
raw_message_id = message.get('message-id')
|
||
subject = message.get('subject', '(No Subject)') # Use default if subject is missing
|
||
|
||
# Clean the Message-ID (remove <>)
|
||
if raw_message_id:
|
||
message_id = raw_message_id.strip('<>')
|
||
else:
|
||
message_id = None
|
||
|
||
# Check if we got the essential Message-ID
|
||
if not message_id:
|
||
error_msg = "Could not find Message-ID header in the email."
|
||
print(error_msg, file=sys.stderr)
|
||
notify_user("Mutt Org Link Error", error_msg)
|
||
sys.exit(1)
|
||
|
||
# Construct the Org mode link
|
||
# Format: [[message:message_id][subject]]
|
||
# No URL encoding needed for the message_id here
|
||
org_link = f"[[message:{message_id}][{subject}]]"
|
||
|
||
# Copy the link to the clipboard using pyperclip
|
||
try:
|
||
pyperclip.copy(org_link)
|
||
success_msg = f"Org link copied:\n{org_link}"
|
||
print(success_msg, file=sys.stderr) # Print to stderr for logs/debug
|
||
notify_user("Mutt Org Link Copied", f"Subject: {subject}") # Send desktop notification
|
||
# Optional: Add a terminal bell sound
|
||
# print('\a', file=sys.stderr)
|
||
sys.exit(0) # Success
|
||
except Exception as e:
|
||
# Provide specific error feedback if pyperclip fails (e.g., missing backend)
|
||
error_msg = f"Error copying to clipboard: {e}"
|
||
print(error_msg, file=sys.stderr)
|
||
if "clipboard command not found" in str(e).lower() or \
|
||
isinstance(e, pyperclip.PyperclipException):
|
||
print("\nPlease ensure a clipboard utility is installed:", file=sys.stderr)
|
||
print("- Linux: install 'xclip' or 'xsel'", file=sys.stderr)
|
||
print("- macOS: should work out-of-the-box (pbcopy)", file=sys.stderr)
|
||
print("- Windows: should work out-of-the-box (clip)", file=sys.stderr)
|
||
notify_user("Mutt Org Link Error", "Failed to copy link to clipboard.")
|
||
sys.exit(1) # Failure
|
||
#+end_src
|
||
|
||
** Colors
|
||
#+begin_src conf
|
||
color attachment color109 color235
|
||
color bold color229 color235
|
||
color error color167 color235
|
||
color hdrdefault color246 color235
|
||
color indicator color223 color237
|
||
color markers color243 color235
|
||
color normal color223 color235
|
||
color prompt color223 color235
|
||
color quoted color250 color235
|
||
color quoted1 color108 color235
|
||
color quoted2 color250 color235
|
||
color quoted3 color108 color235
|
||
color quoted4 color250 color235
|
||
color quoted5 color108 color235
|
||
color search color235 color208
|
||
color signature color108 color235
|
||
color status color245 color235
|
||
color tilde color243 color235
|
||
color tree color142 color235
|
||
color underline color223 color239
|
||
|
||
color sidebar_divider color250 color235
|
||
color sidebar_new color142 color235
|
||
|
||
color index color142 color235 ~N
|
||
color index color108 color235 ~O
|
||
color index color109 color235 ~P
|
||
color index color214 color235 ~F
|
||
color index color175 color235 ~Q
|
||
color index color167 color235 ~=
|
||
color index color235 color223 ~T
|
||
color index color235 color167 ~D
|
||
|
||
color header color214 color235 "^(To:|Cc:|Bcc:|From:)"
|
||
color header color142 color235 "^Subject:"
|
||
color header color108 color235 "^X-Spam-Status:"
|
||
color header color108 color235 "^Received:"
|
||
|
||
color body color142 color235 "[a-z]{3,256}://[-a-zA-Z0-9@:%._\\+~#=/?&,]+"
|
||
color body color208 color235 "[-a-z_0-9.%$]+@[-a-z_0-9.]+\\.[-a-z][-a-z]+"
|
||
color body color208 color235 "mailto:[-a-z_0-9.]+@[-a-z_0-9.]+"
|
||
color body color235 color214 "[;:]-*[)>(<lt;|]"
|
||
color body color229 color235 "\\*[- A-Za-z]+\\*"
|
||
|
||
color body color214 color235 "^-.*PGP.*-*"
|
||
color body color142 color235 "^gpg: Good signature from"
|
||
color body color167 color235 "^gpg: Can't.*$"
|
||
color body color214 color235 "^gpg: WARNING:.*$"
|
||
color body color167 color235 "^gpg: BAD signature from"
|
||
color body color167 color235 "^gpg: Note: This key has expired!"
|
||
color body color214 color235 "^gpg: There is no indication that the signature belongs to the owner."
|
||
color body color214 color235 "^gpg: can't handle these multiple signatures"
|
||
color body color214 color235 "^gpg: signature verification suppressed"
|
||
color body color214 color235 "^gpg: invalid node with packet of type"
|
||
#+end_src
|
||
|
||
** Contacts with Mu
|
||
#+BEGIN_SRC conf
|
||
set query_command="mu cfind '%s' -o mutt-ab"
|
||
|
||
bind editor <Tab> complete-query
|
||
#+END_SRC
|
||
|
||
** Paths
|
||
#+BEGIN_SRC conf
|
||
set folder = $HOME/.local/share/mails # mail location
|
||
set alias_file = $HOME/.config/neomutt/alias # where to store aliases
|
||
set header_cache = $HOME/.config/neomutt/cache/headers # where to store headers
|
||
set message_cachedir = $HOME/.config/neomutt/cache/bodies # where to store bodies
|
||
set certificate_file = $HOME/.config/neomutt/certificates # where to store certs
|
||
set mailcap_path = $HOME/.config/neomutt/mailcap # entries for filetypes
|
||
set tmpdir = $HOME/.config/neomutt/temp # where to keep temp files
|
||
#+END_SRC
|
||
|
||
** Print
|
||
https://unix.stackexchange.com/questions/20456/pretty-print-mails-from-mutt
|
||
|
||
#+BEGIN_SRC conf
|
||
# set print_command="/usr/bin/muttprint %s -p ctb110c1u"
|
||
#+END_SRC
|
||
|
||
** Accounts
|
||
#+BEGIN_SRC conf
|
||
set spoolfile = "+esrf/Inbox" # Default inbox
|
||
set realname = "Dehaeze Thomas"
|
||
set from = "thomas.dehaeze@esrf.fr"
|
||
|
||
folder-hook gmail/* source $HOME/.config/neomutt/accounts/gmail
|
||
folder-hook esrf/* source $HOME/.config/neomutt/accounts/esrf
|
||
|
||
macro index,pager ge "<change-folder>+esrf/Inbox<enter>" "go to inbox"
|
||
macro index,pager gm "<change-folder>+gmail/Inbox<enter>" "go to inbox"
|
||
#+END_SRC
|
||
|
||
*** Gmail
|
||
**** Configuration
|
||
#+begin_src conf :tangle ~/.config/neomutt/accounts/gmail :comments none
|
||
set from = "dehaeze.thomas@gmail.com"
|
||
set sendmail = "$HOME/.config/neomutt/bin/send_mail.sh gmail"
|
||
|
||
# Other special folders.
|
||
set mbox = "+gmail/Archive" # Archive Box
|
||
set postponed = "+gmail/Drafts"
|
||
|
||
unset record # Don't copy send message to Sent folder: Gmail does that for us
|
||
|
||
set signature = "$HOME/.config/neomutt/accounts/gmail.signature"
|
||
|
||
macro index,pager d \
|
||
"<save-message>+gmail/Archive<enter>" \
|
||
"Move message to the Archive"
|
||
|
||
macro index,pager D \
|
||
"<save-message>+gmail/Trash<enter>" \
|
||
"Move message to the Trash"
|
||
#+end_src
|
||
|
||
**** Signature
|
||
#+begin_src conf :tangle ~/.config/neomutt/accounts/gmail.signature :comments none :padline no
|
||
Thomas Dehaeze
|
||
#+end_src
|
||
This empty code block is used to add a new line after signature
|
||
#+begin_src conf :tangle ~/.config/neomutt/accounts/gmail.signature :comments none :padline no
|
||
#+end_src
|
||
|
||
*** ESRF
|
||
**** Configuration
|
||
#+begin_src conf :tangle ~/.config/neomutt/accounts/esrf :comments none
|
||
set from = "thomas.dehaeze@esrf.fr"
|
||
set sendmail = "$HOME/.config/neomutt/bin/send_mail.sh esrf"
|
||
|
||
# Other special folders.
|
||
set mbox = "+esrf/Archive"
|
||
set record = "+esrf/Sent"
|
||
set postponed = "+esrf/Drafts"
|
||
|
||
set signature = "$HOME/.config/neomutt/accounts/esrf.signature"
|
||
|
||
macro index,pager d \
|
||
"<save-message>+esrf/Archive<enter>" \
|
||
"Move message to the Archive"
|
||
|
||
macro index,pager D \
|
||
"<save-message>+esrf/Trash<enter>" \
|
||
"Move message to the Trash"
|
||
#+end_src
|
||
|
||
**** Signature
|
||
#+begin_src conf :tangle ~/.config/neomutt/accounts/esrf.signature :comments none :padline no
|
||
Thomas DEHAEZE
|
||
Mechatronics Engineer
|
||
ESRF - The European Synchrotron
|
||
Tel: +33 (0)4.76.88.22.34
|
||
#+end_src
|
||
This empty code block is used to add a new line after signature
|
||
#+begin_src conf :tangle ~/.config/neomutt/accounts/esrf.signature :comments none :padline no
|
||
#+end_src
|
||
|
||
** Basic Options
|
||
#+BEGIN_SRC conf
|
||
set wait_key = no # shut up, mutt
|
||
set mbox_type = Maildir # mailbox type
|
||
set help = no # No top bar
|
||
set timeout = 3 # idle time before scanning
|
||
set sleep_time = 0 # how long NeoMutt may wait after an error message
|
||
set mail_check = 0 # minimum time between scans
|
||
set delete # don't ask, just do
|
||
unset confirmappend # don't ask, just do!
|
||
set quit # don't ask, just do!!
|
||
set mark_old = no # read/new is good enough for me
|
||
set beep_new # bell on new mails
|
||
# set pipe_decode # strip headers and eval mimes when piping
|
||
set thorough_search # strip headers and eval mimes before searching
|
||
set send_charset="us-ascii:utf-8:iso-8859-1"
|
||
set sendmail_wait = 0 # no please don't silently fail, email is important
|
||
set use_from # respect the From: address the editor sends back
|
||
|
||
# Use Vim to compose email, with a few default options.
|
||
set editor = "nvim -c '/\\n--' -c ':noh' -c 'startinsert'"
|
||
#+END_SRC
|
||
|
||
** View Options
|
||
*** Status Bar
|
||
#+BEGIN_SRC conf
|
||
set status_on_top = no
|
||
set status_chars = " *%A"
|
||
set status_format = "───[ Folder: %f ]───[%r%m messages%?n? (%n new)?%?d? (%d to delete)?%?t? (%t tagged)? ]───%>─%?p?( %p postponed )?───"
|
||
#+END_SRC
|
||
|
||
*** Index View Options
|
||
#+BEGIN_SRC conf
|
||
set date_format = "%d/%m/%y %H:%M"
|
||
set index_format = "[%Z] %D %-20.20F %s"
|
||
|
||
set sort = threads # like gmail
|
||
set sort_aux = reverse-last-date-received # like gmail
|
||
set uncollapse_jump # don't collapse on an unread message
|
||
set sort_re # thread based on regex
|
||
set reply_regexp = "^(([Rr][Ee]?(\[[0-9]+\])?: *)?(\[[^]]+\] *)?)*"
|
||
set folder_format = "%2C %t %N %8s %f"
|
||
#+END_SRC
|
||
|
||
*** Pager View Options
|
||
#+BEGIN_SRC conf
|
||
set pager_index_lines = 10 # number of index lines to show
|
||
set pager_context = 3 # number of context lines to show
|
||
set pager_stop # don't go to next message automatically
|
||
set menu_scroll # scroll in menus
|
||
set tilde # show tildes like in vim
|
||
set markers = no # no ugly plus signs
|
||
set quote_regexp = "^( {0,4}[>|:#%]| {0,4}[a-z0-9]+[>|]+)+"
|
||
|
||
auto_view text/html # view html automatically
|
||
alternative_order text/plain text/enriched text/html # save html for last
|
||
#+END_SRC
|
||
|
||
*** Compose View Options
|
||
#+BEGIN_SRC conf
|
||
set sig_dashes # dashes before sig
|
||
set sig_on_top # the signature is just below the response
|
||
set edit_headers # show headers when composing
|
||
set fast_reply # skip to compose when replying
|
||
set fcc_attach # save attachments with the body
|
||
set attribution = "On %d, %n wrote:" # format of quoting header
|
||
set reply_to # reply to Reply to: field
|
||
set reverse_name # reply as whomever it was to
|
||
set include # include message in replies
|
||
#+END_SRC
|
||
|
||
*** Forward
|
||
#+BEGIN_SRC conf
|
||
set forward_format = "Fwd: %s" # format of subject when forwarding
|
||
set forward_decode # decode when forwarding
|
||
set forward_quote # include message in forwards
|
||
#+END_SRC
|
||
|
||
*** Headers
|
||
#+BEGIN_SRC conf
|
||
ignore * # ignore all headers
|
||
unignore from: to: cc: date: subject: # show only these
|
||
unhdr_order *
|
||
hdr_order from: to: cc: date: subject: # and in this order
|
||
#+END_SRC
|
||
|
||
** Sidebar
|
||
*** General Config
|
||
#+BEGIN_SRC conf
|
||
# Should the Sidebar be shown?
|
||
set sidebar_visible = yes
|
||
|
||
# How wide should the Sidebar be in screen columns?
|
||
# Note: Some characters, e.g. Chinese, take up two columns each.
|
||
set sidebar_width = 20
|
||
|
||
# Should the mailbox paths be abbreviated?
|
||
set sidebar_short_path = yes
|
||
|
||
# When abbreviating mailbox path names, use any of these characters as path
|
||
# separators. Only the part after the last separators will be shown.
|
||
# For file folders '/' is good. For IMAP folders, often '.' is useful.
|
||
set sidebar_delim_chars = '/.'
|
||
|
||
# If the mailbox path is abbreviated, should it be indented?
|
||
set sidebar_folder_indent = yes
|
||
|
||
# Indent mailbox paths with this string.
|
||
set sidebar_indent_string = ' '
|
||
|
||
# Make the Sidebar only display mailboxes that contain new, or flagged,
|
||
# mail.
|
||
set sidebar_new_mail_only = no
|
||
|
||
# Any mailboxes that are whitelisted will always be visible, even if the
|
||
# sidebar_new_mail_only option is enabled.
|
||
# sidebar_whitelist '/home/user/mailbox1'
|
||
# sidebar_whitelist '/home/user/mailbox2'
|
||
|
||
# When searching for mailboxes containing new mail, should the search wrap
|
||
# around when it reaches the end of the list?
|
||
set sidebar_next_new_wrap = no
|
||
|
||
# Show the Sidebar on the right-hand side of the screen
|
||
set sidebar_on_right = no
|
||
|
||
# The character to use as the divider between the Sidebar and the other Mutt
|
||
# panels.
|
||
# Note: Only the first character of this string is used.
|
||
set sidebar_divider_char = '│'
|
||
|
||
# Enable extended buffy mode to calculate total, new, and flagged
|
||
# message counts for each mailbox.
|
||
set mail_check_stats
|
||
|
||
# Display the Sidebar mailboxes using this format string.
|
||
set sidebar_format = '%D %* %?N?[%N]?'
|
||
|
||
# Sort the mailboxes in the Sidebar using this method:
|
||
# count - total number of messages
|
||
# flagged - number of flagged messages
|
||
# new - number of new messages
|
||
# path - mailbox path
|
||
# unsorted - do not sort the mailboxes
|
||
set sidebar_sort_method = 'unsorted'
|
||
set sort_browser = 'unsorted'
|
||
#+END_SRC
|
||
|
||
*** Mailboxes to show in the sidebar.
|
||
#+BEGIN_SRC conf
|
||
named-mailboxes " Search" =search
|
||
named-mailboxes " GMAIL" =empty/gmail
|
||
named-mailboxes " Inbox" =gmail/Inbox
|
||
named-mailboxes " Sent" =gmail/Sent
|
||
named-mailboxes " Drafts" =gmail/Drafts
|
||
named-mailboxes " Archive" =gmail/Archive
|
||
named-mailboxes " Trash" =gmail/Trash
|
||
named-mailboxes " ESRF" =empty/esrf
|
||
named-mailboxes " Inbox" =esrf/Inbox
|
||
named-mailboxes " Sent" =esrf/Sent
|
||
named-mailboxes " Drafts" =esrf/Drafts
|
||
named-mailboxes " Archive" =esrf/Archive
|
||
named-mailboxes " Trash" =esrf/Trash
|
||
#+END_SRC
|
||
|
||
#+BEGIN_SRC conf
|
||
unset move
|
||
#+END_SRC
|
||
|
||
** Attachments
|
||
*** Attachment View Options
|
||
#+BEGIN_SRC conf
|
||
set attach_format = "[%D %t] %2n [%-7.7m/%10.10M] %.40d %> [%s] "
|
||
#+END_SRC
|
||
|
||
*** Open Attachment
|
||
Program to open is defined in the =mailcap= file.
|
||
|
||
A script =openfile.sh= is used to open files with the default application using =xdg-open=.
|
||
|
||
*** Attach multiple files at once
|
||
First, tag the files you want to send using =t=, then =;= to apply the action on
|
||
all tagged files and finally =<enter>= to add them all.
|
||
|
||
Or yazi can be used with the =A= keybinding.
|
||
|
||
*** Forgotten Attachment
|
||
#+begin_src conf
|
||
set abort_noattach = ask-yes
|
||
set abort_noattach_regex = "\\<(attach(|ed|ments?)|(attaché|attachés|attache|attachons|joint|jointe|joints|jointes|joins|joignons))\\>"
|
||
#+end_src
|
||
|
||
** Scripts and other config files
|
||
:PROPERTIES:
|
||
:header-args: :comments both :mkdirp yes
|
||
:header-args+: :shebang "#!/usr/bin/env bash"
|
||
:END:
|
||
|
||
*** Search Mail
|
||
#+begin_src bash :tangle ~/.config/neomutt/bin/search_mail.sh
|
||
arg_subject=$(rofi -p "Contains" -dmenu)
|
||
|
||
arg_from=$(rofi -p "From" -dmenu)
|
||
if [ ! -z "$arg_from" ]; then
|
||
arg_from="from:/.*${arg_from}.*/"
|
||
fi
|
||
|
||
arg_to=$(rofi -p "To" -dmenu)
|
||
if [ ! -z "$arg_to" ]; then
|
||
arg_to="to:/.*${arg_to}.*/"
|
||
fi
|
||
|
||
arg_mime=$(echo -e "\napplication/pdf\nimage/*\nvideo/*" | rofi -i -p "Mime" -dmenu)
|
||
if [ ! -z "$arg_mime" ]; then
|
||
arg_mime="mime:${arg_mime}"
|
||
fi
|
||
|
||
mu find --clearlinks --format=links --linksdir=$HOME/.local/share/mails/search "${arg_from} ${arg_to} ${arg_mime} ${arg_subject}"
|
||
#+end_src
|
||
|
||
*** Sync "Send Mail" Script
|
||
#+begin_src bash :tangle ~/.config/neomutt/bin/send_mail.sh
|
||
msmtp -a $1 ${@:2} && \
|
||
if [ $TMUX ]; then
|
||
tmux split -v -l 1 "mbsync -c $XDG_CONFIG_HOME/isync/mbsyncrc $1-Sent && mu index" && tmux select-pane -U
|
||
else
|
||
mbsync -c $XDG_CONFIG_HOME/isync/mbsyncrc $1-Sent && mu index
|
||
fi
|
||
#+end_src
|
||
|
||
*** Sync Mail Script
|
||
#+begin_src bash :tangle ~/.config/neomutt/bin/get_new_mail.sh
|
||
if [ $TMUX ]; then
|
||
tmux split -v -l 1 checkmail $1 && tmux select-pane -U
|
||
else
|
||
checkmail $1
|
||
fi
|
||
#+end_src
|
||
|
||
*** Sync ESRF Mail Script
|
||
#+begin_src bash :tangle ~/.config/neomutt/bin/get_new_esrf_mail.sh
|
||
if [ $TMUX ]; then
|
||
tmux split -v -l 1 "mbsync -c $XDG_CONFIG_HOME/isync/mbsyncrc esrf && mu index" && tmux select-pane -U
|
||
else
|
||
mbsync -c $XDG_CONFIG_HOME/isync/mbsyncrc esrf && mu index
|
||
fi
|
||
#+end_src
|
||
|
||
*** Email written with Org-Mode
|
||
#+begin_src bash :tangle ~/.config/neomutt/bin/convert-multipart.sh
|
||
commandsFile="/tmp/neomutt-commands"
|
||
orgFile="/tmp/neomutt-org"
|
||
htmlFile="/tmp/neomutt.html"
|
||
debugFile="/tmp/neomutt-debug.txt"
|
||
: > "$debugFile" # clear previous content
|
||
|
||
# Save original
|
||
cat - > "${orgFile}.orig"
|
||
cp "${orgFile}.orig" "$orgFile"
|
||
|
||
# Reset commands
|
||
echo -n "push " > "$commandsFile"
|
||
|
||
# -----------------------------
|
||
# Replace signature for HTML only
|
||
# -----------------------------
|
||
awk '
|
||
/^-- *$/ {
|
||
in_sig = 1
|
||
sig = "--"
|
||
next
|
||
}
|
||
in_sig {
|
||
if (/^[[:space:]]*$/) {
|
||
print "#+begin_export html"
|
||
gsub(/\n/, "<br>", sig)
|
||
print "<p style=\"margin-top:1.2em; font-size:90%; color:#444; line-height:1.3;\">" sig "</p>"
|
||
print "#+end_export"
|
||
print
|
||
in_sig = 0
|
||
} else {
|
||
sig = sig "<br>" $0
|
||
}
|
||
next
|
||
}
|
||
{print}
|
||
' "$orgFile" > "$orgFile.tmp" && mv "$orgFile.tmp" "$orgFile"
|
||
|
||
# -----------------------------
|
||
# Convert Org to HTML
|
||
# -----------------------------
|
||
pandoc -f org -t html5 --standalone --wrap=none --template ~/.local/share/pandoc/email.html \
|
||
"$orgFile" > "$htmlFile"
|
||
|
||
# -----------------------------
|
||
# Helper: extract local images from HTML
|
||
# -----------------------------
|
||
grep -oP '<img src="file://\K[^"]+' "$htmlFile" | while read -r file; do
|
||
sed -i "s#<img src=\"file://$file\"#<img src=\"cid:$(md5sum "$file" | cut -d ' ' -f 1 )\"#g" "$htmlFile"
|
||
echo "Replaced $file by cid:$(md5sum "$file" | cut -d ' ' -f 1 ) in HTML" >> "$debugFile"
|
||
done
|
||
|
||
# Attach the html file
|
||
echo -n "<attach-file>\"$htmlFile\"<enter>" >> "$commandsFile"
|
||
|
||
# Set it as inline
|
||
echo -n "<toggle-disposition>" >> "$commandsFile"
|
||
|
||
# Tell neomutt to delete it after sending
|
||
echo -n "<toggle-unlink>" >> "$commandsFile"
|
||
|
||
# Select both the html and org files
|
||
echo -n "<tag-entry><previous-entry><tag-entry>" >> "$commandsFile"
|
||
|
||
# Group the selected messages as alternatives
|
||
echo -n "<group-alternatives>" >> "$commandsFile"
|
||
|
||
|
||
|
||
grep -oP '\[\[file:\K[^\]]+' "${orgFile}.orig" \
|
||
| grep -Ev '^(https?://|cid:)' \
|
||
| while read -r file; do
|
||
if [[ -f "$file" ]]; then
|
||
id="$(md5sum "$file" | cut -d ' ' -f 1 )"
|
||
echo -n "<attach-file>\"$file\"<enter>" >> "$commandsFile"
|
||
echo -n "<toggle-disposition>" >> "$commandsFile"
|
||
echo -n "<edit-content-id><backspace><backspace><backspace><backspace><backspace><backspace><backspace><backspace><backspace><backspace><backspace><backspace><backspace><backspace><backspace><backspace>$id<enter>" >> "$commandsFile"
|
||
echo -n "<tag-entry>" >> "$commandsFile"
|
||
echo "Attached $file" >> "$debugFile"
|
||
fi
|
||
done
|
||
|
||
|
||
grep -oP '\[\[file:\K[^\]]+' "$orgFile" | grep '^cid:' >/dev/null
|
||
if [[ $? -eq 0 ]]; then
|
||
echo -n "<first-entry><tag-entry><group-related>" >> "$commandsFile"
|
||
echo "Grouped related images" >> "$debugFile"
|
||
fi
|
||
#+end_src
|
||
|
||
#+begin_src html :tangle ~/.local/share/pandoc/email.html :shebang "" :comments no
|
||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||
<head>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
||
<title>$if(title-prefix)$$title-prefix$ – $endif$$pagetitle$</title>
|
||
|
||
<style type="text/css">
|
||
|
||
/* ------------------------------ */
|
||
/* Base reset for email clients */
|
||
/* ------------------------------ */
|
||
|
||
body,table,td,div,p {
|
||
margin:0;
|
||
padding:0;
|
||
font-family: Georgia, "Times New Roman", serif;
|
||
font-size: 15px;
|
||
line-height: 1.4;
|
||
color:#111;
|
||
}
|
||
|
||
img {
|
||
border:0;
|
||
outline:none;
|
||
text-decoration:none;
|
||
max-width:100%;
|
||
height:auto;
|
||
-ms-interpolation-mode:bicubic; /* Outlook */
|
||
}
|
||
|
||
table {
|
||
border-collapse: collapse;
|
||
}
|
||
|
||
/* ------------------------------ */
|
||
/* Layout container */
|
||
/* ------------------------------ */
|
||
|
||
.wrapper {
|
||
width:100%;
|
||
background:#ffffff;
|
||
padding:20px 0;
|
||
}
|
||
|
||
.container {
|
||
max-width:760px;
|
||
margin:0 auto;
|
||
padding:20px;
|
||
background:#ffffff;
|
||
}
|
||
|
||
/* ------------------------------ */
|
||
/* Typography */
|
||
/* ------------------------------ */
|
||
|
||
h1,h2,h3,h4,h5,h6 {
|
||
margin:20px 0 10px;
|
||
font-family: "Roboto","Helvetica Neue","Segoe UI",Arial,sans-serif;
|
||
color:#222;
|
||
line-height:1.25;
|
||
}
|
||
|
||
h1 { font-size: 22px; }
|
||
h2 { font-size: 19px; }
|
||
h3 { font-size: 16px; }
|
||
h4 { font-size: 15px; }
|
||
h5 { font-size: 14px; }
|
||
h6 { font-size: 13px; }
|
||
|
||
p {
|
||
margin:12px 0;
|
||
}
|
||
|
||
ul,ol {
|
||
margin:10px 0 10px 25px;
|
||
}
|
||
|
||
li { margin:4px 0; }
|
||
|
||
/* ------------------------------ */
|
||
/* Code blocks & inline code */
|
||
/* ------------------------------ */
|
||
|
||
pre, code {
|
||
font-family: Menlo, Consolas, "Courier New", monospace;
|
||
font-size: 13px;
|
||
}
|
||
|
||
pre {
|
||
background:#f5f5f5;
|
||
padding:10px;
|
||
border-radius:4px;
|
||
white-space:pre-wrap;
|
||
margin:15px 0;
|
||
}
|
||
|
||
p > code {
|
||
background:#f5f5f5;
|
||
padding:2px 4px;
|
||
border-radius:3px;
|
||
}
|
||
|
||
/* ------------------------------ */
|
||
/* Blockquotes */
|
||
/* ------------------------------ */
|
||
|
||
blockquote {
|
||
border-left:4px solid #ccc;
|
||
padding-left:10px;
|
||
margin-left:5px;
|
||
margin-right:0;
|
||
font-style:italic;
|
||
color:#555;
|
||
}
|
||
|
||
/* ------------------------------ */
|
||
/* Tables */
|
||
/* ------------------------------ */
|
||
|
||
table {
|
||
width: 100%;
|
||
border-collapse: collapse;
|
||
margin: 15px 0;
|
||
font-size: 14px;
|
||
line-height: 1.4;
|
||
}
|
||
|
||
table th, table td {
|
||
border: 1px solid #ccc;
|
||
padding: 8px 12px;
|
||
text-align: left;
|
||
}
|
||
|
||
table th {
|
||
background-color: #f0f0f0;
|
||
font-weight: bold;
|
||
}
|
||
|
||
table tr:nth-child(even) {
|
||
background-color: #fafafa;
|
||
}
|
||
|
||
table caption {
|
||
caption-side: bottom;
|
||
font-size: 12px;
|
||
color: #555;
|
||
margin-top: 5px;
|
||
}
|
||
|
||
/* ------------------------------ */
|
||
/* Mobile styles */
|
||
/* ------------------------------ */
|
||
|
||
@media only screen and (max-width: 620px) {
|
||
body,table,td,p { font-size:14px !important; }
|
||
h1 { font-size:20px !important; }
|
||
.container { padding:15px !important; }
|
||
}
|
||
|
||
@media only screen and (max-width: 620px) {
|
||
table, thead, tbody, th, td, tr {
|
||
display: block;
|
||
width: 100%;
|
||
}
|
||
th {
|
||
text-align: right;
|
||
padding-right: 10px;
|
||
}
|
||
td {
|
||
text-align: left;
|
||
padding-left: 10px;
|
||
border: none;
|
||
border-bottom: 1px solid #eee;
|
||
}
|
||
}
|
||
|
||
</style>
|
||
|
||
$if(highlighting-css)$
|
||
<style type="text/css">
|
||
$highlighting-css$
|
||
</style>
|
||
$endif$
|
||
|
||
$for(header-includes)$
|
||
$header-includes$
|
||
$endfor$
|
||
|
||
</head>
|
||
|
||
<body>
|
||
<div class="wrapper">
|
||
<div class="container">
|
||
|
||
$if(title)$
|
||
<h1>$title$</h1>
|
||
$endif$
|
||
|
||
$body$
|
||
|
||
</div>
|
||
</div>
|
||
</body>
|
||
</html>
|
||
#+end_src
|
||
|
||
*** Openfile Scripts
|
||
#+begin_src bash :tangle ~/.config/neomutt/bin/openfile.sh
|
||
base=$(basename "$1")
|
||
ext="${base##*.}"
|
||
|
||
file=$(mktemp -u --suffix=".$ext")
|
||
|
||
rm -f "$file"
|
||
|
||
cp "$1" "$file"
|
||
|
||
setsid xdg-open "$file" >/dev/null 2>&1 &
|
||
#+end_src
|
||
|
||
*** urlview Config
|
||
:PROPERTIES:
|
||
:header-args:conf+: :tangle ~/.urlview
|
||
:header-args:conf+: :comments both :mkdirp yes
|
||
:END:
|
||
|
||
#+BEGIN_SRC conf
|
||
REGEXP (((http|https|ftp|gopher)|mailto)[.:][^ >"\t]*|www\.[-a-z0-9.]+)[^ .,;\t>">\):]
|
||
|
||
COMMAND nohup qutebrowser %s </dev/null &>/dev/null &
|
||
#+END_SRC
|
||
|
||
*** Mailcap
|
||
:PROPERTIES:
|
||
:header-args:conf: :tangle ~/.config/neomutt/mailcap
|
||
:header-args:conf+: :comments both :mkdirp yes
|
||
:END:
|
||
|
||
Generic
|
||
#+BEGIN_SRC conf
|
||
text/plain; nvim %s
|
||
video/*; setsid mpv --quiet %s &
|
||
image/*; nsxiv -a -b %s &
|
||
application/pdf; zathura %s &
|
||
audio/*; /usr/bin/xdg-open %s; copiousoutput
|
||
text/html; export DISPLAY=:0 && setsid qutebrowser %s > /dev/null 2>&1 &; nametemplate=%s.html
|
||
text/html; lynx -width ${COLUMNS:-80} -dump %s; nametemplate=%s.html; copiousoutput;
|
||
#+END_SRC
|
||
|
||
For calendar output, a personal =ics-add= script is used.
|
||
#+BEGIN_SRC conf
|
||
text/calendar; ics-add %s; copiousoutput;
|
||
application/ics; ics-add %s; copiousoutput;
|
||
#+END_SRC
|
||
|
||
For calendar output (outlook), a personal =ics-add= script is used.
|
||
#+BEGIN_SRC conf
|
||
application/ms-tnef; winmail-add %s; copiousoutput;
|
||
#+END_SRC
|
||
|
||
Libreoffice
|
||
#+begin_src conf
|
||
application/docx; onlyoffice-desktopeditors %s &; copiousoutput;
|
||
application/doc; onlyoffice-desktopeditors %s &; copiousoutput;
|
||
|
||
application/vnd.oasis.opendocument.database; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.oasis.opendocument.chart; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.oasis.opendocument.spreadsheet; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.oasis.opendocument.spreadsheet-template; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.oasis.opendocument.graphics; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.oasis.opendocument.graphics-template; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.oasis.opendocument.presentation; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.oasis.opendocument.presentation-template; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.oasis.opendocument.formula; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.oasis.opendocument.text; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.oasis.opendocument.text-master; onlyoffice-desktopeditors -global '%s'; copiousoutput
|
||
application/vnd.oasis.opendocument.text-template; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.oasis.opendocument.text-web; onlyoffice-desktopeditors -web '%s'; copiousoutput
|
||
application/vnd.sun.xml.base; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.sun.xml.calc; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.sun.xml.calc.template; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.sun.xml.draw; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.sun.xml.draw.template; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.stardivision.calc; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.stardivision.chart; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.stardivision.draw; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.stardivision.impress; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.stardivision.math; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.stardivision.writer-global; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.stardivision.writer; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.sun.xml.impress; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.sun.xml.impress.template; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.sun.xml.math; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.sun.xml.writer; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.sun.xml.writer.global; onlyoffice-desktopeditors -global '%s'; copiousoutput
|
||
application/vnd.sun.xml.writer.template; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
text/csv; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
text/spreadsheet; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/x-quattropro; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/x-dbf; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.ms-excel.sheet.macroEnabled.12; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.ms-excel.template.macroEnabled.12; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.openxmlformats-officedocument.spreadsheetml.template; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.lotus-1-2-3; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.ms-excel; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/msexcel; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/x-dbase; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
text/x-csv; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.ms-powerpoint.presentation.macroEnabled.12; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.ms-powerpoint.slideshow.macroEnabled.12; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.ms-powerpoint.template.macroEnabled.12; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.openxmlformats-officedocument.presentationml.presentation; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.openxmlformats-officedocument.presentationml.slideshow; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.openxmlformats-officedocument.presentationml.template; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.ms-powerpoint; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/mspowerpoint; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
text/mathml; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/rtf; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/x-t602; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.wordperfect; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.ms-word.document.macroEnabled.12; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.ms-word.template.macroEnabled.12; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.openxmlformats-officedocument.wordprocessingml.document; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.openxmlformats-officedocument.wordprocessingml.template; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/vnd.ms-works; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/msword; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
application/wordperfect; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
text/rtf; onlyoffice-desktopeditors '%s'; copiousoutput
|
||
#+end_src
|
||
|