From 88e0293307d7afac82941cffc714ec129e7e805c Mon Sep 17 00:00:00 2001 From: liph Date: Sat, 18 Apr 2026 09:34:10 +0200 Subject: [PATCH] another commit --- aerc/.config/aerc/AGENTS.md | 37 +- aerc/.config/aerc/accounts.conf | 2 +- aerc/.config/aerc/aerc.conf | 36 +- aerc/.config/aerc/aerc.conf.bak | 883 ++++++++++++++++++ aerc/.config/aerc/binds.conf | 62 +- aerc/.config/aerc/binds.conf.bak | 146 +++ aerc/.config/aerc/notmuch-queries.conf | 49 +- aerc/.config/aerc/phil.queries | 44 + aerc/.config/aerc/phil.queries.bak | 35 + aerc/.config/aerc/stylesets/gruvbox-dark | 6 + aerc/.config/aerc/test.yml | 0 aerc2/accounts.conf | 0 nvim/.config/nvim/after/ftplugin/mail.lua | 114 +-- nvim/.config/nvim/lua/plugins/obsidian.lua | 2 +- tmux/.tmux.conf | 20 +- .../liph/.local/share/Trash/files/tags.json | 1 + zshrc/.export.zsh | 2 + zshrc/.zshrc | 1 - 18 files changed, 1293 insertions(+), 147 deletions(-) create mode 100644 aerc/.config/aerc/aerc.conf.bak create mode 100644 aerc/.config/aerc/binds.conf.bak create mode 100644 aerc/.config/aerc/phil.queries create mode 100644 aerc/.config/aerc/phil.queries.bak delete mode 100644 aerc/.config/aerc/test.yml delete mode 100644 aerc2/accounts.conf create mode 100644 yazi/.config/yazi/tags/home/liph/.local/share/Trash/files/tags.json diff --git a/aerc/.config/aerc/AGENTS.md b/aerc/.config/aerc/AGENTS.md index b082fb9..1f3fa2e 100644 --- a/aerc/.config/aerc/AGENTS.md +++ b/aerc/.config/aerc/AGENTS.md @@ -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`. diff --git a/aerc/.config/aerc/accounts.conf b/aerc/.config/aerc/accounts.conf index 2db8099..a11f19e 100644 --- a/aerc/.config/aerc/accounts.conf +++ b/aerc/.config/aerc/accounts.conf @@ -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 diff --git a/aerc/.config/aerc/aerc.conf b/aerc/.config/aerc/aerc.conf index 86ef6a1..8ac250f 100644 --- a/aerc/.config/aerc/aerc.conf +++ b/aerc/.config/aerc/aerc.conf @@ -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 diff --git a/aerc/.config/aerc/aerc.conf.bak b/aerc/.config/aerc/aerc.conf.bak new file mode 100644 index 0000000..b43e629 --- /dev/null +++ b/aerc/.config/aerc/aerc.conf.bak @@ -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: +# +# [] +# +# is optional and defaults to horizontal. It can take one +# of the following values: h, horiz, horizontal, v, vert, vertical. +# +# 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 +# to :attach -m . 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/. +# +# {} 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 diff --git a/aerc/.config/aerc/binds.conf b/aerc/.config/aerc/binds.conf index 0119253..d4bd33a 100644 --- a/aerc/.config/aerc/binds.conf +++ b/aerc/.config/aerc/binds.conf @@ -3,11 +3,16 @@ # GLOBAL Navigation & Contacts ( = :term abook -,c = :term abook ,ab = :term abook - = :prev-tab - = :next-tab - = :term +,ca = :term khal interactive +,c1 = :term khal interactive -a personal +,c2 = :term khal interactive -a healplaylove +,c3 = :term khal interactive -a glarisegg +,ta = :term taskwarrior-tui + + = :prev-tab + = :next-tab + = :terminal ? = :help keys = :prompt 'Quit?' quit = :prompt 'Quit?' quit @@ -26,6 +31,16 @@ g = :select 0 G = :select -1 J = :next-folder K = :prev-folder +H = :collapse-folder +L = :expand-folder + = :collapse-folder + = :expand-folder + +# Marking/Flagging +v = :mark -v +V = :mark -t + = :mark -t:next + = :unmark -a # Accounts ,1 = :change-tab phil @@ -38,7 +53,7 @@ K = :prev-folder ,n = :cf Newsletters ,f = :cf Finance ,s = :cf Shopping -,t = :cf Travel +,v = :cf Travel ,d = :cf Development ,x = :cf Spam ,tr = :cf Trash @@ -46,6 +61,8 @@ K = :prev-folder # Actions = :view +s = :split +S = :vsplit d = :modify-labels +deleted -inbox a = :archive flat C = :compose @@ -69,13 +86,9 @@ za = :fold -t = :recall [view] +# Navigation & UI q = :close x = :close -o = :open -O = :open -s = :save -S = :save -,sa = :save -a | = :pipe D = :delete A = :archive flat @@ -87,16 +100,16 @@ Rq = :reply -q H = :toggle-headers ,l = :pipe urlscan -# Attachment handling +# Attachment Handling n = :next-part p = :prev-part - = :next-part - = :prev-part -s = :pipe -m /home/liph/.local/bin/save-attachment -S = :save +J = :next +K = :prev o = :open O = :open -,sa = :save -a +s = :save ~/Downloads/ +S = :save +,sa = :save -a ~/Downloads/ [view::passthrough] $noinherit = true @@ -111,8 +124,8 @@ $complete = = :attach = :attach = :attach - = :prev-tab - = :next-tab + = :prev-tab + = :next-tab = :next-field = :prev-field @@ -126,20 +139,23 @@ $ex = [compose::review] # After exiting the editor -y = :send +y = :multipart text/html:send n = :abort v = :preview p = :postpone q = :choose -o d discard abort -o p postpone postpone e = :edit a = :attach -A = :attach = :attach = :attach d = :detach [terminal] -$noinherit = true +# Clear keys to allow passthrough to Khal/Taskwarrior $ex = - = :prev-tab - = :next-tab + = + = + = + = + = :prev-tab + = :next-tab diff --git a/aerc/.config/aerc/binds.conf.bak b/aerc/.config/aerc/binds.conf.bak new file mode 100644 index 0000000..f3b2ee9 --- /dev/null +++ b/aerc/.config/aerc/binds.conf.bak @@ -0,0 +1,146 @@ +# Binds are of the form = +# To use '=' in a key sequence, substitute it with "Eq": "" + +# GLOBAL Navigation & Contacts +( = :term abook +,ab = :term abook +,ca = :term khal interactive + = :prev-tab + = :next-tab + = :terminal +? = :help keys + = :prompt 'Quit?' quit + = :prompt 'Quit?' quit + = :suspend + +[messages] +# Sync +u = :term /home/liph/.local/bin/mailsync + +# Navigation +j = :next +k = :prev + = :next + = :prev +g = :select 0 +G = :select -1 +J = :next-folder +K = :prev-folder +H = :collapse-folder +L = :expand-folder + = :collapse-folder + = :expand-folder + +# Accounts +,1 = :change-tab phil +,2 = :change-tab spam +,3 = :change-tab proton + +# Folders +,i = :cf Inbox +,u = :cf Unread +,n = :cf Newsletters +,f = :cf Finance +,s = :cf Shopping +,t = :cf Travel +,d = :cf Development +,x = :cf Spam +,tr = :cf Trash +,am = :cf All Mail + +# Actions + = :view +s = :split +S = :vsplit +d = :modify-labels +deleted -inbox +a = :archive flat +C = :compose +m = :compose +rr = :reply -a +rq = :reply -aq +Rr = :reply +Rq = :reply -q +/ = :search +\ = :filter +n = :next-result +N = :prev-result + +# Threads +T = :toggle-threads +zc = :fold +zo = :unfold +za = :fold -t + +[messages:folder=Drafts] + = :recall + +[view] +# Navigation & UI +q = :close +x = :close +| = :pipe +D = :delete +A = :archive flat +f = :forward +rr = :reply -a +rq = :reply -aq +Rr = :reply +Rq = :reply -q +H = :toggle-headers +,l = :pipe urlscan + +# Attachment Handling +n = :next-part +p = :prev-part +J = :next +K = :prev +o = :open +O = :open +s = :pipe -m /home/liph/.local/bin/save-attachment +S = :save +,sa = :save -a + +[view::passthrough] +$noinherit = true +$ex = + = :toggle-key-passthrough + +[compose] +# General compose view +$noinherit = true +$ex = +$complete = + = :attach + = :attach + = :attach + = :prev-tab + = :next-tab + = :next-field + = :prev-field + +[compose::editor] +# While focused in the text editor (nvim) +$noinherit = true +$ex = + = :attach + = :attach + = :attach + +[compose::review] +# After exiting the editor +y = :multipart text/html:send +n = :abort +v = :preview +p = :postpone +q = :choose -o d discard abort -o p postpone postpone +e = :edit +a = :attach + = :attach + = :attach +d = :detach + +[terminal] +$noinherit = true +$ex = + = :prev-tab + = :next-tab diff --git a/aerc/.config/aerc/notmuch-queries.conf b/aerc/.config/aerc/notmuch-queries.conf index 49165e2..22e8d06 100644 --- a/aerc/.config/aerc/notmuch-queries.conf +++ b/aerc/.config/aerc/notmuch-queries.conf @@ -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=* diff --git a/aerc/.config/aerc/phil.queries b/aerc/.config/aerc/phil.queries new file mode 100644 index 0000000..22843c6 --- /dev/null +++ b/aerc/.config/aerc/phil.queries @@ -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=* diff --git a/aerc/.config/aerc/phil.queries.bak b/aerc/.config/aerc/phil.queries.bak new file mode 100644 index 0000000..ba01432 --- /dev/null +++ b/aerc/.config/aerc/phil.queries.bak @@ -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=* diff --git a/aerc/.config/aerc/stylesets/gruvbox-dark b/aerc/.config/aerc/stylesets/gruvbox-dark index 65d1e90..4502738 100644 --- a/aerc/.config/aerc/stylesets/gruvbox-dark +++ b/aerc/.config/aerc/stylesets/gruvbox-dark @@ -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 diff --git a/aerc/.config/aerc/test.yml b/aerc/.config/aerc/test.yml deleted file mode 100644 index e69de29..0000000 diff --git a/aerc2/accounts.conf b/aerc2/accounts.conf deleted file mode 100644 index e69de29..0000000 diff --git a/nvim/.config/nvim/after/ftplugin/mail.lua b/nvim/.config/nvim/after/ftplugin/mail.lua index 7ef730f..15f6594 100644 --- a/nvim/.config/nvim/after/ftplugin/mail.lua +++ b/nvim/.config/nvim/after/ftplugin/mail.lua @@ -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", "", 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", "", function() return "" 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", "", pick_email, { buffer = true, desc = "Pick email from abook" }) +vim.keymap.set("n", "", pick_email, { buffer = true, desc = "Pick email from abook" }) diff --git a/nvim/.config/nvim/lua/plugins/obsidian.lua b/nvim/.config/nvim/lua/plugins/obsidian.lua index ee4e75d..6221338 100644 --- a/nvim/.config/nvim/lua/plugins/obsidian.lua +++ b/nvim/.config/nvim/lua/plugins/obsidian.lua @@ -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", }, }, diff --git a/tmux/.tmux.conf b/tmux/.tmux.conf index 557e923..8678d30 100644 --- a/tmux/.tmux.conf +++ b/tmux/.tmux.conf @@ -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" diff --git a/yazi/.config/yazi/tags/home/liph/.local/share/Trash/files/tags.json b/yazi/.config/yazi/tags/home/liph/.local/share/Trash/files/tags.json new file mode 100644 index 0000000..63bc2e5 --- /dev/null +++ b/yazi/.config/yazi/tags/home/liph/.local/share/Trash/files/tags.json @@ -0,0 +1 @@ +{"\\x61\\x6E\\x73\\x69\\x62\\x6C\\x65":["\\x31"]} \ No newline at end of file diff --git a/zshrc/.export.zsh b/zshrc/.export.zsh index e8ad28b..459a068 100644 --- a/zshrc/.export.zsh +++ b/zshrc/.export.zsh @@ -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/ diff --git a/zshrc/.zshrc b/zshrc/.zshrc index 3de3167..0028858 100644 --- a/zshrc/.zshrc +++ b/zshrc/.zshrc @@ -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)" -