another commit
This commit is contained in:
+19
-18
@@ -1,42 +1,43 @@
|
||||
# Agent Guidelines: Aerc Configuration Repository
|
||||
|
||||
This repository contains the configuration and customization for `aerc`, a terminal-based email client. It is optimized for a workflow involving `notmuch` for indexing, `mbsync` for synchronization, and `abook` for address management.
|
||||
This repository contains the configuration and customization for `aerc`, a terminal-based email client. It is optimized for a workflow involving `notmuch` for indexing, `mbsync` for synchronization, `abook` for address management, `khal` for calendar, and `taskwarrior` for tasks.
|
||||
|
||||
## 1. Build, Lint, and Test Commands
|
||||
|
||||
### Sync and Maintenance
|
||||
- **Global Sync**: Run `mailsync` (bound to `u` in `aerc`) to perform:
|
||||
1. `mbsync -a` (Mail synchronization)
|
||||
2. `notmuch new` for all account databases (Indexing)
|
||||
3. `notmuch-abook-sync` (Address book population)
|
||||
- **Manual Sync**: Run individual commands if needed for specific accounts:
|
||||
`NOTMUCH_CONFIG=~/Mail/phil/.notmuch-config notmuch new`
|
||||
1. `mbsync -a` (Mail sync)
|
||||
2. `vdirsyncer sync` (Calendar sync)
|
||||
3. `caldawarrior sync` (Task sync)
|
||||
4. `notmuch new` for all account databases (Indexing)
|
||||
5. `notmuch-abook-sync` (Address book population)
|
||||
|
||||
### Linting
|
||||
- **Permissions**: `accounts.conf` must be `0600`.
|
||||
- **Dependencies**: `w3m`, `bat`, `yazi`, `notmuch`, `abook`, `pass`, `isync`.
|
||||
- **Dependencies**: `w3m`, `bat`, `yazi`, `notmuch`, `abook`, `pass`, `isync`, `khal`, `vdirsyncer`, `task`, `taskwarrior-tui`, `caldawarrior`.
|
||||
|
||||
### Testing
|
||||
- **Filters**:
|
||||
```bash
|
||||
cat email.html | w3m -T text/html -dump
|
||||
```
|
||||
- **Address Book Query**:
|
||||
```bash
|
||||
abook --mutt-query "search term"
|
||||
```
|
||||
- **Filters**: `cat email.html | w3m -T text/html -dump`
|
||||
- **Calendar**: `khal list`
|
||||
- **Tasks**: `task list`
|
||||
|
||||
## 2. Code Style Guidelines
|
||||
|
||||
### Aerc Configuration
|
||||
- **Notmuch URI**: Use the absolute triple-slash format: `source = notmuch:///home/liph/Mail/account_name`.
|
||||
- **Notmuch URI**: Use absolute triple-slash format: `source = notmuch:///home/liph/Mail/account_name`.
|
||||
- **Credentials**: Use `pass` via `outgoing-cred-cmd = pass show mail/account_email`.
|
||||
- **Sidebar**: Use separate `notmuch` databases per account directory for isolation.
|
||||
|
||||
### Keybindings
|
||||
- **Leader**: `,` (comma).
|
||||
- **Contacts**: `,ab` opens `abook` in a terminal.
|
||||
- **Picker**: `yazi` is the default for attachments (`file-picker-cmd`).
|
||||
- **Tab switching**: `Alt+n` (next) and `Alt+p` (prev).
|
||||
- **Contacts**: `,ab` opens `abook`.
|
||||
- **Calendar**: `,ca` opens unified `khal`.
|
||||
- **Tasks**: `,ta` opens `taskwarrior-tui`.
|
||||
|
||||
### Terminal Tabs (Khal/Taskwarrior)
|
||||
- **Escape**: Press `Ctrl+x` to release terminal focus and use `aerc` commands.
|
||||
- **Tab Passthrough**: `Tab` and `Backtab` are passed to terminal apps for internal navigation.
|
||||
|
||||
### Neovim integration (`after/ftplugin/mail.lua`)
|
||||
- **Completion**: Triggered by `Tab` on header lines using `abook --mutt-query`.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[phil]
|
||||
source = notmuch:///home/liph/Mail/phil
|
||||
query-map = ~/.config/aerc/notmuch-queries.conf
|
||||
query-map = ~/.config/aerc/phil.queries
|
||||
outgoing = smtp://phil%40liphlink.xyz@mail.liphlink.xyz:587
|
||||
outgoing-cred-cmd = pass show mail/phil@liphlink.xyz
|
||||
from = Phil <phil@liphlink.xyz>
|
||||
|
||||
+16
-20
@@ -89,8 +89,8 @@ log-level=debug
|
||||
# width specifier is set, '*' is used by default.
|
||||
#
|
||||
# Default: flags:4,name<20%,subject,date>=
|
||||
#index-columns=flags:4,name<20%,subject,date>=
|
||||
# border-char-vertical="┃"
|
||||
index-columns=flags:4,name<35%,subject,date>=
|
||||
column-name={{if match .Folder "(?i)Sent|Gesendet"}}{{index (.To | persons) 0}}{{else}}{{index (.From | persons) 0}}{{end}}
|
||||
border-char-vertical="│"
|
||||
border-char-horizontal="─"
|
||||
styleset-name="gruvbox-dark"
|
||||
@@ -177,7 +177,7 @@ threading-enabled=true
|
||||
# Width of the sidebar, including the border.
|
||||
#
|
||||
# Default: 22
|
||||
sidebar-width=22
|
||||
sidebar-width=34
|
||||
|
||||
#
|
||||
# Default split layout for message list tabs. The syntax is:
|
||||
@@ -247,13 +247,13 @@ mouse-enabled=false
|
||||
# See aerc-templates(7) for all available fields and functions.
|
||||
#
|
||||
# Default: {{.Folder}}
|
||||
#dirlist-left={{.Folder}}
|
||||
dirlist-left={{if match .Folder "/"}}{{.Style (index (.Folder | split "/" | tail 1) 0) "folder_sub"}}{{else}}{{.Folder}}{{end}}
|
||||
|
||||
# Template for the right side of the directory list.
|
||||
# See aerc-templates(7) for all available fields and functions.
|
||||
#
|
||||
# Default: {{if .Unread}}{{humanReadable .Unread}}{{end}}
|
||||
#dirlist-right={{if .Unread}}{{humanReadable .Unread}}{{end}}
|
||||
dirlist-right={{if .Unread}}{{humanReadable .Unread}} / {{end}}{{humanReadable .Exists}}
|
||||
|
||||
# Delay after which the messages are actually listed when entering a directory.
|
||||
# This avoids loading messages when skipping over folders and makes the UI more
|
||||
@@ -266,13 +266,13 @@ mouse-enabled=false
|
||||
# expand the folders.
|
||||
#
|
||||
# Default: false
|
||||
#dirlist-tree=false
|
||||
dirlist-tree=true
|
||||
|
||||
# If dirlist-tree is enabled, set level at which folders are collapsed by
|
||||
# default. Set to 0 to disable.
|
||||
#
|
||||
# Default: 0
|
||||
#dirlist-collapse=0
|
||||
dirlist-collapse=1
|
||||
|
||||
# List of space-separated criteria to sort the messages by, see *sort*
|
||||
# command in *aerc*(1) for reference. Prefixing a criterion with "-r "
|
||||
@@ -576,7 +576,7 @@ pager= bat --style=plain --paging=always
|
||||
# html-unsafe-images=false
|
||||
# html-filter=dante
|
||||
image/*=chafa -f kitty -s ${width}x${height}
|
||||
text/html=w3m -T text/html -dump
|
||||
text/html=w3m -T text/html -dump -o display_link_number=1
|
||||
application/pdf=zathura
|
||||
video/*=mpv
|
||||
header-layout=From,To,Subject,Date
|
||||
@@ -633,7 +633,7 @@ header-layout=From,To,Subject,Date
|
||||
#parse-http-links=true
|
||||
|
||||
[compose]
|
||||
editor=nvim +'set ft=mail'
|
||||
editor=nvim +'set ft=mail.markdown'
|
||||
|
||||
# editor=nvim +setf\ mail
|
||||
# editor=nvim # or your preferred editor
|
||||
@@ -732,18 +732,10 @@ edit-headers=true
|
||||
# text. To actually make use of this format's features, you'll need support in
|
||||
# your editor.
|
||||
#
|
||||
#format-flowed=false
|
||||
format-flowed=false
|
||||
|
||||
[multipart-converters]
|
||||
#
|
||||
# Converters allow to generate multipart/alternative messages by converting the
|
||||
# main text/plain part into any other MIME type. Only exact MIME types are
|
||||
# accepted. The commands are invoked with sh -c and are expected to output
|
||||
# valid UTF-8 text.
|
||||
#
|
||||
# Example (obviously, this requires that you write your main text/plain body
|
||||
# using the markdown syntax):
|
||||
#text/html=pandoc -f markdown -t html --standalone
|
||||
text/html=/home/liph/.local/bin/aerc-md-convert
|
||||
|
||||
[filters]
|
||||
#
|
||||
@@ -785,7 +777,7 @@ text/plain=colorize
|
||||
text/calendar=calendar
|
||||
message/delivery-status=colorize
|
||||
message/rfc822=colorize
|
||||
text/html=w3m -T text/html -dump
|
||||
text/html=w3m -T text/html -dump -o display_link_number=1
|
||||
#text/*=bat -fP --file-name="$AERC_FILENAME"
|
||||
#application/x-sh=bat -fP -l sh
|
||||
#image/*=catimg -w $(tput cols) -
|
||||
@@ -822,6 +814,7 @@ text/html=w3m -T text/html -dump
|
||||
text/html=w3m
|
||||
x-scheme-handler/http=librewolf
|
||||
x-scheme-handler/https=librewolf
|
||||
text/calendar=khal import --batch
|
||||
|
||||
[hooks]
|
||||
#
|
||||
@@ -888,3 +881,6 @@ template-dirs=${XDG_CONFIG_HOME:-~/.config}/aerc/templates
|
||||
#
|
||||
# default: forward_as_body
|
||||
#forwards=forward_as_body
|
||||
|
||||
[terminal]
|
||||
passthrough=false
|
||||
|
||||
@@ -0,0 +1,883 @@
|
||||
#
|
||||
# aerc main configuration
|
||||
|
||||
[general]
|
||||
# Used as a default path for save operations if no other path is specified.
|
||||
# ~ is expanded to the current user home dir.
|
||||
#
|
||||
#default-save-path=
|
||||
|
||||
# If set to "gpg", aerc will use system gpg binary and keystore for all crypto
|
||||
# operations. If set to "internal", the internal openpgp keyring will be used.
|
||||
# If set to "auto", the system gpg will be preferred unless the internal
|
||||
# keyring already exists, in which case the latter will be used.
|
||||
#
|
||||
# Default: auto
|
||||
#pgp-provider=auto
|
||||
|
||||
# By default, the file permissions of accounts.conf must be restrictive and
|
||||
# only allow reading by the file owner (0600). Set this option to true to
|
||||
# ignore this permission check. Use this with care as it may expose your
|
||||
# credentials.
|
||||
#
|
||||
# Default: false
|
||||
unsafe-accounts-conf=false
|
||||
index-format=notmuch://~/.local/share/mail
|
||||
# Output log messages to specified file. A path starting with ~/ is expanded to
|
||||
# the user home dir. When redirecting aerc's output to a file using > shell
|
||||
# redirection, this setting is ignored and log messages are printed to stdout.
|
||||
#
|
||||
log-file=~/.local/share/aerc/aerc.log
|
||||
log-level=debug
|
||||
|
||||
|
||||
# Disable IPC entirely. Don't run commands (including mailto:... and mbox:...)
|
||||
# in an existing aerc instance, and don't start an IPC server to allow
|
||||
# subsequent aerc instances to run commands in the current one.
|
||||
#
|
||||
# Default: false
|
||||
#disable-ipc=false
|
||||
|
||||
# Don't run mailto:... commands over IPC; start a new aerc instance with the
|
||||
# composer instead.
|
||||
#
|
||||
# Default: false
|
||||
#disable-ipc-mailto=false
|
||||
#
|
||||
# Don't run mbox:... commands over IPC; start a new aerc instance with the mbox
|
||||
# file instead.
|
||||
#
|
||||
# Default: false
|
||||
#disable-ipc-mbox=false
|
||||
|
||||
# Set the $TERM environment variable used for the embedded terminal.
|
||||
#
|
||||
# Default: xterm-256color
|
||||
#term=xterm-256color
|
||||
|
||||
# Display OSC8 strings in the embedded terminal
|
||||
#
|
||||
# Default: false
|
||||
#enable-osc8=false
|
||||
|
||||
# Default shell command to use for :menu. This will be executed with sh -c and
|
||||
# will run in an popover dialog.
|
||||
#
|
||||
# Any occurrence of %f will be replaced by a temporary file path where the
|
||||
# command is expected to write output lines to be consumed by :menu. Otherwise,
|
||||
# the lines will be read from the command's standard output.
|
||||
#
|
||||
# Examples:
|
||||
# default-menu-cmd=fzf
|
||||
# default-menu-cmd=fzf --multi
|
||||
# default-menu-cmd=dmenu -l 20
|
||||
# default-menu-cmd=ranger --choosefiles=%f
|
||||
#
|
||||
#default-menu-cmd=
|
||||
|
||||
[ui]
|
||||
#
|
||||
# Describes the format for each row in a mailbox view. This is a comma
|
||||
# separated list of column names with an optional align and width suffix. After
|
||||
# the column name, one of the '<' (left), ':' (center) or '>' (right) alignment
|
||||
# characters can be added (by default, left) followed by an optional width
|
||||
# specifier. The width is either an integer representing a fixed number of
|
||||
# characters, or a percentage between 1% and 99% representing a fraction of the
|
||||
# terminal width. It can also be one of the '*' (auto) or '=' (fit) special
|
||||
# width specifiers. Auto width columns will be equally attributed the remaining
|
||||
# terminal width. Fit width columns take the width of their contents. If no
|
||||
# width specifier is set, '*' is used by default.
|
||||
#
|
||||
# Default: flags:4,name<20%,subject,date>=
|
||||
index-columns=flags:4,name<35%,subject,date>=
|
||||
column-name={{if match .Folder "(?i)Sent|Gesendet"}}{{index (.To | persons) 0}}{{else}}{{index (.From | persons) 0}}{{end}}
|
||||
border-char-vertical="│"
|
||||
border-char-horizontal="─"
|
||||
styleset-name="gruvbox-dark"
|
||||
threading-enabled=true
|
||||
|
||||
#
|
||||
# Each name in index-columns must have a corresponding column-$name setting.
|
||||
# All column-$name settings accept golang text/template syntax. See
|
||||
# aerc-templates(7) for available template attributes and functions.
|
||||
#
|
||||
# Here are some examples to show the To field instead of the From field for
|
||||
# an email (modifying column-name):
|
||||
#
|
||||
# 1. a generic one
|
||||
# column-name={{ .Peer | names | join ", " }}
|
||||
# 2. based upon the selected folder
|
||||
# column-name={{if match .Folder "^(Gesendet|Sent)$"}}{{index (.To | names) 0}}{{else}}{{index (.From | names) 0}}{{end}}
|
||||
#
|
||||
# Default settings
|
||||
#column-flags={{.Flags | join ""}}
|
||||
#column-name={{index (.From | names) 0}}
|
||||
#column-subject={{.ThreadPrefix}}{{.Subject}}
|
||||
#column-date={{.DateAutoFormat .Date.Local}}
|
||||
|
||||
#
|
||||
# String separator inserted between columns. When the column width specifier is
|
||||
# an exact number of characters, the separator is added to it (i.e. the exact
|
||||
# width will be fully available for the column contents).
|
||||
#
|
||||
# Default: " "
|
||||
#column-separator=" "
|
||||
|
||||
#
|
||||
# See time.Time#Format at https://godoc.org/time#Time.Format
|
||||
#
|
||||
# Default: 2006 Jan 02
|
||||
#timestamp-format=2006 Jan 02
|
||||
|
||||
#
|
||||
# Index-only time format for messages that were received/sent today.
|
||||
# If this is empty, timestamp-format is used instead.
|
||||
#
|
||||
# Default: 15:04
|
||||
#this-day-time-format=15:04
|
||||
|
||||
#
|
||||
# Index-only time format for messages that were received/sent within the last
|
||||
# 7 days. If this is empty, timestamp-format is used instead.
|
||||
#
|
||||
# Default: Jan 02
|
||||
#this-week-time-format=Jan 02
|
||||
|
||||
#
|
||||
# Index-only time format for messages that were received/sent this year.
|
||||
# If this is empty, timestamp-format is used instead.
|
||||
#
|
||||
#Default: Jan 02
|
||||
#this-year-time-format=Jan 02
|
||||
|
||||
#
|
||||
# Overrides timestamp-format for the message view.
|
||||
#
|
||||
# Default: 2006 Jan 02, 15:04 GMT-0700
|
||||
#message-view-timestamp-format=2006 Jan 02, 15:04 GMT-0700
|
||||
|
||||
#
|
||||
# If set, overrides timestamp-format in the message view for messages
|
||||
# that were received/sent today.
|
||||
#
|
||||
#message-view-this-day-time-format=
|
||||
|
||||
# If set, overrides timestamp-format in the message view for messages
|
||||
# that were received/sent within the last 7 days.
|
||||
#
|
||||
#message-view-this-week-time-format=
|
||||
|
||||
#
|
||||
# If set, overrides *timestamp-format* in the message view for messages
|
||||
# that were received/sent this year.
|
||||
#
|
||||
#message-view-this-year-time-format=
|
||||
|
||||
#
|
||||
# Width of the sidebar, including the border.
|
||||
#
|
||||
# Default: 22
|
||||
sidebar-width=22
|
||||
|
||||
#
|
||||
# Default split layout for message list tabs. The syntax is:
|
||||
#
|
||||
# [<direction>] <size>
|
||||
#
|
||||
# <direction> is optional and defaults to horizontal. It can take one
|
||||
# of the following values: h, horiz, horizontal, v, vert, vertical.
|
||||
#
|
||||
# <size> is a positive integer representing the size (in terminal cells)
|
||||
# of the message list window.
|
||||
#
|
||||
#message-list-split=
|
||||
|
||||
#
|
||||
# Message to display when viewing an empty folder.
|
||||
#
|
||||
# Default: (no messages)
|
||||
#empty-message=(no messages)
|
||||
|
||||
# Message to display when no folders exists or are all filtered
|
||||
#
|
||||
# Default: (no folders)
|
||||
#empty-dirlist=(no folders)
|
||||
#
|
||||
# Value to set {{.Subject}} template to when subject is empty.
|
||||
#
|
||||
# Default: (no subject)
|
||||
#empty-subject=(no subject)
|
||||
|
||||
# Enable mouse events in the ui, e.g. clicking and scrolling with the mousewheel
|
||||
#
|
||||
# Default: false
|
||||
mouse-enabled=false
|
||||
|
||||
#
|
||||
# Ring the bell when new messages are received
|
||||
#
|
||||
# Default: true
|
||||
#new-message-bell=true
|
||||
|
||||
#
|
||||
# Template to use for Account tab titles
|
||||
#
|
||||
# Default: {{.Account}}
|
||||
#tab-title-account={{.Account}}
|
||||
|
||||
#
|
||||
# Template to use for Composer tab titles
|
||||
#
|
||||
# Default: {{if .To}}to:{{index (.To | shortmboxes) 0}} {{end}}{{.SubjectBase}}
|
||||
#tab-title-composer={{if .To}}to:{{index (.To | shortmboxes) 0}} {{end}}{{.SubjectBase}}
|
||||
|
||||
#
|
||||
# Template to use for Message Viewer tab titles
|
||||
#
|
||||
# Default: {{.Subject}}
|
||||
#tab-title-viewer={{.Subject}}
|
||||
|
||||
|
||||
# Marker to show before a pinned tab's name.
|
||||
#
|
||||
# Default: `
|
||||
#pinned-tab-marker='`'
|
||||
|
||||
# Template for the left side of the directory list.
|
||||
# See aerc-templates(7) for all available fields and functions.
|
||||
#
|
||||
# Default: {{.Folder}}
|
||||
#dirlist-left={{.Folder}}
|
||||
|
||||
# Template for the right side of the directory list.
|
||||
# See aerc-templates(7) for all available fields and functions.
|
||||
#
|
||||
# Default: {{if .Unread}}{{humanReadable .Unread}}{{end}}
|
||||
#dirlist-right={{if .Unread}}{{humanReadable .Unread}}{{end}}
|
||||
|
||||
# Delay after which the messages are actually listed when entering a directory.
|
||||
# This avoids loading messages when skipping over folders and makes the UI more
|
||||
# responsive. If you do not want that, set it to 0s.
|
||||
#
|
||||
# Default: 200ms
|
||||
#dirlist-delay=200ms
|
||||
|
||||
# Display the directory list as a foldable tree that allows to collapse and
|
||||
# expand the folders.
|
||||
#
|
||||
# Default: false
|
||||
dirlist-tree=true
|
||||
|
||||
# If dirlist-tree is enabled, set level at which folders are collapsed by
|
||||
# default. Set to 0 to disable.
|
||||
#
|
||||
# Default: 0
|
||||
dirlist-collapse=1
|
||||
|
||||
# List of space-separated criteria to sort the messages by, see *sort*
|
||||
# command in *aerc*(1) for reference. Prefixing a criterion with "-r "
|
||||
# reverses that criterion.
|
||||
#
|
||||
# Example: "from -r date"
|
||||
#
|
||||
sort = -r date
|
||||
|
||||
# Moves to next message when the current message is deleted
|
||||
#
|
||||
# Default: true
|
||||
#next-message-on-delete=true
|
||||
|
||||
# Automatically set the "seen" flag when a message is opened in the message
|
||||
# viewer.
|
||||
#
|
||||
# Default: true
|
||||
#auto-mark-read=true
|
||||
|
||||
# The directories where the stylesets are stored. It takes a colon-separated
|
||||
# list of directories. If this is unset or if a styleset cannot be found, the
|
||||
# following paths will be used as a fallback in that order:
|
||||
#
|
||||
# ${XDG_CONFIG_HOME:-~/.config}/aerc/stylesets
|
||||
# ${XDG_DATA_HOME:-~/.local/share}/aerc/stylesets
|
||||
# /usr/local/share/aerc/stylesets
|
||||
# /usr/share/aerc/stylesets
|
||||
#
|
||||
#stylesets-dirs=
|
||||
|
||||
# Uncomment to use box-drawing characters for vertical and horizontal borders.
|
||||
#
|
||||
# Default: "│" and "─"
|
||||
#border-char-vertical="│"
|
||||
#border-char-horizontal="─"
|
||||
|
||||
# Sets the styleset to use for the aerc ui elements.
|
||||
#
|
||||
# Default: default
|
||||
#styleset-name=default
|
||||
|
||||
# Activates fuzzy search in commands and their arguments: the typed string is
|
||||
# searched in the command or option in any position, and need not be
|
||||
# consecutive characters in the command or option.
|
||||
#
|
||||
# Default: false
|
||||
#fuzzy-complete=false
|
||||
|
||||
# How long to wait after the last input before auto-completion is triggered.
|
||||
#
|
||||
# Default: 250ms
|
||||
#completion-delay=250ms
|
||||
|
||||
# The minimum required characters to allow auto-completion to be triggered after
|
||||
# completion-delay.
|
||||
#
|
||||
# Setting this to "manual" disables automatic completion, leaving only the
|
||||
# manually triggered completion with the $complete key (see aerc-binds(5) for
|
||||
# more details).
|
||||
#
|
||||
# Default: 1
|
||||
#completion-min-chars=1
|
||||
|
||||
#
|
||||
# Global switch for completion popovers
|
||||
#
|
||||
# Default: true
|
||||
#completion-popovers=true
|
||||
|
||||
# Uncomment to use UTF-8 symbols to indicate PGP status of messages
|
||||
#
|
||||
# Default: ASCII
|
||||
#icon-unencrypted=
|
||||
#icon-encrypted=✔
|
||||
#icon-signed=✔
|
||||
#icon-signed-encrypted=✔
|
||||
#icon-unknown=✘
|
||||
#icon-invalid=⚠
|
||||
|
||||
# Reverses the order of the message list. By default, the message list is
|
||||
# ordered with the newest (highest UID) message on top. Reversing the order
|
||||
# will put the oldest (lowest UID) message on top. This can be useful in cases
|
||||
# where the backend does not support sorting.
|
||||
#
|
||||
# Default: false
|
||||
#reverse-msglist-order = false
|
||||
|
||||
# Reverse display of the message threads. Default order is the initial
|
||||
# message is on the top with all the replies being displayed below. The
|
||||
# reverse option will put the initial message at the bottom with the
|
||||
# replies on top.
|
||||
#
|
||||
# Default: false
|
||||
#reverse-thread-order=false
|
||||
|
||||
# Positions the cursor on the last message in the message list (at the
|
||||
# bottom of the view) when opening a new folder.
|
||||
#
|
||||
# Default: false
|
||||
#select-last-message=false
|
||||
|
||||
# Sort the thread siblings according to the sort criteria for the messages. If
|
||||
# sort-thread-siblings is false, the thread siblings will be sorted based on
|
||||
# the message UID in ascending order. This option is only applicable for
|
||||
# client-side threading with a backend that enables sorting. Note that there's
|
||||
# a performance impact when sorting is activated.
|
||||
#
|
||||
# Default: false
|
||||
#sort-thread-siblings=false
|
||||
|
||||
# Set the scroll offset in number of lines from the top and bottom of the
|
||||
# message list.
|
||||
#
|
||||
# Default: 0
|
||||
#msglist-scroll-offset = 0
|
||||
|
||||
#
|
||||
# Enable a threaded view of messages. If this is not supported by the backend
|
||||
# (IMAP server or notmuch), threads will be built by the client.
|
||||
#
|
||||
# Default: false
|
||||
#threading-enabled=false
|
||||
|
||||
# Force client-side thread building
|
||||
#
|
||||
# Default: false
|
||||
#force-client-threads=false
|
||||
|
||||
# If no References nor In-Reply-To headers can be matched to build client side
|
||||
# threads, fallback to similar subjects.
|
||||
#
|
||||
# Default: false
|
||||
#threading-by-subject=false
|
||||
|
||||
# Show thread context enables messages which do not match the current query (or
|
||||
# belong to the current mailbox) to be shown for context. These messages can be
|
||||
# styled separately using "msglist_thread_context" in a styleset. This feature
|
||||
# is not supported by all backends
|
||||
#
|
||||
# Default: false
|
||||
#show-thread-context=false
|
||||
|
||||
# Debounce client-side thread building
|
||||
#
|
||||
# Default: 50ms
|
||||
#client-threads-delay=50ms
|
||||
|
||||
#
|
||||
# Thread prefix customization:
|
||||
|
||||
#
|
||||
# Customize the thread prefix appearance by selecting the arrow head.
|
||||
#
|
||||
# Default: ">"
|
||||
#thread-prefix-tip = ">"
|
||||
|
||||
#
|
||||
# Customize the thread prefix appearance by selecting the arrow indentation.
|
||||
#
|
||||
# Default: " "
|
||||
#thread-prefix-indent = " "
|
||||
|
||||
#
|
||||
# Customize the thread prefix appearance by selecting the vertical extension of
|
||||
# the arrow.
|
||||
#
|
||||
# Default: "│"
|
||||
#thread-prefix-stem = "│"
|
||||
|
||||
#
|
||||
# Customize the thread prefix appearance by selecting the horizontal extension
|
||||
# of the arrow.
|
||||
#
|
||||
# Default: ""
|
||||
#thread-prefix-limb = ""
|
||||
|
||||
#
|
||||
# Customize the thread prefix appearance by selecting the folded thread
|
||||
# indicator.
|
||||
#
|
||||
# Default: "+"
|
||||
#thread-prefix-folded = "+"
|
||||
|
||||
#
|
||||
# Customize the thread prefix appearance by selecting the unfolded thread
|
||||
# indicator.
|
||||
#
|
||||
# Default: ""
|
||||
#thread-prefix-unfolded = ""
|
||||
|
||||
#
|
||||
# Customize the thread prefix appearance by selecting the first child connector.
|
||||
#
|
||||
# Default: ""
|
||||
#thread-prefix-first-child = ""
|
||||
|
||||
#
|
||||
# Customize the thread prefix appearance by selecting the connector used if
|
||||
# the message has siblings.
|
||||
#
|
||||
# Default: "├─"
|
||||
#thread-prefix-has-siblings = "├─"
|
||||
|
||||
#
|
||||
# Customize the thread prefix appearance by selecting the connector used if the
|
||||
# message has no parents and no children.
|
||||
#
|
||||
# Default: ""
|
||||
#thread-prefix-lone = ""
|
||||
|
||||
#
|
||||
# Customize the thread prefix appearance by selecting the connector used if the
|
||||
# message has no parents and has children.
|
||||
#
|
||||
# Default: ""
|
||||
#thread-prefix-orphan = ""
|
||||
|
||||
#
|
||||
# Customize the thread prefix appearance by selecting the connector for the last
|
||||
# sibling.
|
||||
#
|
||||
# Default: "└─"
|
||||
#thread-prefix-last-sibling = "└─"
|
||||
|
||||
#
|
||||
# Customize the reversed thread prefix appearance by selecting the connector for
|
||||
# the last sibling.
|
||||
#
|
||||
# Default: "┌─"
|
||||
#thread-prefix-last-sibling-reverse = "┌─"
|
||||
|
||||
#
|
||||
# Customize the thread prefix appearance by selecting the connector for dummy
|
||||
# thread.
|
||||
#
|
||||
# Default: "┬─"
|
||||
#thread-prefix-dummy = "┬─"
|
||||
|
||||
#
|
||||
# Customize the reversed thread prefix appearance by selecting the connector for
|
||||
# dummy thread.
|
||||
#
|
||||
# Default: "┴─"
|
||||
#thread-prefix-dummy-reverse = "┴─"
|
||||
|
||||
#
|
||||
# Customize the reversed thread prefix appearance by selecting the first child
|
||||
# connector.
|
||||
#
|
||||
# Default: ""
|
||||
#thread-prefix-first-child-reverse = ""
|
||||
|
||||
#
|
||||
# Customize the reversed thread prefix appearance by selecting the connector
|
||||
# used if the message has no parents and has children.
|
||||
#
|
||||
# Default: ""
|
||||
#thread-prefix-orphan-reverse = ""
|
||||
|
||||
[statusline]
|
||||
#
|
||||
# Describes the format for the status line. This is a comma separated list of
|
||||
# column names with an optional align and width suffix. See [ui].index-columns
|
||||
# for more details. To completely mute the status line except for push
|
||||
# notifications, explicitly set status-columns to an empty string.
|
||||
#
|
||||
# Default: left<*,center:=,right>*
|
||||
#status-columns=left<*,center:=,right>*
|
||||
|
||||
#
|
||||
# Each name in status-columns must have a corresponding column-$name setting.
|
||||
# All column-$name settings accept golang text/template syntax. See
|
||||
# aerc-templates(7) for available template attributes and functions.
|
||||
#
|
||||
# Default settings
|
||||
#column-left=[{{.Account}}] {{.StatusInfo}}
|
||||
#column-center={{.PendingKeys}}
|
||||
#column-right={{.TrayInfo}} | {{cwd}}
|
||||
|
||||
#
|
||||
# String separator inserted between columns.
|
||||
# See [ui].column-separator for more details.
|
||||
#
|
||||
#column-separator=" "
|
||||
|
||||
# Specifies the separator between grouped statusline elements.
|
||||
#
|
||||
# Default: " | "
|
||||
#separator=" | "
|
||||
|
||||
# Defines the mode for displaying the status elements.
|
||||
# Options: text, icon
|
||||
#
|
||||
# Default: text
|
||||
#display-mode=text
|
||||
|
||||
[viewer]
|
||||
# pager=less -Rc
|
||||
pager= bat --style=plain --paging=always
|
||||
# html-unsafe-images=false
|
||||
# html-filter=dante
|
||||
image/*=chafa -f kitty -s ${width}x${height}
|
||||
text/html=w3m -T text/html -dump -o display_link_number=1
|
||||
application/pdf=zathura
|
||||
video/*=mpv
|
||||
header-layout=From,To,Subject,Date
|
||||
|
||||
|
||||
#w3m -dump -T text/html -o display_link_number=1
|
||||
#
|
||||
# Specifies the pager to use when displaying emails. Note that some filters
|
||||
# may add ANSI codes to add color to rendered emails, so you may want to use a
|
||||
# pager which supports ANSI codes.
|
||||
#
|
||||
# Default: less -Rc
|
||||
|
||||
#
|
||||
# If an email offers several versions (multipart), you can configure which
|
||||
# mimetype to prefer. For example, this can be used to prefer plaintext over
|
||||
# html emails.
|
||||
#
|
||||
# Default: text/plain,text/html
|
||||
#alternatives=text/plain,text/html
|
||||
|
||||
#
|
||||
# Default setting to determine whether to show full headers or only parsed
|
||||
# ones in message viewer.
|
||||
#
|
||||
# Default: false
|
||||
#show-headers=false
|
||||
|
||||
#
|
||||
# Layout of headers when viewing a message. To display multiple headers in the
|
||||
# same row, separate them with a pipe, e.g. "From|To". Rows will be hidden if
|
||||
# none of their specified headers are present in the message.
|
||||
#
|
||||
# Default: From|To,Cc|Bcc,Date,Subject
|
||||
#header-layout=From|To,Cc|Bcc,Date,Subject
|
||||
|
||||
# Whether to always show the mimetype of an email, even when it is just a single part
|
||||
#
|
||||
# Default: false
|
||||
#always-show-mime=false
|
||||
|
||||
# Define the maximum height of the mimetype switcher before a scrollbar is used.
|
||||
# The height of the mimetype switcher is restricted to half of the display
|
||||
# height. If the provided value for the height is zero, the number of parts will
|
||||
# be used as the height of the type switcher.
|
||||
#
|
||||
# Default: 0
|
||||
#max-mime-height = 0
|
||||
|
||||
# Parses and extracts http links when viewing a message. Links can then be
|
||||
# accessed with the open-link command.
|
||||
#
|
||||
# Default: true
|
||||
#parse-http-links=true
|
||||
|
||||
[compose]
|
||||
editor=nvim +'set ft=mail.markdown'
|
||||
|
||||
# editor=nvim +setf\ mail
|
||||
# editor=nvim # or your preferred editor
|
||||
# Address book command
|
||||
address-book-cmd=abook --mutt-query '%s'
|
||||
|
||||
# Auto-complete addresses
|
||||
# address-book-cmd-match='%s'
|
||||
# address-book-cmd=abook --mutt-query '%s'
|
||||
# terminal, though it may also launch a graphical window if the environment
|
||||
# supports it. Defaults to $EDITOR, or vi.
|
||||
#editor=
|
||||
|
||||
#
|
||||
# When set, aerc will create and read .eml files for composing that have
|
||||
# non-standard \n linebreaks. This is only relevant if the used editor does not
|
||||
# support CRLF linebreaks.
|
||||
#
|
||||
#lf-editor=false
|
||||
|
||||
#
|
||||
# Default header fields to display when composing a message. To display
|
||||
# multiple headers in the same row, separate them with a pipe, e.g. "To|From".
|
||||
#
|
||||
# Default: To|From,Subject
|
||||
#header-layout=To|From,Subject
|
||||
|
||||
#
|
||||
# Edit headers into the text editor instead than separate fields.
|
||||
#
|
||||
# When this is true, address-book-cmd is not supported and address completion
|
||||
# is left to the editor itself. Also, displaying multiple headers on the same
|
||||
# line is not possible.
|
||||
#
|
||||
# Default: false
|
||||
edit-headers=true
|
||||
|
||||
#
|
||||
# Sets focus to the email body when the composer window opens.
|
||||
#
|
||||
# Default: false
|
||||
#focus-body=false
|
||||
|
||||
#
|
||||
# Specifies the command to be used to tab-complete email addresses. Any
|
||||
# occurrence of "%s" in the address-book-cmd will be replaced with what the
|
||||
# user has typed so far.
|
||||
#
|
||||
# The command must output the completions to standard output, one completion
|
||||
# per line. Each line must be tab-delimited, with an email address occurring as
|
||||
# the first field. Only the email address field is required. The second field,
|
||||
# if present, will be treated as the contact name. Additional fields are
|
||||
# ignored.
|
||||
#
|
||||
# This parameter can also be set per account in accounts.conf.
|
||||
#address-book-cmd=
|
||||
|
||||
# Specifies the command to be used to select attachments. Any occurrence of
|
||||
# '%s' in the file-picker-cmd will be replaced with the argument <arg>
|
||||
# to :attach -m <arg>. Any occurrence of '%f' will be replaced by the
|
||||
# location of a temporary file, from which aerc will read the selected files.
|
||||
#
|
||||
# If '%f' is not present, the command must output the selected files to
|
||||
# standard output, one file per line. If it is present, then aerc does not
|
||||
# capture the standard output and instead reads the files from the temporary
|
||||
# file which should have the same format.
|
||||
#file-picker-cmd=/home/liph/.local/bin/yazi-picker %f
|
||||
|
||||
#
|
||||
# Allow to address yourself when replying
|
||||
#
|
||||
# Default: true
|
||||
#reply-to-self=true
|
||||
|
||||
# Warn before sending an email with an empty subject.
|
||||
#
|
||||
# Default: false
|
||||
#empty-subject-warning=false
|
||||
|
||||
#
|
||||
# Warn before sending an email that matches the specified regexp but does not
|
||||
# have any attachments. Leave empty to disable this feature.
|
||||
#
|
||||
# Uses Go's regexp syntax, documented at https://golang.org/s/re2syntax. The
|
||||
# "(?im)" flags are set by default (case-insensitive and multi-line).
|
||||
#
|
||||
# Example:
|
||||
# no-attachment-warning=^[^>]*attach(ed|ment)
|
||||
#
|
||||
#no-attachment-warning=
|
||||
|
||||
#
|
||||
# When set, aerc will generate "format=flowed" bodies with a content type of
|
||||
# "text/plain; format=flowed" as described in RFC3676. This format is easier to
|
||||
# handle for some mailing software, and generally just looks like ordinary
|
||||
# text. To actually make use of this format's features, you'll need support in
|
||||
# your editor.
|
||||
#
|
||||
format-flowed=false
|
||||
|
||||
[multipart-converters]
|
||||
text/html=/home/liph/.local/bin/aerc-md-convert
|
||||
|
||||
[filters]
|
||||
#
|
||||
text/plain=sed 's/^$//'
|
||||
|
||||
# Filters allow you to pipe an email body through a shell command to render
|
||||
# certain emails differently, e.g. highlighting them with ANSI escape codes.
|
||||
#
|
||||
# The commands are invoked with sh -c. The following folders are prepended to
|
||||
# the system $PATH to allow referencing filters from their name only:
|
||||
#
|
||||
# ${XDG_CONFIG_HOME:-~/.config}/aerc/filters
|
||||
# ~/.local/libexec/aerc/filters
|
||||
# ${XDG_DATA_HOME:-~/.local/share}/aerc/filters
|
||||
# $PREFIX/libexec/aerc/filters
|
||||
# $PREFIX/share/aerc/filters
|
||||
# /usr/libexec/aerc/filters
|
||||
# /usr/share/aerc/filters
|
||||
#
|
||||
# If you want to run a program in your default $PATH which has the same name
|
||||
# as a builtin filter (e.g. /usr/bin/colorize), use its absolute path.
|
||||
#
|
||||
# The following variables are defined in the filter command environment:
|
||||
#
|
||||
# AERC_MIME_TYPE the part MIME type/subtype
|
||||
# AERC_FORMAT the part content type format= parameter
|
||||
# AERC_FILENAME the attachment filename (if any)
|
||||
# AERC_SUBJECT the message Subject header value
|
||||
# AERC_FROM the message From header value
|
||||
#
|
||||
# The first filter which matches the email's mimetype will be used, so order
|
||||
# them from most to least specific.
|
||||
#
|
||||
# You can also match on non-mimetypes, by prefixing with the header to match
|
||||
# against (non-case-sensitive) and a comma, e.g. subject,text will match a
|
||||
# subject which contains "text". Use header,~regex to match against a regex.
|
||||
#
|
||||
text/plain=colorize
|
||||
text/calendar=calendar
|
||||
message/delivery-status=colorize
|
||||
message/rfc822=colorize
|
||||
text/html=w3m -T text/html -dump -o display_link_number=1
|
||||
#text/*=bat -fP --file-name="$AERC_FILENAME"
|
||||
#application/x-sh=bat -fP -l sh
|
||||
#image/*=catimg -w $(tput cols) -
|
||||
#subject,~Git(hub|lab)=lolcat -f
|
||||
#from,thatguywhodoesnothardwraphismessages=wrap -w 100 | colorize
|
||||
|
||||
# This special filter is only used to post-process email headers when
|
||||
# [viewer].show-headers=true
|
||||
# By default, headers are piped directly into the pager.
|
||||
#
|
||||
.headers=colorize
|
||||
|
||||
[openers]
|
||||
#
|
||||
# Openers allow you to specify the command to use for the :open and :open-link
|
||||
# actions on a per-MIME-type basis. The :open-link URL scheme is used to
|
||||
# determine the MIME type as follows: x-scheme-handler/<scheme>.
|
||||
#
|
||||
# {} is expanded as the temporary filename or URL to be opened with proper
|
||||
# shell quoting. If it is not encountered in the command, the filename/URL will
|
||||
# be appended to the end of the command. The command will then be executed with
|
||||
# `sh -c`.
|
||||
#
|
||||
# Like [filters], openers support basic shell globbing. The first opener which
|
||||
# matches the part's MIME type (or URL scheme handler MIME type) will be used,
|
||||
# so order them from most to least specific.
|
||||
#
|
||||
# Examples:
|
||||
# x-scheme-handler/irc=hexchat
|
||||
# x-scheme-handler/http*=printf '%s' {} | wl-copy
|
||||
# text/html=surf -dfgms
|
||||
# text/plain=gvim {} +125
|
||||
# message/rfc822=thunderbird
|
||||
text/html=w3m
|
||||
x-scheme-handler/http=librewolf
|
||||
x-scheme-handler/https=librewolf
|
||||
text/calendar=khal import --batch
|
||||
|
||||
[hooks]
|
||||
#
|
||||
# Hooks are triggered whenever the associated event occurs.
|
||||
|
||||
#
|
||||
# Executed when a new email arrives in the selected folder
|
||||
#mail-received=notify-send "[$AERC_ACCOUNT/$AERC_FOLDER] New mail from $AERC_FROM_NAME" "$AERC_SUBJECT"
|
||||
|
||||
#
|
||||
# Executed when mail is deleted from a folder
|
||||
#mail-deleted=mbsync "$AERC_ACCOUNT:$AERC_FOLDER" &
|
||||
|
||||
#
|
||||
# Executed when aerc adds mail to a folder
|
||||
#mail-added=mbsync "$AERC_ACCOUNT:$AERC_FOLDER" &
|
||||
|
||||
#
|
||||
# Executed when aerc starts
|
||||
#aerc-startup=aerc :terminal calcurse && aerc :next-tab
|
||||
|
||||
#
|
||||
# Executed when aerc shuts down.
|
||||
#aerc-shutdown=
|
||||
|
||||
#
|
||||
# Executed when notmuch tags are modified.
|
||||
#tag-modified=
|
||||
|
||||
#
|
||||
# Executed when flags are changed on a message.
|
||||
#flag-changed=mbsync "$AERC_ACCOUNT:$AERC_FOLDER" &
|
||||
|
||||
[templates]
|
||||
# Templates are used to populate email bodies automatically.
|
||||
|
||||
###
|
||||
new-message=new-msg
|
||||
quoted-reply=reply-quoted
|
||||
|
||||
|
||||
# The directories where the templates are stored. It takes a colon-separated
|
||||
# list of directories. If this is unset or if a template cannot be found, the
|
||||
# following paths will be used as a fallback in that order:
|
||||
#
|
||||
# ${XDG_CONFIG_HOME:-~/.config}/aerc/templates
|
||||
# ${XDG_DATA_HOME:-~/.local/share}/aerc/templates
|
||||
# /usr/local/share/aerc/templates
|
||||
# /usr/share/aerc/templates
|
||||
#
|
||||
template-dirs=${XDG_CONFIG_HOME:-~/.config}/aerc/templates
|
||||
|
||||
# The default template to be used for new messages.
|
||||
#
|
||||
# default: new_message
|
||||
#new-message=new_message
|
||||
|
||||
# The default template to be used for quoted replies.
|
||||
#
|
||||
# default: quoted_reply
|
||||
#quoted-reply=quoted_reply
|
||||
|
||||
# The default template to be used for forward as body.
|
||||
#
|
||||
# default: forward_as_body
|
||||
#forwards=forward_as_body
|
||||
@@ -3,11 +3,16 @@
|
||||
|
||||
# GLOBAL Navigation & Contacts
|
||||
( = :term abook<Enter>
|
||||
,c = :term abook<Enter>
|
||||
,ab = :term abook<Enter>
|
||||
<C-p> = :prev-tab<Enter>
|
||||
<C-n> = :next-tab<Enter>
|
||||
<C-t> = :term<Enter>
|
||||
,ca = :term khal interactive<Enter>
|
||||
,c1 = :term khal interactive -a personal<Enter>
|
||||
,c2 = :term khal interactive -a healplaylove<Enter>
|
||||
,c3 = :term khal interactive -a glarisegg<Enter>
|
||||
,ta = :term taskwarrior-tui<Enter>
|
||||
|
||||
<A-p> = :prev-tab<Enter>
|
||||
<A-n> = :next-tab<Enter>
|
||||
<C-t> = :terminal<Enter>
|
||||
? = :help keys<Enter>
|
||||
<C-c> = :prompt 'Quit?' quit<Enter>
|
||||
<C-q> = :prompt 'Quit?' quit<Enter>
|
||||
@@ -26,6 +31,16 @@ g = :select 0<Enter>
|
||||
G = :select -1<Enter>
|
||||
J = :next-folder<Enter>
|
||||
K = :prev-folder<Enter>
|
||||
H = :collapse-folder<Enter>
|
||||
L = :expand-folder<Enter>
|
||||
<Left> = :collapse-folder<Enter>
|
||||
<Right> = :expand-folder<Enter>
|
||||
|
||||
# Marking/Flagging
|
||||
v = :mark -v<Enter>
|
||||
V = :mark -t<Enter>
|
||||
<Space> = :mark -t<Enter>:next<Enter>
|
||||
<Esc> = :unmark -a<Enter>
|
||||
|
||||
# Accounts
|
||||
,1 = :change-tab phil<Enter>
|
||||
@@ -38,7 +53,7 @@ K = :prev-folder<Enter>
|
||||
,n = :cf Newsletters<Enter>
|
||||
,f = :cf Finance<Enter>
|
||||
,s = :cf Shopping<Enter>
|
||||
,t = :cf Travel<Enter>
|
||||
,v = :cf Travel<Enter>
|
||||
,d = :cf Development<Enter>
|
||||
,x = :cf Spam<Enter>
|
||||
,tr = :cf Trash<Enter>
|
||||
@@ -46,6 +61,8 @@ K = :prev-folder<Enter>
|
||||
|
||||
# Actions
|
||||
<Enter> = :view<Enter>
|
||||
s = :split<Enter>
|
||||
S = :vsplit<Enter>
|
||||
d = :modify-labels +deleted -inbox<Enter>
|
||||
a = :archive flat<Enter>
|
||||
C = :compose<Enter>
|
||||
@@ -69,13 +86,9 @@ za = :fold -t<Enter>
|
||||
<Enter> = :recall<Enter>
|
||||
|
||||
[view]
|
||||
# Navigation & UI
|
||||
q = :close<Enter>
|
||||
x = :close<Enter>
|
||||
o = :open<Enter>
|
||||
O = :open<Enter>
|
||||
s = :save<Enter>
|
||||
S = :save<space>
|
||||
,sa = :save -a<Enter>
|
||||
| = :pipe<space>
|
||||
D = :delete<Enter>
|
||||
A = :archive flat<Enter>
|
||||
@@ -87,16 +100,16 @@ Rq = :reply -q<Enter>
|
||||
H = :toggle-headers<Enter>
|
||||
,l = :pipe urlscan<Enter>
|
||||
|
||||
# Attachment handling
|
||||
# Attachment Handling
|
||||
n = :next-part<Enter>
|
||||
p = :prev-part<Enter>
|
||||
<C-j> = :next-part<Enter>
|
||||
<C-k> = :prev-part<Enter>
|
||||
s = :pipe -m /home/liph/.local/bin/save-attachment<Enter>
|
||||
S = :save<space>
|
||||
J = :next<Enter>
|
||||
K = :prev<Enter>
|
||||
o = :open<Enter>
|
||||
O = :open<Enter>
|
||||
,sa = :save -a<Enter>
|
||||
s = :save ~/Downloads/<Enter>
|
||||
S = :save<space>
|
||||
,sa = :save -a ~/Downloads/<Enter>
|
||||
|
||||
[view::passthrough]
|
||||
$noinherit = true
|
||||
@@ -111,8 +124,8 @@ $complete = <C-o>
|
||||
<C-k> = :attach<space>
|
||||
<C-a> = :attach<space>
|
||||
<F4> = :attach<space>
|
||||
<C-p> = :prev-tab<Enter>
|
||||
<C-n> = :next-tab<Enter>
|
||||
<A-p> = :prev-tab<Enter>
|
||||
<A-n> = :next-tab<Enter>
|
||||
<tab> = :next-field<Enter>
|
||||
<backtab> = :prev-field<Enter>
|
||||
|
||||
@@ -126,20 +139,23 @@ $ex = <C-x>
|
||||
|
||||
[compose::review]
|
||||
# After exiting the editor
|
||||
y = :send<Enter>
|
||||
y = :multipart text/html<Enter>:send<Enter>
|
||||
n = :abort<Enter>
|
||||
v = :preview<Enter>
|
||||
p = :postpone<Enter>
|
||||
q = :choose -o d discard abort -o p postpone postpone<Enter>
|
||||
e = :edit<Enter>
|
||||
a = :attach<space>
|
||||
A = :attach<space>
|
||||
<C-k> = :attach<space>
|
||||
<C-a> = :attach<space>
|
||||
d = :detach<space>
|
||||
|
||||
[terminal]
|
||||
$noinherit = true
|
||||
# Clear keys to allow passthrough to Khal/Taskwarrior
|
||||
$ex = <C-x>
|
||||
<C-p> = :prev-tab<Enter>
|
||||
<C-n> = :next-tab<Enter>
|
||||
<C-p> =
|
||||
<C-n> =
|
||||
<tab> =
|
||||
<backtab> =
|
||||
<A-p> = :prev-tab<Enter>
|
||||
<A-n> = :next-tab<Enter>
|
||||
|
||||
@@ -0,0 +1,146 @@
|
||||
# Binds are of the form <key sequence> = <command to run>
|
||||
# To use '=' in a key sequence, substitute it with "Eq": "<Ctrl+Eq>"
|
||||
|
||||
# GLOBAL Navigation & Contacts
|
||||
( = :term abook<Enter>
|
||||
,ab = :term abook<Enter>
|
||||
,ca = :term khal interactive<Enter>
|
||||
<C-p> = :prev-tab<Enter>
|
||||
<C-n> = :next-tab<Enter>
|
||||
<C-t> = :terminal<Enter>
|
||||
? = :help keys<Enter>
|
||||
<C-c> = :prompt 'Quit?' quit<Enter>
|
||||
<C-q> = :prompt 'Quit?' quit<Enter>
|
||||
<C-z> = :suspend<Enter>
|
||||
|
||||
[messages]
|
||||
# Sync
|
||||
u = :term /home/liph/.local/bin/mailsync<Enter>
|
||||
|
||||
# Navigation
|
||||
j = :next<Enter>
|
||||
k = :prev<Enter>
|
||||
<Down> = :next<Enter>
|
||||
<Up> = :prev<Enter>
|
||||
g = :select 0<Enter>
|
||||
G = :select -1<Enter>
|
||||
J = :next-folder<Enter>
|
||||
K = :prev-folder<Enter>
|
||||
H = :collapse-folder<Enter>
|
||||
L = :expand-folder<Enter>
|
||||
<Left> = :collapse-folder<Enter>
|
||||
<Right> = :expand-folder<Enter>
|
||||
|
||||
# Accounts
|
||||
,1 = :change-tab phil<Enter>
|
||||
,2 = :change-tab spam<Enter>
|
||||
,3 = :change-tab proton<Enter>
|
||||
|
||||
# Folders
|
||||
,i = :cf Inbox<Enter>
|
||||
,u = :cf Unread<Enter>
|
||||
,n = :cf Newsletters<Enter>
|
||||
,f = :cf Finance<Enter>
|
||||
,s = :cf Shopping<Enter>
|
||||
,t = :cf Travel<Enter>
|
||||
,d = :cf Development<Enter>
|
||||
,x = :cf Spam<Enter>
|
||||
,tr = :cf Trash<Enter>
|
||||
,am = :cf All Mail<Enter>
|
||||
|
||||
# Actions
|
||||
<Enter> = :view<Enter>
|
||||
s = :split<Enter>
|
||||
S = :vsplit<Enter>
|
||||
d = :modify-labels +deleted -inbox<Enter>
|
||||
a = :archive flat<Enter>
|
||||
C = :compose<Enter>
|
||||
m = :compose<Enter>
|
||||
rr = :reply -a<Enter>
|
||||
rq = :reply -aq<Enter>
|
||||
Rr = :reply<Enter>
|
||||
Rq = :reply -q<Enter>
|
||||
/ = :search<space>
|
||||
\ = :filter<space>
|
||||
n = :next-result<Enter>
|
||||
N = :prev-result<Enter>
|
||||
|
||||
# Threads
|
||||
T = :toggle-threads<Enter>
|
||||
zc = :fold<Enter>
|
||||
zo = :unfold<Enter>
|
||||
za = :fold -t<Enter>
|
||||
|
||||
[messages:folder=Drafts]
|
||||
<Enter> = :recall<Enter>
|
||||
|
||||
[view]
|
||||
# Navigation & UI
|
||||
q = :close<Enter>
|
||||
x = :close<Enter>
|
||||
| = :pipe<space>
|
||||
D = :delete<Enter>
|
||||
A = :archive flat<Enter>
|
||||
f = :forward<Enter>
|
||||
rr = :reply -a<Enter>
|
||||
rq = :reply -aq<Enter>
|
||||
Rr = :reply<Enter>
|
||||
Rq = :reply -q<Enter>
|
||||
H = :toggle-headers<Enter>
|
||||
,l = :pipe urlscan<Enter>
|
||||
|
||||
# Attachment Handling
|
||||
n = :next-part<Enter>
|
||||
p = :prev-part<Enter>
|
||||
J = :next<Enter>
|
||||
K = :prev<Enter>
|
||||
o = :open<Enter>
|
||||
O = :open<Enter>
|
||||
s = :pipe -m /home/liph/.local/bin/save-attachment<Enter>
|
||||
S = :save<space>
|
||||
,sa = :save -a<Enter>
|
||||
|
||||
[view::passthrough]
|
||||
$noinherit = true
|
||||
$ex = <C-x>
|
||||
<Esc> = :toggle-key-passthrough<Enter>
|
||||
|
||||
[compose]
|
||||
# General compose view
|
||||
$noinherit = true
|
||||
$ex = <C-x>
|
||||
$complete = <C-o>
|
||||
<C-k> = :attach<space>
|
||||
<C-a> = :attach<space>
|
||||
<F4> = :attach<space>
|
||||
<C-p> = :prev-tab<Enter>
|
||||
<C-n> = :next-tab<Enter>
|
||||
<tab> = :next-field<Enter>
|
||||
<backtab> = :prev-field<Enter>
|
||||
|
||||
[compose::editor]
|
||||
# While focused in the text editor (nvim)
|
||||
$noinherit = true
|
||||
$ex = <C-x>
|
||||
<C-k> = :attach<space>
|
||||
<C-a> = :attach<space>
|
||||
<F4> = :attach<space>
|
||||
|
||||
[compose::review]
|
||||
# After exiting the editor
|
||||
y = :multipart text/html<Enter>:send<Enter>
|
||||
n = :abort<Enter>
|
||||
v = :preview<Enter>
|
||||
p = :postpone<Enter>
|
||||
q = :choose -o d discard abort -o p postpone postpone<Enter>
|
||||
e = :edit<Enter>
|
||||
a = :attach<space>
|
||||
<C-k> = :attach<space>
|
||||
<C-a> = :attach<space>
|
||||
d = :detach<space>
|
||||
|
||||
[terminal]
|
||||
$noinherit = true
|
||||
$ex = <C-x>
|
||||
<C-p> = :prev-tab<Enter>
|
||||
<C-n> = :next-tab<Enter>
|
||||
@@ -1,42 +1,37 @@
|
||||
# Priority Management
|
||||
Priority 1=tag:priority1 and tag:inbox
|
||||
Priority 2=tag:priority2 and tag:inbox
|
||||
All Priority=tag:priority1 or tag:priority2
|
||||
Priority/1=tag:priority1 and tag:inbox and not tag:deleted and not tag:spam
|
||||
Priority/2=tag:priority2 and tag:inbox and not tag:deleted and not tag:spam
|
||||
Priority/All=(tag:priority1 or tag:priority2) and not tag:deleted and not tag:spam
|
||||
|
||||
# Main Views
|
||||
Inbox=tag:inbox
|
||||
Unread=tag:unread
|
||||
Starred=tag:flagged or tag:starred
|
||||
Inbox=tag:inbox and not tag:deleted and not tag:spam and not (from:@makesomebreathingspace.com or from:@healplaylove.ch or from:@circle.so)
|
||||
Unread=tag:unread and not tag:deleted and not tag:spam
|
||||
Starred=(tag:flagged or tag:starred) and not tag:deleted and not tag:spam
|
||||
Archive=not tag:inbox and not tag:spam and not tag:deleted
|
||||
Sent=folder:Sent or tag:sent
|
||||
Drafts=folder:Drafts or tag:draft
|
||||
Spam=tag:spam or folder:Spam
|
||||
Trash=tag:deleted or folder:Trash
|
||||
Mail/Sent=(folder:Sent or tag:sent) and not tag:deleted
|
||||
Mail/Drafts=folder:Drafts or tag:draft
|
||||
Mail/Spam=tag:spam and not tag:deleted
|
||||
Mail/Trash=tag:deleted
|
||||
|
||||
# Categories
|
||||
# Work=tag:work and tag:inbox
|
||||
# Personal=tag:personal and tag:inbox
|
||||
Finance=tag:finance and tag:inbox
|
||||
# Social=tag:social and tag:inbox
|
||||
# Mailing Lists=tag:mailinglist and tag:inbox
|
||||
Newsletters=tag:newsletter and tag:inbox
|
||||
# Automated=tag:automated
|
||||
Finance=tag:finance and tag:inbox and not tag:deleted and not tag:spam
|
||||
Newsletters=tag:newsletter and tag:inbox and not tag:deleted and not tag:spam
|
||||
|
||||
# Time-based
|
||||
Today=date:today and tag:inbox
|
||||
This Week=date:week and tag:inbox
|
||||
This Month=date:month and tag:inbox
|
||||
Last 7 Days=date:7days..today
|
||||
Time/Today=date:today and tag:inbox and not tag:deleted and not tag:spam
|
||||
Time/This Week=date:6days..today and tag:inbox and not tag:deleted and not tag:spam
|
||||
Time/This Month=date:month and tag:inbox and not tag:deleted and not tag:spam
|
||||
Time/Last 7 Days=date:7days..today and not tag:deleted and not tag:spam
|
||||
|
||||
# Special Queries
|
||||
Needs Reply=tag:inbox and not tag:replied
|
||||
Attachments=tag:attachment and tag:inbox
|
||||
Important=tag:flagged or tag:priority1
|
||||
Action Required=tag:todo or tag:followup
|
||||
Needs Reply=tag:inbox and not tag:replied and not tag:deleted and not tag:spam
|
||||
Attachments=tag:attachment and tag:inbox and not tag:deleted and not tag:spam
|
||||
Important=(tag:flagged or tag:priority1) and not tag:deleted and not tag:spam
|
||||
Action Required=(tag:todo or tag:followup) and not tag:deleted and not tag:spam
|
||||
|
||||
# Unprocessed
|
||||
New Mail=tag:new
|
||||
Untagged=tag:inbox and not tag:priority1 and not tag:priority2 and not tag:work and not tag:personal and not tag:finance
|
||||
New Mail=tag:new and not tag:deleted and not tag:spam
|
||||
Untagged=tag:inbox and not tag:priority1 and not tag:priority2 and not tag:work and not tag:personal and not tag:finance and not tag:deleted and not tag:spam
|
||||
|
||||
# All Mail
|
||||
Everything=*
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
# Standard Main Views
|
||||
Inbox=tag:inbox and not tag:deleted and not tag:spam and not (from:@makesomebreathingspace.com or from:@healplaylove.ch or from:@circle.so)
|
||||
Unread=tag:unread and not tag:deleted and not tag:spam
|
||||
Starred=(tag:flagged or tag:starred) and not tag:deleted and not tag:spam
|
||||
Archive=not tag:inbox and not tag:spam and not tag:deleted
|
||||
Mail/Sent=(folder:Sent or tag:sent) and not tag:deleted
|
||||
Mail/Drafts=folder:Drafts or tag:draft
|
||||
Mail/Spam=tag:spam and not tag:deleted
|
||||
Mail/Trash=tag:deleted
|
||||
|
||||
# Community Folder Stack
|
||||
Community=(from:@makesomebreathingspace.com or from:@healplaylove.ch or from:@circle.so) and date:today and not tag:deleted and not tag:spam
|
||||
|
||||
# Community - Breathing Space
|
||||
Community/Breathing Space=from:@makesomebreathingspace.com and not tag:deleted and not tag:spam
|
||||
Community/Breathing Space/Today=from:@makesomebreathingspace.com and date:today and not tag:deleted and not tag:spam
|
||||
Community/Breathing Space/This Week=from:@makesomebreathingspace.com and date:6days..today and not tag:deleted and not tag:spam
|
||||
|
||||
# Community - Heal Play Love
|
||||
Community/Heal Play Love=(from:@healplaylove.ch or from:@circle.so) and not tag:deleted and not tag:spam
|
||||
Community/Heal Play Love/Today=(from:@healplaylove.ch or from:@circle.so) and date:today and not tag:deleted and not tag:spam
|
||||
Community/Heal Play Love/This Week=(from:@healplaylove.ch or from:@circle.so) and date:6days..today and not tag:deleted and not tag:spam
|
||||
|
||||
# Categories
|
||||
Finance=tag:finance and tag:inbox and not tag:deleted and not tag:spam
|
||||
Newsletters=tag:newsletter and tag:inbox and not tag:deleted and not tag:spam
|
||||
|
||||
# Priority Management
|
||||
Priority/1=tag:priority1 and tag:inbox and not tag:deleted and not tag:spam
|
||||
Priority/2=tag:priority2 and tag:inbox and not tag:deleted and not tag:spam
|
||||
Priority/All=(tag:priority1 or tag:priority2) and not tag:deleted and not tag:spam
|
||||
|
||||
# Time-based
|
||||
Time/Today=date:today and tag:inbox and not tag:deleted and not tag:spam
|
||||
Time/This Week=date:week and tag:inbox and not tag:deleted and not tag:spam
|
||||
Time/Last 7 Days=date:7days..today and not tag:deleted and not tag:spam
|
||||
|
||||
# Status/Action
|
||||
Action/Needs Reply=tag:inbox and not tag:replied and not tag:deleted and not tag:spam
|
||||
Action/Important=(tag:flagged or tag:priority1) and not tag:deleted and not tag:spam
|
||||
Action/Todo=(tag:todo or tag:followup) and not tag:deleted and not tag:spam
|
||||
|
||||
# All Mail
|
||||
Everything=*
|
||||
@@ -0,0 +1,35 @@
|
||||
# Standard Main Views
|
||||
Inbox=tag:inbox and not tag:deleted and not tag:spam
|
||||
Unread=tag:unread and not tag:deleted and not tag:spam
|
||||
Starred=(tag:flagged or tag:starred) and not tag:deleted and not tag:spam
|
||||
Archive=not tag:inbox and not tag:spam and not tag:deleted
|
||||
Mail/Sent=(folder:Sent or tag:sent) and not tag:deleted
|
||||
Mail/Drafts=folder:Drafts or tag:draft
|
||||
Mail/Spam=tag:spam and not tag:deleted
|
||||
Mail/Trash=tag:deleted
|
||||
|
||||
# Community Folder Stack
|
||||
Community/Breathing Space=from:@makesomebreathingspace.com and not tag:deleted and not tag:spam
|
||||
Community/Heal Play Love=(from:@healplaylove.ch or from:@circle.so) and not tag:deleted and not tag:spam
|
||||
|
||||
# Categories
|
||||
Finance=tag:finance and tag:inbox and not tag:deleted and not tag:spam
|
||||
Newsletters=tag:newsletter and tag:inbox and not tag:deleted and not tag:spam
|
||||
|
||||
# Priority Management
|
||||
Priority/1=tag:priority1 and tag:inbox and not tag:deleted and not tag:spam
|
||||
Priority/2=tag:priority2 and tag:inbox and not tag:deleted and not tag:spam
|
||||
Priority/All=(tag:priority1 or tag:priority2) and not tag:deleted and not tag:spam
|
||||
|
||||
# Time-based
|
||||
Time/Today=date:today and tag:inbox and not tag:deleted and not tag:spam
|
||||
Time/This Week=date:week and tag:inbox and not tag:deleted and not tag:spam
|
||||
Time/Last 7 Days=date:7days..today and not tag:deleted and not tag:spam
|
||||
|
||||
# Status/Action
|
||||
Action/Needs Reply=tag:inbox and not tag:replied and not tag:deleted and not tag:spam
|
||||
Action/Important=(tag:flagged or tag:priority1) and not tag:deleted and not tag:spam
|
||||
Action/Todo=(tag:todo or tag:followup) and not tag:deleted and not tag:spam
|
||||
|
||||
# All Mail
|
||||
Everything=*
|
||||
@@ -27,6 +27,8 @@ msglist_flagged.fg=#f9e2af
|
||||
msglist_flagged.bold=true
|
||||
msglist_result.fg=#458588
|
||||
msglist_result.bold=true
|
||||
msglist_marked.fg=#d3869b
|
||||
msglist_marked.bold=true
|
||||
msglist_*.selected.bold=true
|
||||
msglist_*.selected.bg=#ebdbb2
|
||||
|
||||
@@ -38,6 +40,10 @@ statusline_default.bg=#282828
|
||||
statusline_error.bold=true
|
||||
statusline_success.bold=true
|
||||
|
||||
[user]
|
||||
folder_sub.fg=#fabd2f
|
||||
folder_sub.bold=true
|
||||
|
||||
[viewer]
|
||||
url.fg=#458588
|
||||
url.underline=true
|
||||
|
||||
@@ -1,18 +1,12 @@
|
||||
-- Neovim ftplugin for mail with robust abook integration
|
||||
-- Improved Neovim ftplugin for mail with robust abook integration
|
||||
-- Debugging enabled: check :messages for logs
|
||||
|
||||
-- Helper function to extract clean email address or formatted address
|
||||
local function extract_email(address_string)
|
||||
local name, email = address_string:match("^([^\t]+)\t([^\t]+)")
|
||||
if name and email then
|
||||
if name == "" or name == email then
|
||||
return email
|
||||
else
|
||||
return string.format("%s <%s>", name, email)
|
||||
end
|
||||
end
|
||||
return address_string
|
||||
local function log(msg)
|
||||
-- print("[abook] " .. msg)
|
||||
end
|
||||
|
||||
log("ftplugin/mail.lua loaded for filetype: " .. vim.bo.filetype)
|
||||
|
||||
-- Omnifunc completion for email addresses
|
||||
function _G.mail_complete(findstart, base)
|
||||
if findstart == 1 then
|
||||
@@ -20,14 +14,14 @@ function _G.mail_complete(findstart, base)
|
||||
local col = vim.fn.col(".")
|
||||
local line_to_cursor = line:sub(1, col - 1)
|
||||
|
||||
-- Detect if we are on a header line that takes email addresses
|
||||
if not line_to_cursor:match("^%s*[Tt][Oo]:") and
|
||||
not line_to_cursor:match("^%s*[Cc][Cc]:") and
|
||||
not line_to_cursor:match("^%s*[Bb][Cc][Cc]:") and
|
||||
not line_to_cursor:match("^%s*[Ff][Rr][Oo][Mm]:") and
|
||||
not line_to_cursor:match("^%s*[Rr][Ee][Pp][Ll][Yy]%-[Tt][Oo]:") then
|
||||
return -1
|
||||
end
|
||||
-- Detect if we are on a header line that takes email addresses
|
||||
if not line_to_cursor:match("^%s*[Tt][Oo]:") and
|
||||
not line_to_cursor:match("^%s*[Cc][Cc]:") and
|
||||
not line_to_cursor:match("^%s*[Bb][Cc][Cc]:") and
|
||||
not line_to_cursor:match("^%s*[Ff][Rr][Oo][Mm]:") and
|
||||
not line_to_cursor:match("^%s*[Rr][Ee][Pp][Ll][Yy]%-[Tt][Oo]:") then
|
||||
return -1
|
||||
end
|
||||
|
||||
-- Find start of current address (after comma or space)
|
||||
local start = line_to_cursor:reverse():find("[%s,]")
|
||||
@@ -38,21 +32,15 @@ function _G.mail_complete(findstart, base)
|
||||
end
|
||||
else
|
||||
-- Query abook
|
||||
log("Querying abook for: " .. base)
|
||||
local cmd = string.format('abook --mutt-query "%s" 2>/dev/null', base)
|
||||
local handle = io.popen(cmd)
|
||||
if not handle then return {} end
|
||||
|
||||
-- Skip the first line (header)
|
||||
local header = handle:read("*l")
|
||||
|
||||
local matches = {}
|
||||
for line in handle:lines() do
|
||||
if line ~= "" then
|
||||
-- abook --mutt-query returns "email\tname\t..."
|
||||
-- Use a more lenient pattern to capture both fields even if one is empty
|
||||
local email = line:match("^([^\t]+)")
|
||||
local name = line:match("^[^\t]+\t([^\t]*)")
|
||||
|
||||
if line ~= "" and not line:match("^%s*$") then
|
||||
local email, name = line:match("^([^\t]+)\t([^\t]+)")
|
||||
if email then
|
||||
local formatted = (name and name ~= "") and string.format("%s <%s>", name, email) or email
|
||||
table.insert(matches, { word = formatted, abbr = line:gsub("\t", " | "):gsub("%s+$", "") })
|
||||
@@ -60,11 +48,12 @@ function _G.mail_complete(findstart, base)
|
||||
end
|
||||
end
|
||||
handle:close()
|
||||
log("Found " .. #matches .. " matches")
|
||||
return matches
|
||||
end
|
||||
end
|
||||
|
||||
-- Set omnifunc locally for the buffer
|
||||
-- Set omnifunc locally
|
||||
vim.opt_local.omnifunc = "v:lua.mail_complete"
|
||||
|
||||
-- Trigger completion on Tab in header lines
|
||||
@@ -73,7 +62,6 @@ vim.keymap.set("i", "<Tab>", function()
|
||||
local col = vim.fn.col(".")
|
||||
local line_to_cursor = line:sub(1, col - 1)
|
||||
|
||||
-- Check if we are on a header line
|
||||
local is_header = line_to_cursor:match("^%s*[Tt][Oo]:") or
|
||||
line_to_cursor:match("^%s*[Cc][Cc]:") or
|
||||
line_to_cursor:match("^%s*[Bb][Cc][Cc]:") or
|
||||
@@ -87,27 +75,22 @@ vim.keymap.set("i", "<Tab>", function()
|
||||
return "<Tab>"
|
||||
end, { expr = true, buffer = true })
|
||||
|
||||
-- Notify that the plugin is loaded (silent)
|
||||
-- vim.notify("Mail ftplugin loaded")
|
||||
|
||||
-- Interactive picker using vim.ui.select (works with fzf-lua/telescope)
|
||||
-- Interactive picker
|
||||
local function pick_email()
|
||||
log("Manual picker triggered")
|
||||
local handle = io.popen('abook --mutt-query "" 2>/dev/null')
|
||||
if not handle then
|
||||
vim.notify("Could not query abook", vim.log.levels.ERROR)
|
||||
return
|
||||
end
|
||||
|
||||
-- Skip header
|
||||
handle:read("*l")
|
||||
|
||||
local items = {}
|
||||
for line in handle:lines() do
|
||||
if line ~= "" then
|
||||
if line ~= "" and not line:match("^%s*$") then
|
||||
local email, name = line:match("^([^\t]+)\t([^\t]+)")
|
||||
if email then
|
||||
local formatted = name ~= "" and string.format("%s <%s>", name, email) or email
|
||||
table.insert(items, { display = line:gsub("\t", " | "), value = formatted })
|
||||
local formatted = (name and name ~= "") and string.format("%s <%s>", name, email) or email
|
||||
table.insert(items, { display = line:gsub("\t", " | "):gsub("%s+$", ""), value = formatted })
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -118,19 +101,42 @@ local function pick_email()
|
||||
return
|
||||
end
|
||||
|
||||
vim.ui.select(items, {
|
||||
prompt = "Select Recipient:",
|
||||
format_item = function(item) return item.display end,
|
||||
}, function(choice)
|
||||
if choice then
|
||||
local row, col = unpack(vim.api.nvim_win_get_cursor(0))
|
||||
local line = vim.api.nvim_get_current_line()
|
||||
local new_line = line:sub(1, col) .. choice.value .. line:sub(col + 1)
|
||||
vim.api.nvim_set_current_line(new_line)
|
||||
vim.api.nvim_win_set_cursor(0, { row, col + #choice.value })
|
||||
end
|
||||
end)
|
||||
table.sort(items, function(a, b) return a.display < b.display end)
|
||||
|
||||
-- Use Snacks.picker if available, otherwise fallback to vim.ui.select
|
||||
if _G.Snacks and Snacks.picker then
|
||||
Snacks.picker.select(items, {
|
||||
prompt = "Select Recipient",
|
||||
format_item = function(item) return item.display end,
|
||||
}, function(choice)
|
||||
if choice then
|
||||
local row, col = unpack(vim.api.nvim_win_get_cursor(0))
|
||||
local line = vim.api.nvim_get_current_line()
|
||||
local before = line:sub(1, col)
|
||||
local after = line:sub(col + 1)
|
||||
if before:match("[:%,]$") then choice.value = " " .. choice.value end
|
||||
vim.api.nvim_set_current_line(before .. choice.value .. after)
|
||||
vim.api.nvim_win_set_cursor(0, { row, col + #choice.value })
|
||||
end
|
||||
end)
|
||||
else
|
||||
vim.ui.select(items, {
|
||||
prompt = "Select Recipient:",
|
||||
format_item = function(item) return item.display end,
|
||||
}, function(choice)
|
||||
if choice then
|
||||
local row, col = unpack(vim.api.nvim_win_get_cursor(0))
|
||||
local line = vim.api.nvim_get_current_line()
|
||||
local before = line:sub(1, col)
|
||||
local after = line:sub(col + 1)
|
||||
if before:match("[:%,]$") then choice.value = " " .. choice.value end
|
||||
vim.api.nvim_set_current_line(before .. choice.value .. after)
|
||||
vim.api.nvim_win_set_cursor(0, { row, col + #choice.value })
|
||||
end
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
-- Map Ctrl+f for the picker
|
||||
-- Keybinds
|
||||
vim.keymap.set("i", "<C-f>", pick_email, { buffer = true, desc = "Pick email from abook" })
|
||||
vim.keymap.set("n", "<C-f>", pick_email, { buffer = true, desc = "Pick email from abook" })
|
||||
|
||||
@@ -13,7 +13,7 @@ return {
|
||||
workspaces = {
|
||||
{
|
||||
name = "liph",
|
||||
path = "/mnt/flash1/podman/nextcloud/config/obsidian/vaults",
|
||||
path = "/mnt/flash1/podman/lxc_servarr/nextcloud/config/obsidian/vaults",
|
||||
},
|
||||
},
|
||||
|
||||
|
||||
+18
-2
@@ -18,8 +18,6 @@ set -g pane-base-index 1
|
||||
set-window-option -g pane-base-index 1
|
||||
set-option -g renumber-windows on
|
||||
|
||||
# set -g allow-passthrough on
|
||||
|
||||
# Allow Kitty graphics protocol to pass through
|
||||
set -gq allow-passthrough on
|
||||
|
||||
@@ -119,6 +117,9 @@ set -g @plugin 'YlanAllouche/tmux-task-monitor'
|
||||
set -g @plugin 'rickstaa/tmux-notify'
|
||||
set -g @plugin 'TheSast/tmux-nav-master'
|
||||
set -g @plugin 'omerxx/tmux-sessionx'
|
||||
set -g @plugin 'egel/tmux-gruvbox'
|
||||
# set desired theme options...
|
||||
set -g @tmux-gruvbox 'dark' # or 'dark256', 'light', 'light256'
|
||||
|
||||
# Other examples:
|
||||
# set -g @plugin 'github_username/plugin_name'
|
||||
@@ -126,6 +127,21 @@ set -g @plugin 'omerxx/tmux-sessionx'
|
||||
# set -g @plugin 'git@github.com:user/plugin'
|
||||
# set -g @plugin 'git@bitbucket.com:user/plugin'
|
||||
|
||||
# bind-key "T" run-shell "sesh connect \"$(
|
||||
# sesh list --icons | fzf-tmux -p 80%,70% \
|
||||
# --no-sort --ansi --border-label ' sesh ' --prompt '⚡ ' \
|
||||
# --header ' ^a all ^t tmux ^g configs ^x zoxide ^d tmux kill ^f find' \
|
||||
# --bind 'tab:down,btab:up' \
|
||||
# --bind 'ctrl-a:change-prompt(⚡ )+reload(sesh list --icons)' \
|
||||
# --bind 'ctrl-t:change-prompt(🪟 )+reload(sesh list -t --icons)' \
|
||||
# --bind 'ctrl-g:change-prompt(⚙️ )+reload(sesh list -c --icons)' \
|
||||
# --bind 'ctrl-x:change-prompt(📁 )+reload(sesh list -z --icons)' \
|
||||
# --bind 'ctrl-f:change-prompt(🔎 )+reload(fd -H -d 2 -t d -E .Trash . ~)' \
|
||||
# --bind 'ctrl-d:execute(tmux kill-session -t {2..})+change-prompt(⚡ )+reload(sesh list --icons)' \
|
||||
# --preview-window 'right:55%' \
|
||||
# --preview 'sesh preview {}'
|
||||
# )\""# set -g allow-passthrough on
|
||||
|
||||
# tmux-fzf config
|
||||
# Default value in tmux < 3.2
|
||||
TMUX_FZF_OPTIONS="-m"
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{"\\x61\\x6E\\x73\\x69\\x62\\x6C\\x65":["\\x31"]}
|
||||
@@ -48,3 +48,5 @@ export PATH="$HOME/.local/share/nvim/mason/bin:$PATH"
|
||||
# export YSU_HARDCORE=0 # Prevent execution if alias exists (probably too aggressive)
|
||||
|
||||
export GTK_FILE_CHOOSER_BACKEND="yazi"
|
||||
|
||||
export OPENCODE_CONFIG_DIR=/mnt/flash1/opencode_data/
|
||||
|
||||
@@ -92,4 +92,3 @@ export PATH=/home/liph/.opencode/bin:$PATH
|
||||
# Must be at the very end to ensure hooks are applied correctly [1]
|
||||
# . "$HOME/.atuin/bin/env"
|
||||
eval "$(atuin init zsh)"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user