updated everything
This commit is contained in:
1 parent
d1b2fbdf15
commit
6079f6639b
37 files changed
+4358
-2472
No files matched your search
+30
-15
@@ -1,25 +1,28 @@
|
|||||||
# Agent Guidelines: Aerc Configuration Repository
|
# 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, `abook` for address management, `khal` for calendar, and `taskwarrior` for tasks.
|
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 (with a fuzzy recipient picker inside Neovim).
|
||||||
|
|
||||||
## 1. Build, Lint, and Test Commands
|
## 1. Build, Lint, and Test Commands
|
||||||
|
|
||||||
### Sync and Maintenance
|
### Sync and Maintenance
|
||||||
- **Global Sync**: Run `mailsync` (bound to `u` in `aerc`) to perform:
|
- **Global Sync**: Run `mailsync` (`~/.local/bin/mailsync`, bound to `u` in `aerc`) to perform:
|
||||||
1. `mbsync -a` (Mail sync)
|
1. `mbsync -c ~/.config/isync/mksyncrc <channel>` for channels `liphlink-phil`, `liphlink-spam`, `proton` (per-channel failure tolerated; Proton Bridge check before the proton channel)
|
||||||
2. `vdirsyncer sync` (Calendar sync)
|
2. `NOTMUCH_CONFIG=~/.config/notmuch/<acct>/config notmuch new` for `phil`, `proton`, `spam` (per-account databases)
|
||||||
3. `caldawarrior sync` (Task sync)
|
3. abook contact rebuild: every unique sender from the `phil` and `proton` accounts (spam account excluded, junk/trash/deleted filtered, own addresses and MAILER-DAEMON dropped), merged with existing manual abook entries, written atomically to `~/.local/share/abook/addressbook`
|
||||||
4. `notmuch new` for all account databases (Indexing)
|
- **Scheduling**: systemd user timers run `mailsync` every day at 08:00, 12:00, 17:00 (`mailsync.timer`, `Persistent=true`) plus 2 minutes after login (`mailsync-login.timer`). A `flock` lock prevents concurrent runs.
|
||||||
5. `notmuch-abook-sync` (Address book population)
|
- **Logs**: per-run logs rotated in `~/.local/share/aerc/logs/` (last 7 kept: `mailsync.log` is newest, `.1`–`.7` older runs).
|
||||||
|
- **Safety**: the abook datafile is backed up to `addressbook.pre-mailsync` before the first rebuild; the generated file is validated with `abook --convert` before replacing the datafile.
|
||||||
|
|
||||||
### Linting
|
### Linting
|
||||||
- **Permissions**: `accounts.conf` must be `0600`.
|
- **Permissions**: `accounts.conf` must be `0600`.
|
||||||
- **Dependencies**: `w3m`, `bat`, `yazi`, `notmuch`, `abook`, `pass`, `isync`, `khal`, `vdirsyncer`, `task`, `taskwarrior-tui`, `caldawarrior`.
|
- **Dependencies**: `w3m`, `bat`, `less` (pager scrolling), `yazi`, `notmuch`, `abook`, `pass`, `isync` (mbsync), `fzf`, `flock`, `chafa` (inline images), `urlscan` (links), `pandoc` (HTML send), `mpv` (video parts), `zathura` (PDF).
|
||||||
|
|
||||||
### Testing
|
### Testing
|
||||||
- **Filters**: `cat email.html | w3m -T text/html -dump`
|
- **Filters**: `cat email.html | w3m -T text/html -dump`
|
||||||
- **Calendar**: `khal list`
|
- **Contacts**: `abook --mutt-query "<term>"` (must output tab-delimited `email\tname`)
|
||||||
- **Tasks**: `task list`
|
- **Sync**: run `mailsync` and inspect `~/.local/share/aerc/logs/mailsync.log`
|
||||||
|
- **HTML send**: review screen `y` uses `~/.local/bin/aerc-md-convert` (pandoc) — must produce HTML on stdout
|
||||||
|
- **Links**: `,l` = fuzzy fzf link picker (`:menu -lc fzf :open-link`), `,lu` = urlscan; OSC8 links are auto-detected from the host terminal (`[general].inherit-host-tty-features`, default on — do NOT set `enable-osc8`, deprecated in aerc 0.22)
|
||||||
|
|
||||||
## 2. Code Style Guidelines
|
## 2. Code Style Guidelines
|
||||||
|
|
||||||
@@ -32,12 +35,24 @@ This repository contains the configuration and customization for `aerc`, a termi
|
|||||||
- **Leader**: `,` (comma).
|
- **Leader**: `,` (comma).
|
||||||
- **Tab switching**: `Alt+n` (next) and `Alt+p` (prev).
|
- **Tab switching**: `Alt+n` (next) and `Alt+p` (prev).
|
||||||
- **Contacts**: `,ab` opens `abook`.
|
- **Contacts**: `,ab` opens `abook`.
|
||||||
- **Calendar**: `,ca` opens unified `khal`.
|
- **Compose with picker**: `M` (works in every context) = `:menu -t Compose -c 'mail-compose' :compose` — `mail-compose` runs in a popover (TTY) with labelled, skippable fzf passes: [1/5] account (switches tab via IPC `:change-tab`), [2/5] from/alias (parsed from `accounts.conf`), [3/5] To, [4/5] Cc, [5/5] Bcc. Marking uses **Tab or Ctrl+Space** (Ctrl+A = mark all). Its output is ONE line (`-H "From: ..." -H "To: ..." …`) — `:menu` executes each stdout line as a separate command, so all headers must share one line. Nothing picked → empty composer. Plain empty compose stays on `C`/`m`. `M` is explicitly cleared in `[terminal]` so it passes through to embedded terminal apps.
|
||||||
- **Tasks**: `,ta` opens `taskwarrior-tui`.
|
- **Attachments (compose)**: while typing in the editor (`edit-headers=true` sends keys to nvim), use **`,a` in normal mode** or **`<Alt+a>` in insert mode** — `after/ftplugin/mail.lua` opens yazi in a terminal split and attaches every selected file to the draft via IPC (`aerc :attach <path>`, one call per file — `:attach` rejects multiple paths per call). aerc-side fallbacks: **`<F4>`** (editor context) and **`,a`** (`:menu -t Attach -c 'yazi --chooser-file=%f ~/Downloads' :attach`, compose-fields + review contexts). `<C-k>`/`<C-a>` = `:attach<space>` for raw path input; `d` on review detaches. (`file-picker-cmd` is deliberately unset: aerc runs it without a TTY, so TUI pickers must use `:menu`.)
|
||||||
|
- **Compose header order**: `[compose].header-layout=To,From,Cc,Bcc,Subject` so Cc/Bcc appear above Subject in the editor.
|
||||||
|
- **Attachments (viewer)**: `n`/`p` navigate parts; `s` saves the current part to `~/Downloads`; `S = :save<space>` prompts (relative to `[general].default-save-path=~/Downloads`); `,sa` saves all attachments.
|
||||||
|
|
||||||
### Terminal Tabs (Khal/Taskwarrior)
|
### Helper scripts (`~/.local/bin`)
|
||||||
- **Escape**: Press `Ctrl+x` to release terminal focus and use `aerc` commands.
|
- **`mailsync`** — see the Sync and Maintenance section.
|
||||||
- **Tab Passthrough**: `Tab` and `Backtab` are passed to terminal apps for internal navigation.
|
- **`mail-compose`** — `:menu` picker driving `:compose` natively (bound to `M`); dispatches `:change-tab` over IPC for account selection; prints `-H` + quoted header lines.
|
||||||
|
- **`aerc-md-convert`** — pandoc markdown→HTML converter used by `:multipart text/html` (review `y`).
|
||||||
|
- **Backup layout**: all live above via symlinks into this repo — scripts in `~/dotfiles/scripts/scripts/`, systemd units in `~/dotfiles/systemd/.config/systemd/user/`, aerc config in `aerc/.config/aerc/` (`~/.config/aerc` is a symlink). Commit + push to back up.
|
||||||
|
|
||||||
|
### Neovim compose behavior (`after/ftplugin/mail.lua`)
|
||||||
|
- **Fresh messages**: cursor auto-lands on the `Subject:` line (insert mode at end); replies are left as-is (quote detection: `On ... wrote:` / `>` prefix / `In-Reply-To`).
|
||||||
|
|
||||||
|
### Markdown sending
|
||||||
|
- Drafts are written in **markdown** (`ft=mail.markdown`, spell-checked).
|
||||||
|
- Review screen `y` = `:multipart text/html` → `aerc-md-convert` (pandoc + minimal inline CSS) → sends **multipart/alternative** (plain markdown + rendered HTML). Recipients in GUI clients see rendered HTML.
|
||||||
|
- PDF is not an email body format; attach PDFs with `,a` if needed.
|
||||||
|
|
||||||
### Neovim integration (`after/ftplugin/mail.lua`)
|
### Neovim integration (`after/ftplugin/mail.lua`)
|
||||||
- **Completion**: Triggered by `Tab` on header lines using `abook --mutt-query`.
|
- **Completion**: Triggered by `Tab` on header lines using `abook --mutt-query`.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
[phil]
|
[phil]
|
||||||
source = notmuch:///home/liph/Mail/phil
|
source = notmuch://phil
|
||||||
query-map = ~/.config/aerc/phil.queries
|
query-map = ~/.config/aerc/phil.queries
|
||||||
outgoing = smtp://phil%40liphlink.xyz@mail.liphlink.xyz:587
|
outgoing = smtp://phil%40liphlink.xyz@mail.liphlink.xyz:587
|
||||||
outgoing-cred-cmd = pass show mail/phil@liphlink.xyz
|
outgoing-cred-cmd = pass show mail/phil@liphlink.xyz
|
||||||
@@ -10,7 +10,7 @@ postpone = Drafts
|
|||||||
aliases = pw@liphlink.xyz,p.waibel@liphlink.xyz,philipp.waibel@liphlink.xyz
|
aliases = pw@liphlink.xyz,p.waibel@liphlink.xyz,philipp.waibel@liphlink.xyz
|
||||||
|
|
||||||
[spam]
|
[spam]
|
||||||
source = notmuch:///home/liph/Mail/spam
|
source = notmuch://spam
|
||||||
query-map = ~/.config/aerc/notmuch-queries.conf
|
query-map = ~/.config/aerc/notmuch-queries.conf
|
||||||
outgoing = smtp://spam%40liphlink.xyz@mail.liphlink.xyz:587
|
outgoing = smtp://spam%40liphlink.xyz@mail.liphlink.xyz:587
|
||||||
outgoing-cred-cmd = pass show mail/spam@liphlink.xyz
|
outgoing-cred-cmd = pass show mail/spam@liphlink.xyz
|
||||||
@@ -20,7 +20,7 @@ default = Inbox
|
|||||||
aliases = blue@liphlink.xyz,red@liphlink.xyz
|
aliases = blue@liphlink.xyz,red@liphlink.xyz
|
||||||
|
|
||||||
[proton]
|
[proton]
|
||||||
source = notmuch:///home/liph/Mail/proton
|
source = notmuch://proton
|
||||||
query-map = ~/.config/aerc/notmuch-queries.conf
|
query-map = ~/.config/aerc/notmuch-queries.conf
|
||||||
outgoing = smtp+insecure://liiph%40protonmail.com@127.0.0.1:1025
|
outgoing = smtp+insecure://liiph%40protonmail.com@127.0.0.1:1025
|
||||||
outgoing-cred-cmd = pass show mail/liiph@protonmail.com
|
outgoing-cred-cmd = pass show mail/liiph@protonmail.com
|
||||||
|
|||||||
+11
-10
@@ -5,7 +5,7 @@
|
|||||||
# Used as a default path for save operations if no other path is specified.
|
# Used as a default path for save operations if no other path is specified.
|
||||||
# ~ is expanded to the current user home dir.
|
# ~ is expanded to the current user home dir.
|
||||||
#
|
#
|
||||||
#default-save-path=
|
default-save-path=~/Downloads
|
||||||
|
|
||||||
# If set to "gpg", aerc will use system gpg binary and keystore for all crypto
|
# 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.
|
# operations. If set to "internal", the internal openpgp keyring will be used.
|
||||||
@@ -22,7 +22,6 @@
|
|||||||
#
|
#
|
||||||
# Default: false
|
# Default: false
|
||||||
unsafe-accounts-conf=false
|
unsafe-accounts-conf=false
|
||||||
index-format=notmuch://~/.local/share/mail
|
|
||||||
# Output log messages to specified file. A path starting with ~/ is expanded to
|
# 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
|
# 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.
|
# redirection, this setting is ignored and log messages are printed to stdout.
|
||||||
@@ -58,8 +57,6 @@ log-level=warn
|
|||||||
# Display OSC8 strings in the embedded terminal
|
# Display OSC8 strings in the embedded terminal
|
||||||
#
|
#
|
||||||
# Default: false
|
# Default: false
|
||||||
#enable-osc8=false
|
|
||||||
|
|
||||||
# Default shell command to use for :menu. This will be executed with sh -c and
|
# Default shell command to use for :menu. This will be executed with sh -c and
|
||||||
# will run in an popover dialog.
|
# will run in an popover dialog.
|
||||||
#
|
#
|
||||||
@@ -282,6 +279,9 @@ dirlist-collapse=1
|
|||||||
#
|
#
|
||||||
sort = -r date
|
sort = -r date
|
||||||
|
|
||||||
|
# Keep 2 lines of context visible when moving through the message list
|
||||||
|
msglist-scroll-offset=2
|
||||||
|
|
||||||
# Moves to next message when the current message is deleted
|
# Moves to next message when the current message is deleted
|
||||||
#
|
#
|
||||||
# Default: true
|
# Default: true
|
||||||
@@ -576,7 +576,7 @@ pager= bat --style=plain --paging=always
|
|||||||
# html-unsafe-images=false
|
# html-unsafe-images=false
|
||||||
# html-filter=dante
|
# html-filter=dante
|
||||||
image/*=chafa -f kitty -s ${width}x${height}
|
image/*=chafa -f kitty -s ${width}x${height}
|
||||||
text/html=w3m -T text/html -dump -o display_link_number=1
|
text/html=/usr/lib/aerc/filters/html
|
||||||
application/pdf=zathura
|
application/pdf=zathura
|
||||||
video/*=mpv
|
video/*=mpv
|
||||||
header-layout=From,To,Subject,Date
|
header-layout=From,To,Subject,Date
|
||||||
@@ -640,6 +640,9 @@ editor=nvim +'set ft=mail.markdown'
|
|||||||
# Address book command
|
# Address book command
|
||||||
address-book-cmd=abook --mutt-query '%s'
|
address-book-cmd=abook --mutt-query '%s'
|
||||||
|
|
||||||
|
# Order of headers in the compose editor (edit-headers=true: one per line, no | merging)
|
||||||
|
header-layout=To,From,Cc,Bcc,Subject
|
||||||
|
|
||||||
# Auto-complete addresses
|
# Auto-complete addresses
|
||||||
# address-book-cmd-match='%s'
|
# address-book-cmd-match='%s'
|
||||||
# address-book-cmd=abook --mutt-query '%s'
|
# address-book-cmd=abook --mutt-query '%s'
|
||||||
@@ -700,6 +703,8 @@ edit-headers=true
|
|||||||
# standard output, one file per line. If it is present, then aerc does not
|
# 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
|
# capture the standard output and instead reads the files from the temporary
|
||||||
# file which should have the same format.
|
# file which should have the same format.
|
||||||
|
# file-picker-cmd: aerc runs it without a TTY, so TUI pickers (yazi) cannot run here.
|
||||||
|
# Attachments use :menu with yazi instead (see binds.conf [compose] `a`).
|
||||||
#file-picker-cmd=/home/liph/.local/bin/yazi-picker %f
|
#file-picker-cmd=/home/liph/.local/bin/yazi-picker %f
|
||||||
|
|
||||||
#
|
#
|
||||||
@@ -740,8 +745,6 @@ text/html=/home/liph/.local/bin/aerc-md-convert
|
|||||||
[filters]
|
[filters]
|
||||||
#
|
#
|
||||||
text/plain=sed 's/^$//'
|
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.
|
# 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 commands are invoked with sh -c. The following folders are prepended to
|
||||||
@@ -773,11 +776,10 @@ text/plain=sed 's/^$//'
|
|||||||
# against (non-case-sensitive) and a comma, e.g. subject,text will match a
|
# 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.
|
# subject which contains "text". Use header,~regex to match against a regex.
|
||||||
#
|
#
|
||||||
text/plain=colorize
|
|
||||||
text/calendar=calendar
|
text/calendar=calendar
|
||||||
message/delivery-status=colorize
|
message/delivery-status=colorize
|
||||||
message/rfc822=colorize
|
message/rfc822=colorize
|
||||||
text/html=w3m -T text/html -dump -o display_link_number=1
|
text/html=/usr/lib/aerc/filters/html
|
||||||
#text/*=bat -fP --file-name="$AERC_FILENAME"
|
#text/*=bat -fP --file-name="$AERC_FILENAME"
|
||||||
#application/x-sh=bat -fP -l sh
|
#application/x-sh=bat -fP -l sh
|
||||||
#image/*=catimg -w $(tput cols) -
|
#image/*=catimg -w $(tput cols) -
|
||||||
@@ -814,7 +816,6 @@ text/html=w3m -T text/html -dump -o display_link_number=1
|
|||||||
text/html=w3m
|
text/html=w3m
|
||||||
x-scheme-handler/http=librewolf
|
x-scheme-handler/http=librewolf
|
||||||
x-scheme-handler/https=librewolf
|
x-scheme-handler/https=librewolf
|
||||||
text/calendar=khal import --batch
|
|
||||||
|
|
||||||
[hooks]
|
[hooks]
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -0,0 +1,886 @@
|
|||||||
|
#
|
||||||
|
# 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=warn
|
||||||
|
|
||||||
|
|
||||||
|
# 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="rose-pine-moon"
|
||||||
|
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=34
|
||||||
|
|
||||||
|
#
|
||||||
|
# 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={{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}}{{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
|
||||||
|
# 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
|
||||||
|
|
||||||
|
[terminal]
|
||||||
|
passthrough=false
|
||||||
@@ -0,0 +1,891 @@
|
|||||||
|
#
|
||||||
|
# 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=~/Downloads
|
||||||
|
|
||||||
|
# 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=warn
|
||||||
|
|
||||||
|
|
||||||
|
# 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="rose-pine-moon"
|
||||||
|
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=34
|
||||||
|
|
||||||
|
#
|
||||||
|
# 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={{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}}{{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
|
||||||
|
# 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'
|
||||||
|
|
||||||
|
# Order of headers in the compose editor (edit-headers=true: one per line, no | merging)
|
||||||
|
header-layout=To,From,Cc,Bcc,Subject
|
||||||
|
|
||||||
|
# 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: aerc runs it without a TTY, so TUI pickers (yazi) cannot run here.
|
||||||
|
# Attachments use :menu with yazi instead (see binds.conf [compose] `a`).
|
||||||
|
#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
|
||||||
|
|
||||||
|
[terminal]
|
||||||
|
passthrough=false
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
<A-n> = :next-tab<Enter>
|
<A-n> = :next-tab<Enter>
|
||||||
<C-t> = :terminal<Enter>
|
<C-t> = :terminal<Enter>
|
||||||
? = :help keys<Enter>
|
? = :help keys<Enter>
|
||||||
|
M = :menu -t Compose -c 'mail-compose' :compose<Enter>
|
||||||
<C-c> = :prompt 'Quit?' quit<Enter>
|
<C-c> = :prompt 'Quit?' quit<Enter>
|
||||||
<C-q> = :prompt 'Quit?' quit<Enter>
|
<C-q> = :prompt 'Quit?' quit<Enter>
|
||||||
<C-z> = :suspend<Enter>
|
<C-z> = :suspend<Enter>
|
||||||
@@ -98,7 +99,8 @@ rq = :reply -aq<Enter>
|
|||||||
Rr = :reply<Enter>
|
Rr = :reply<Enter>
|
||||||
Rq = :reply -q<Enter>
|
Rq = :reply -q<Enter>
|
||||||
H = :toggle-headers<Enter>
|
H = :toggle-headers<Enter>
|
||||||
,l = :pipe urlscan<Enter>
|
,l = :menu -lc fzf :open-link<Enter>
|
||||||
|
,lu = :pipe urlscan<Enter>
|
||||||
|
|
||||||
# Attachment Handling
|
# Attachment Handling
|
||||||
n = :next-part<Enter>
|
n = :next-part<Enter>
|
||||||
@@ -124,18 +126,19 @@ $complete = <C-o>
|
|||||||
<C-k> = :attach<space>
|
<C-k> = :attach<space>
|
||||||
<C-a> = :attach<space>
|
<C-a> = :attach<space>
|
||||||
<F4> = :attach<space>
|
<F4> = :attach<space>
|
||||||
|
,a = :menu -t Attach -c 'yazi --chooser-file=%f ~/Downloads' :attach<Enter>
|
||||||
<A-p> = :prev-tab<Enter>
|
<A-p> = :prev-tab<Enter>
|
||||||
<A-n> = :next-tab<Enter>
|
<A-n> = :next-tab<Enter>
|
||||||
<tab> = :next-field<Enter>
|
<tab> = :next-field<Enter>
|
||||||
<backtab> = :prev-field<Enter>
|
<backtab> = :prev-field<Enter>
|
||||||
|
|
||||||
[compose::editor]
|
[compose::editor]
|
||||||
# While focused in the text editor (nvim)
|
# While focused in the text editor (nvim) — only these keys reach aerc, the rest go to nvim
|
||||||
$noinherit = true
|
$noinherit = true
|
||||||
$ex = <C-x>
|
$ex = <C-x>
|
||||||
<C-k> = :attach<space>
|
<C-k> = :attach<space>
|
||||||
<C-a> = :attach<space>
|
<C-a> = :attach<space>
|
||||||
<F4> = :attach<space>
|
<F4> = :menu -t Attach -c 'yazi --chooser-file=%f ~/Downloads' :attach<Enter>
|
||||||
|
|
||||||
[compose::review]
|
[compose::review]
|
||||||
# After exiting the editor
|
# After exiting the editor
|
||||||
@@ -145,7 +148,7 @@ v = :preview<Enter>
|
|||||||
p = :postpone<Enter>
|
p = :postpone<Enter>
|
||||||
q = :choose -o d discard abort -o p postpone postpone<Enter>
|
q = :choose -o d discard abort -o p postpone postpone<Enter>
|
||||||
e = :edit<Enter>
|
e = :edit<Enter>
|
||||||
a = :attach<space>
|
,a = :menu -t Attach -c 'yazi --chooser-file=%f ~/Downloads' :attach<Enter>
|
||||||
<C-k> = :attach<space>
|
<C-k> = :attach<space>
|
||||||
<C-a> = :attach<space>
|
<C-a> = :attach<space>
|
||||||
d = :detach<space>
|
d = :detach<space>
|
||||||
@@ -155,6 +158,7 @@ d = :detach<space>
|
|||||||
$ex = <C-x>
|
$ex = <C-x>
|
||||||
<C-p> =
|
<C-p> =
|
||||||
<C-n> =
|
<C-n> =
|
||||||
|
M =
|
||||||
<tab> =
|
<tab> =
|
||||||
<backtab> =
|
<backtab> =
|
||||||
<A-p> = :prev-tab<Enter>
|
<A-p> = :prev-tab<Enter>
|
||||||
|
|||||||
@@ -0,0 +1,161 @@
|
|||||||
|
# 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>
|
||||||
|
,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>
|
||||||
|
<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>
|
||||||
|
|
||||||
|
# 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>
|
||||||
|
,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>
|
||||||
|
,v = :cf Travel<Enter>
|
||||||
|
,d = :cf Development<Enter>
|
||||||
|
,x = :cf Spam<Enter>
|
||||||
|
,tr = :cf Trash<Enter>
|
||||||
|
,aa = :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 = :save ~/Downloads/<Enter>
|
||||||
|
S = :save<space>
|
||||||
|
,sa = :save -a ~/Downloads/<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>
|
||||||
|
<A-p> = :prev-tab<Enter>
|
||||||
|
<A-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]
|
||||||
|
# Clear keys to allow passthrough to Khal/Taskwarrior
|
||||||
|
$ex = <C-x>
|
||||||
|
<C-p> =
|
||||||
|
<C-n> =
|
||||||
|
<tab> =
|
||||||
|
<backtab> =
|
||||||
|
<A-p> = :prev-tab<Enter>
|
||||||
|
<A-n> = :next-tab<Enter>
|
||||||
@@ -11,14 +11,14 @@ workspaces:
|
|||||||
focus: true
|
focus: true
|
||||||
- label: Music
|
- label: Music
|
||||||
panes:
|
panes:
|
||||||
- focus: true
|
- focus: false
|
||||||
- split: right
|
- split: right
|
||||||
ratio: 0.5
|
ratio: 0.5
|
||||||
command: mc
|
command: mc
|
||||||
- label: Aerc
|
- label: Aerc
|
||||||
panes:
|
panes:
|
||||||
- command: aerc
|
- command: aerc
|
||||||
focus: true
|
focus: false
|
||||||
|
|
||||||
- name: Dotfiles
|
- name: Dotfiles
|
||||||
root: /home/liph/dotfiles
|
root: /home/liph/dotfiles
|
||||||
@@ -28,3 +28,13 @@ workspaces:
|
|||||||
panes:
|
panes:
|
||||||
- command: yazi
|
- command: yazi
|
||||||
focus: true
|
focus: true
|
||||||
|
|
||||||
|
- name: Coding
|
||||||
|
root: /home/liph/code
|
||||||
|
focus: false
|
||||||
|
tabs:
|
||||||
|
- label: Pi
|
||||||
|
panes:
|
||||||
|
- focus: false
|
||||||
|
- split: right
|
||||||
|
ratio: 0.5
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"version": "0.9.0",
|
"version": "0.9.1",
|
||||||
"body": "### Added\n- Manage Local and saved SSH machines from one Herdr window, with a combined agent list, machine-scoped navigation, notifications, and automatic reconnects. Add and manage connections with `herdr machine`; a disconnected machine does not interrupt the others. (#3670)\n- Multiple clients can now view different workspaces and tabs independently. Different tabs fit their viewing clients; when clients share a tab, the last one to interact with it controls its size. (#3526)\n- Added Muse agent detection for idle, working, approval, and question states. (#2489, thanks @ohk)\n- Sidebar text and metadata tokens can now change color, boldness, and dimming based on their values, using ordered text or numeric rules. (#3693)\n- Custom themes can now define separate light and dark color overrides when automatic theme switching is enabled. (#2324, thanks @aneym)\n- `ui.pane_borders = \"always\"` can now frame a single pane when outer borders are enabled. `\"auto\"` keeps split-only borders, `\"off\"` hides them, and existing boolean values keep working. (#3234, thanks @rsmdt)\n\n### Changed\n- Client updates can now leave compatible servers and their running agents untouched. Missing server features disable only the affected action instead of preventing connection. Servers older than endpoint generation 1 need a one-time upgrade. Replacing a remote server asks before stopping its pane processes, with No as the default answer; experimental handoff remains opt-in. (#3509)\n- The terminal UI now runs in each client, reducing redraw work in busy multi-client sessions and keeping themes, menus, copy mode, and other presentation settings local to the viewing machine. (#3487)\n- Idle terminal scrollback now uses less memory without reducing retained history or changing reads and resizing. (#3556)\n- Pane images and the graphics API are now enabled by default in compatible terminals. Set `terminal.kitty_graphics = false` to disable them; the old `experimental.kitty_graphics` setting remains accepted.\n- Closing a primary workspace with open worktree workspaces now requires explicit group intent: `workspace close --group` or `workspace.close` with `close_group: true`. Otherwise the whole group stays open. (#2874)\n- New lifecycle event subscriptions now start with live events rather than replaying retained history. API clients should subscribe before taking their initial snapshot to avoid missing changes. (#1270)\n\n### Fixed\n- Mouse selections now stay visible and copyable while terminal output continues, including with automatic copying disabled. Ctrl+C and Cmd+C copy a selection even before a delayed mouse release, and a failed copy no longer interrupts the agent. Selection highlights also remain visible when host colors are unavailable. (#3100, #2708, #3684, thanks @moret and @Pimpmuckl)\n- Wayland clipboard copies no longer freeze Herdr while `wl-copy` serves the selection. (#3014)\n- Live handoff now preserves mouse forwarding for running pane applications. (#3000, thanks @xkrogen)\n- Interrupted pane exits during host shutdown no longer replace the saved session with an empty session or a new default workspace. (#3415)\n- SSH clients whose terminal disappears now detach instead of resizing running panes to a fallback size and triggering expensive history reflow. (#3519)\n- Focusing a workspace now scrolls the sidebar to keep it visible. (#3554)\n- Removing a background worktree workspace no longer changes focus to its parent. Windows worktrees can also be removed while their agent panes are running, without a replacement shell locking the checkout again. (#3098, #3532)\n- Worktree commands can now trust a verified repository for one request with `--trust-repository`, including accessible Windows repositories owned by another SID, without changing global Git configuration. (#3044)\n- Oversized Kitty images no longer prevent smaller images from appearing, and image replacements no longer redraw or disappear one row at a time. Direct graphics stay bound to the client that owns them. (#3033, #3166, #3549, thanks @kataokatsuki)\n- Pixel mouse coordinates remain correct when pane applications reassert SGR mouse reporting. (#3295)\n- Prefix bindings such as `prefix+|` now recognize characters produced by macOS Option and custom keyboard layouts, while exact chords keep priority. Arrow navigation also works when terminals such as Alacritty attach text to special-key reports. (#3079, #3328, thanks @vlcinsky)\n- Direct terminal attaches now honor `ui.mouse_capture` and preserve multiline pastes as one paste instead of submitting each line separately. (#2992, #3054)\n- `agent prompt` now reliably sends the prompt and Enter before reporting successful submission. With `--wait`, prompts sent to a non-working agent require observed working or blocked activity, so unrelated state changes cannot complete the wait. Pending submissions fail cleanly if the terminal exits. (#3506, #3685)\n- Long Codex prompts on WindowLine truncated
|
"body": "### Added\n- Control agents, panes, workspaces, and worktrees on saved SSH machines with `herdr --machine <label-or-id>`. Commands use the saved machine's session without needing an open Herdr window. Update Herdr on both machines to use CLI forwarding; failed remote commands never fall back to Local. (#3918)\n- Connect to Windows SSH hosts from Linux, macOS, or Windows. Interactive setup can install or update the complete Windows package after confirmation; background reconnects never install updates. (#3651, #3701, #3661, #3687, thanks @JJLiebig)\n- Edit names, filters, and search text at the cursor instead of only at the end. Herdr inputs now support character and word movement, Home/End, deletion, and familiar Ctrl+A/E/K/U/W/Y shortcuts, including Unicode text. (#1803, #3698, thanks @markjaquith)\n- Added Letta Code detection and native conversation restore, including default conversations. Its experimental integration is installed through `herdr integration install letta`, not the Settings integration list or JSON integration API. (#3106, #3107, thanks @just-cameron)\n- Hold Ctrl over a link to highlight it before opening it. Wrapped URLs and OSC 8 links remain clickable even when their beginning or end is outside the viewport. (#1282)\n- Sidebar token rules can now hide matching tokens and their separators with `hide = true`; rows disappear when no tokens remain. (#3925)\n\n### Changed\n- Workspace keyboard navigation now spans connected machines in sidebar order, with a visible highlight before Enter switches machines. Collapsed machine and worktree groups remain navigable without accidentally sending actions to the wrong machine. (#3754)\n- Experimental live handoff can now transfer more than 64 panes when the sending server includes this update. An older running server still has its old limit for the first upgrade; this does not change update installation order or make live handoff non-experimental. (#3393, #3411, thanks @kataokatsuki)\n- On Linux and macOS, terminal observers that stop accepting output are disconnected after 30 seconds without write progress. Their pane and other clients keep running; an interrupted stream may end without a final close record. (#3612)\n- Windows terminal cleanup now explicitly resets mouse-reporting modes. The remaining standalone Git Bash detach report in #3748 is still under investigation; do not treat this release as a confirmed fix for that report. (#4055, thanks @JJLiebig)\n\n### Fixed\n- Remote typing, switching, and popup interaction no longer resend the entire pane screen for small changes. Busy SSH sessions use less bandwidth, and idle attached clients avoid unnecessary redraw work. (#3769, #3745, #3822)\n- A stalled SSH machine no longer traps the client away from Local. Clicking a local workspace or agent cancels the unfinished remote switch, and a recovered remote workspace refreshes without an away-and-back selection. Stale screens from before a reconnect are not reused. (#3903, #3842)\n- Idle SSH connections use less CPU without losing final output. Repeated connection failures back off instead of reconnecting rapidly, and supported idle bridges clean up without stopping remote panes. (#3728, #4083)\n- Large pastes no longer disconnect the client with an output-queue error. (#3833)\n- SSH setup now shows authentication instructions and useful errors, including Tailscale login URLs and host-key failures, rather than appearing to hang or only reporting a lost connection. `machine add` also accepts options before the SSH target. (#3606, #3731, #3883)\n- Machine and worktree groups collapse correctly without changing the selected workspace. The sidebar respects workspace row gaps, stays stable during resizing, and reveals newly focused workspaces. (#3778, #3738, #3817)\n- The agent list keeps its scroll position when switching machines. Current-workspace and current-tab filters distinguish identical IDs on different machines. (#3937, #4101, #3732, thanks @minatoaquaMK2)\n- Background machine activation no longer resizes another client's focused pane. Window titles follow each client's own view rather than another client's selection. (#3744, #4091, #4130, thanks @JJLiebig)\n- `agent focus` and `pane move --focus` now move attached clients to the requested pane. Moving without focus no longer leaves a client following a deleted tab or later unrelated focus changes. (#3760, #4153, #4171, thanks @minatoaquaMK2)\n- Creating a worktree focuses its new workspace again. Partially failed worktree removals can be retried, and worktrees with submodules offer an explicit forced-removal choice rather than failing without a recovery action. (#3766, #3314, #1797)\n- Temporary worktree-action error banners expire instead of remaining on screen indefinitely. (#1827, #4063, thanks @JJLiebig)\n- The last tab remains fully visible when the tab strip overflows, and the session navigator once again draws connected tree branches. (#4151, #3843)\n- Muted sidebar andLine truncated
|
||||||
"show_on_startup": true
|
"show_on_startup": true
|
||||||
}
|
}
|
||||||
@@ -10,6 +10,7 @@ TARGET_DIR="$(realpath ~/dotfiles)"
|
|||||||
# Close any existing versions of these workspaces so this is idempotent.
|
# Close any existing versions of these workspaces so this is idempotent.
|
||||||
herdr workspace close Home 2>/dev/null || true
|
herdr workspace close Home 2>/dev/null || true
|
||||||
herdr workspace close Dotfiles 2>/dev/null || true
|
herdr workspace close Dotfiles 2>/dev/null || true
|
||||||
|
herdr workspace close Coding 2>/dev/null || true
|
||||||
|
|
||||||
# Apply the layout file, which creates both workspaces.
|
# Apply the layout file, which creates both workspaces.
|
||||||
"$SPREADER" apply --file "$CONFIG_DIR/home.yml"
|
"$SPREADER" apply --file "$CONFIG_DIR/home.yml"
|
||||||
|
|||||||
@@ -5,45 +5,33 @@
|
|||||||
"tabs": [
|
"tabs": [
|
||||||
{
|
{
|
||||||
"panes": {
|
"panes": {
|
||||||
"1": {
|
"2": {
|
||||||
"ansi": "\u001b[0m\u001b[38;5;5march liph \u001b[0m\u001b[38;5;4m~\u001b[0m\r\n\u001b[0m\u001b[38;5;5march liph \u001b[0m\u001b[38;5;4m~\u001b[0m\r\n\u001b[0m\u001b[38;5;5m❯\u001b[0m \u001b[0m\u001b[1m\u001b[7m%\u001b[0m \u001b[0m\u001b[38;5;5march liph \u001b[0m\u001b[38;5;4m~\u001b[0m\r\n\u001b[0m\u001b[38;5;5m❯\u001b[0m ",
|
"ansi": "\u001b[0m\u001b[38;5;6m~\u001b[0m\r\n \u001b[0m\u001b[38;5;4m\u001b[0m\u001b[7m\u001b[38;5;4m liph \u001b[0m\u001b[38;5;4m\u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m\u001b[0m\u001b[7m\u001b[38;5;4m .atuin \u001b[0m\u001b[38;5;4m\u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;5;6m/home/liph/\u001b[0m\u001b[1m\u001b[38;5;4m.atuin\u001b[0m\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.cache \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m└── \u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4mlogs\u001b[0m\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.cargo \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m ├── \u001b[0m search.log.2026-09-17\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.claude \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m ├── \u001b[0m search.log.2026-09-18\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;255;152;0m \u001b[0m\u001b[38;5;4m.config \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m └── \u001b[0m search.log.2026-09-20\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.gnupg \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.local \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.locale \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.mozilla \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.npm \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.password-store \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;158;158;158m \u001b[0m\u001b[38;5;4m.pi\u001b[0m\u001b[3m\u001b[38;5;4m -> dotfiles/pi/.pi\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.pyenv \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.rustup \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;158;158;158m \u001b[0m\u001b[38;5;4m.ssh\u001b[0m\u001b[3m\u001b[38;5;4m -> dotfiles/ssh/.\u001b[0m\u001b[38;5;4m… \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.w3m \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;158;158;158m \u001b[0m\u001b[38;5;4maerc_back\u001b[0m\u001b[3m\u001b[38;5;4m -> dotfiles/\u001b[0m\u001b[38;5;4m… \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;158;158;158m \u001b[0m\u001b[38;5;4mcloud\u001b[0m\u001b[3m\u001b[38;5;4m -> /mnt/tank/clo\u001b[0m\u001b[38;5;4m… \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;158;158;158m \u001b[0m\u001b[38;5;4mcode\u001b[0m\u001b[3m\u001b[38;5;4m -> /mnt/tank/code\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;0;188;212m \u001b[0m\u001b[38;5;4mDocuments \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4mdotfiles \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;0;188;212m \u001b[0m\u001b[38;5;4mDownloads \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0Line truncated
|
||||||
"lines": 4
|
"lines": 35
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"tabs": [
|
|
||||||
{
|
|
||||||
"panes": {
|
|
||||||
"3": {
|
|
||||||
"ansi": "\u001b[0m\u001b[38;5;5m❯ \u001b[0m\u001b[38;5;2my\u001b[0m",
|
|
||||||
"lines": 1
|
|
||||||
},
|
},
|
||||||
"10": {
|
"1": {
|
||||||
"ansi": "\u001b[0m\u001b[38;5;5m❯ \u001b[0m\u001b[38;5;2mssh\u001b[0m seco\r\nssh: connect to host 100.69.98.79 port 50101: No route to host\r\n\u001b[0m\u001b[38;5;1m❯ \u001b[0m\u001b[38;5;2mssh\u001b[0m serv\r\nssh: connect to host 100.69.72.2 port 50100: No route to host\r\n\u001b[0m\u001b[38;5;1m❯ \u001b[0m\u001b[4m\u001b[38;5;2msudo\u001b[0m \u001b[0m\u001b[38;5;2mmount\u001b[0m -a\r\n[sudo] password for liph: \r\n\u001b[0m\u001b[38;5;5m❯ \u001b[0m\u001b[38;5;2mssh\u001b[0m seco\r\nssh: connect to host 100.69.98.79 port 50101: No route to host\r\n\u001b[0m\u001b[38;5;1m❯ \u001b[0m\u001b[4m\u001b[38;5;2msudo\u001b[0m \u001b[0m\u001b[38;5;2msystemctl\u001b[0m restart NetworkManager\r\n\u001b[0m\u001b[38;5;5m❯ \u001b[0m\u001b[38;5;2mssh\u001b[0m seco\r\n\u001b[0m\u001b[38;5;5m❯ \u001b[0m\u001b[38;5;2mcd\u001b[0m lxc\r\n\u001b[0m\u001b[38;5;5m❯ \u001b[0m\u001b[38;5;2my\u001b[0m\r\n\u001b[0m\u001b[1m\u001b[7m%\u001b[0m \u001b[0m\u001b[38;5;5m❯ \u001b[0m\u001b[38;5;2mpoc\u001b[0m\r\n6654fbb30b130b1cae3e28dda06026e17948ff9e8db777e31d0a628f15d3f8c7\r\naad6289ca337b3ce76896f2e7e61480490152886c7828120371fb28e6b779e1d\r\nledger_db\r\nledger_server\r\n\u001b[0m\u001b[38;5;5m❯ \u001b[0m\u001b[38;5;2mexit\u001b[0m\r\nConnection to 100.69.98.79 closed.\r\n\u001b[0m\u001b[38;5;5m❯ \u001b[0m\u001b[38;5;2mrebo\u001b[0m\r\nGenerating grub configuration file ...\r\nWarning: os-prober will not be executed to detect other bootable partitions.\r\nSystems on them will not be added to the GRUB boot configuration.\r\nCheck GRUB_DISABLE_OS_PROBER documentation entry.\r\nAdding boot menu entry for UEFI Firmware Settings ...\r\ndone\r\n\r\n\u001b[0m\u001b[38;5;5march liph \u001b[0m\u001b[38;5;4m~/dotfiles/nvim/.config/nvim/lua/plugins\u001b[0m\u001b[38;5;3m main* \u001b[0m\r\n\u001b[0m\u001b[38;5;5m❯\u001b[0m ",
|
"ansi": "\u001b[0m\u001b[38;5;6m~\u001b[0m \r\n \u001b[0m\u001b[38;5;4m\u001b[0m\u001b[7m\u001b[38;5;4m liph \u001b[0m\u001b[38;5;4m\u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.atuin \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;5;6m/home/liph/\u001b[0m\u001b[1m\u001b[38;5;4mDocuments\u001b[0m \r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.cache \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m├── \u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4mdemo\u001b[0m \r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.cargo \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ ├── \u001b[0m .latexmkrc \r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.claude \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ ├── \u001b[0m\u001b[38;5;3m \u001b[0m\u001b[1m\u001b[38;5;3m1099-INT.tex\u001b[0m \r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;255;152;0m \u001b[0m\u001b[38;5;4m.config \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ ├── \u001b[0m\u001b[38;5;3m \u001b[0m\u001b[1m\u001b[38;5;3m1099-INT.tex.build.tex\u001b[0m\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.gnupg \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ ├── \u001b[0m\u001b[38;5;3m \u001b[0m\u001b[1m\u001b[38;5;3m1099-INT.tex.stripped.tex\u001b[0m \r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.local \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ ├── \u001b[0m\u001b[38;5;3m \u001b[0m\u001b[1m\u001b[38;5;3m1099-MISC.tex\u001b[0m\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.locale \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ ├── \u001b[0m ap_transaction.csv \r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.mozilla \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ ├── \u001b[0m ap_transaction.html\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.npm \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ ├── \u001b[0m\u001b[38;5;3m \u001b[0m\u001b[1m\u001b[38;5;3map_transaction.tex\u001b[0m\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.password-store \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ ├── \u001b[0m ar_transaction.csv\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;158;158;158m \u001b[0m\u001b[38;5;4m.pi\u001b[0m\u001b[3m\u001b[38;5;4m -> dotfiles/pi/.pi\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ ├── \u001b[0m ar_transaction.html\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.pyenv \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ ├── \u001b[0m\u001b[38;5;3m \u001b[0m\u001b[1m\u001b[38;5;3mar_transaction.tex\u001b[0m\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.rustup \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ ├── \u001b[0m\u001b[38;5;3m balance_sheet.aux\u001b[0m \r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;158;158;158m \u001b[0m\u001b[38;5;4m.ssh\u001b[0m\u001b[3m\u001b[38;5;4m -> dotfiles/ssh/.\u001b[0m\u001b[38;5;4m… \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ ├── \u001b[0m balance_sheet.csv\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.w3m \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ ├── \u001b[0m\u001b[38;5;3m balance_sheet.fdb_latexmk\u001b[0m\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;158;158;158m \u001b[0m\u001b[38Line truncated
|
||||||
"lines": 29
|
"lines": 35
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"panes": {
|
"panes": {
|
||||||
"4": {
|
"4": {
|
||||||
"ansi": " at YoutubeExplode.Videos.Streams.StreamClient.GetStreamInfosAsync(VideoId videoId, CancellationToken cancellationToken) in /_/YoutubeExplode/Videos/Streams/StreamClient.cs:line 272\r\n at YoutubeExplode.Videos.Streams.StreamClient.GetManifestAsync(VideoId videoId, CancellationToken cancellationToken) in /_/YoutubeExplode/Videos/Streams/StreamClient.cs:line 309\r\n at Jellyfin.Plugin.Themerr.YoutubeClientWrapper.DownloadAudioAsync(String videoUrl, String destination)\r\n at Jellyfin.Plugin.Themerr.ThemerrManager.SaveMp3(String destination, String videoUrl)\r\n[19:47:05] [ERR] [45] Jellyfin.Plugin.Themerr.ThemerrManager: Unable to download https://www.youtube.com/watch?v=gjVDYxWnj40 to /data/movies/Good Luck Have Fun Dont Die (2026) {tmdb-1119449}/theme.mp3\r\nYoutubeExplode.Exceptions.VideoUnavailableException: Video 'gjVDYxWnj40' is not available.\r\n at YoutubeExplode.Videos.VideoController.GetPlayerResponseAsync(VideoId videoId, CancellationToken cancellationToken) in /_/YoutubeExplode/Videos/VideoController.cs:line 146\r\n at YoutubeExplode.Videos.Streams.StreamClient.GetStreamInfosAsync(VideoId videoId, CancellationToken cancellationToken) in /_/YoutubeExplode/Videos/Streams/StreamClient.cs:line 272\r\n at YoutubeExplode.Videos.Streams.StreamClient.GetManifestAsync(VideoId videoId, CancellationToken cancellationToken) in /_/YoutubeExplode/Videos/Streams/StreamClient.cs:line 309\r\n at Jellyfin.Plugin.Themerr.YoutubeClientWrapper.DownloadAudioAsync(String videoUrl, String destination)\r\n at Jellyfin.Plugin.Themerr.ThemerrManager.SaveMp3(String destination, String videoUrl)\r\n[19:47:06] [ERR] [70] Jellyfin.Plugin.Themerr.ThemerrManager: Unable to download https://www.youtube.com/watch?v=xzefbu2ye3c to /data/series/House of the Dragon (2022) {tvdb-371572}/theme.mp3\r\nYoutubeExplode.Exceptions.VideoUnavailableException: Video 'xzefbu2ye3c' is not available.\r\n at YoutubeExplode.Videos.VideoController.GetPlayerResponseAsync(VideoId videoId, CancellationToken cancellationToken) in /_/YoutubeExplode/Videos/VideoController.cs:line 146\r\n at YoutubeExplode.Videos.Streams.StreamClient.GetStreamInfosAsync(VideoId videoId, CancellationToken cancellationToken) in /_/YoutubeExplode/Videos/Streams/StreamClient.cs:line 272\r\n at YoutubeExplode.Videos.Streams.StreamClient.GetManifestAsync(VideoId videoId, CancellationToken cancellationToken) in /_/YoutubeExplode/Videos/Streams/StreamClient.cs:line 309\r\n at Jellyfin.Plugin.Themerr.YoutubeClientWrapper.DownloadAudioAsync(String videoUrl, String destination)\r\n at Jellyfin.Plugin.Themerr.ThemerrManager.SaveMp3(String destination, String videoUrl)\r\n[19:47:06] [ERR] [70] Jellyfin.Plugin.Themerr.ThemerrManager: Unable to download https://www.youtube.com/watch?v=6pvyYEvlHCI to /data/movies/A House of Dynamite (2025) {tmdb-1290159}/theme.mp3\r\nYoutubeExplode.Exceptions.VideoUnavailableException: Video '6pvyYEvlHCI' is not available.\r\n at YoutubeExplode.Videos.VideoController.GetPlayerResponseAsync(VideoId videoId, CancellationToken cancellationToken) in /_/YoutubeExplode/Videos/VideoController.cs:line 146\r\n at YoutubeExplode.Videos.Streams.StreamClient.GetStreamInfosAsync(VideoId videoId, CancellationToken cancellationToken) in /_/YoutubeExplode/Videos/Streams/StreamClient.cs:line 272\r\n at YoutubeExplode.Videos.Streams.StreamClient.GetManifestAsync(VideoId videoId, CancellationToken cancellationToken) in /_/YoutubeExplode/Videos/Streams/StreamClient.cs:line 309\r\n at Jellyfin.Plugin.Themerr.YoutubeClientWrapper.DownloadAudioAsync(String videoUrl, String destination)\r\n at Jellyfin.Plugin.Themerr.ThemerrManager.SaveMp3(String destination, String videoUrl)\r\n[19:47:06] [ERR] [70] Jellyfin.Plugin.Themerr.ThemerrManager: Unable to download https://www.youtube.com/watch?v=RxabLA7UQ9k to /data/movies/Inception (2010) {tmdb-27205}/theme.mp3\r\nYoutubeExplode.Exceptions.VideoUnavailableException: Video 'RxabLA7UQ9k' is not available.\r\n at YoutubeExplode.Videos.VideoController.GetPlayerResponseAsync(VideoId videoId, CancellationToken cancellationToken) in /_/YoutubeExplode/Videos/VideoController.cs:line 146\r\n at YoutubeExplode.Videos.Streams.StreamClient.GetStreamInfosAsync(VideoId videoId, CancellationToken cancellationToken) in /_/YoutubeExplode/Videos/Streams/StreamClient.cs:line 272\r\n at YoutubeExplode.Videos.Streams.StreamClient.GetManifestAsync(VideoId videoId, CancellationToken cancellationToken) in /_/YoutubeExplode/Videos/Streams/StreamClient.cs:line 309\r\n at Jellyfin.Plugin.Themerr.YoutubeClientWrapper.DownloadAudioAsync(String videoUrl, String destination)\r\n at Jellyfin.Plugin.Themerr.ThemerrManager.SaveMp3(String destination, String videoUrl)\r\n[19:47:06] [ERR] [70] Jellyfin.Plugin.Themerr.ThemerrManager: Unable to download https://www.youtube.com/watch?v=qwTop2qs1tE to /data/series/IT Welcome to Derry (2025) {tvdb-418424}/theme.mp3\r\nYoutubeExplode.Exceptions.VideoUnavaLine truncated
|
"ansi": "\r\n\u001b[0m\u001b[38;5;5march liph \u001b[0m\u001b[38;5;4m~/dotfiles/aerc/.config/aerc\u001b[0m\u001b[38;5;3m main* \u001b[0m\r\n\u001b[0m\u001b[38;5;5m❯\u001b[0m ",
|
||||||
"lines": 4061
|
"lines": 3
|
||||||
},
|
},
|
||||||
"5": {
|
"3": {
|
||||||
"ansi": "\u001b[0m\u001b[38;5;5m❯ \u001b[0m\u001b[38;5;2mssh\u001b[0m seco\r\n^C\r\n\u001b[0m\u001b[38;5;1m❯ \u001b[0m\u001b[38;5;2mssh\u001b[0m seco\r\nssh: connect to host 100.69.98.79 port 50101: Connection timed out\r\n\u001b[0m\u001b[38;5;1m❯ \u001b[0m\u001b[38;5;2mssh\u001b[0m seco\r\nssh: connect to host 100.69.98.79 port 50101: Connection timed out\r\n\u001b[0m\u001b[38;5;1m❯ \u001b[0m\u001b[38;5;2mssh\u001b[0m seco\r\nssh: connect to host 100.69.98.79 port 50101: Connection timed out\r\n\u001b[0m\u001b[38;5;1m❯ \u001b[0m\u001b[38;5;2mssh\u001b[0m serv\r\n\u001b[0m\u001b[38;5;5m❯ \u001b[0m\u001b[38;5;2mexit\u001b[0m\r\nConnection to 100.69.72.2 closed.\r\n\u001b[0m\u001b[38;5;5m❯ \u001b[0m\u001b[38;5;2mssh\u001b[0m seco\r\nssh: connect to host 100.69.98.79 port 50101: Connection timed out\r\n\u001b[0m\u001b[38;5;1m❯ \u001b[0m\u001b[38;5;2mssh\u001b[0m cadd\r\n\u001b[0m\u001b[38;5;5m❯ \u001b[0m\u001b[38;5;2mnvim\u001b[0m \u001b[0m\u001b[4m/etc/caddy/Caddyfile\u001b[0m\r\n\u001b[0m\u001b[1m\u001b[38;5;3mFound existing alias for \u001b[0m\u001b[1m\u001b[38;5;5m\"nvim\"\u001b[0m\u001b[1m\u001b[38;5;3m. You should use: \u001b[0m\u001b[1m\u001b[38;5;5m\"nv\"\u001b[0m\r\n\r\n\u001b[0m\u001b[38;5;5m❯ \u001b[0m\u001b[38;5;2mcaddy\u001b[0m validate --config \u001b[0m\u001b[4m/etc/caddy/Caddyfile\u001b[0m\r\n2026/09/09 08:08:04.733 \u001b[0m\u001b[38;5;4mINFO \u001b[0musing config from file {\"file\": \"/etc/caddy/Caddyfile\"}\r\n2026/09/09 08:08:04.762 \u001b[0m\u001b[38;5;3mWARN \u001b[0mcaddyfile Using a path in a site address is deprecated; please use the 'handle' directive instead {\"address\": \"http://jitsi.liphlink.xyz/etherpad/\"}\r\n2026/09/09 08:08:04.773 \u001b[0m\u001b[38;5;4mINFO \u001b[0madapted config to JSON {\"adapter\": \"caddyfile\"}\r\n2026/09/09 08:08:04.773 \u001b[0m\u001b[38;5;3mWARN \u001b[0mCaddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies {\"adapter\": \"caddyfile\", \"file\": \"/etc/caddy/Caddyfile\", \"line\": 54}\r\n2026/09/09 08:08:04.786 \u001b[0m\u001b[38;5;4mINFO \u001b[0mhttp.auto_https server is listening only on the HTTPS port but has no TLS connection policies; adding one to enable TLS {\"server_name\": \"srv0\", \"https_port\": 443}\r\n2026/09/09 08:08:04.787 \u001b[0m\u001b[38;5;4mINFO \u001b[0mhttp.auto_https enabling automatic HTTP->HTTPS redirects {\"server_name\": \"srv0\"}\r\n2026/09/09 08:08:04.789 \u001b[0m\u001b[38;5;4mINFO \u001b[0mtls.cache.maintenance started background certificate maintenance {\"cache\": \"0x18df3147c500\"}\r\n2026/09/09 08:08:04.821 \u001b[0m\u001b[38;5;4mINFO \u001b[0mtls.cache.maintenance stopped background certificate maintenance {\"cache\": \"0x18df3147c500\"}\r\n2026/09/09 08:08:04.821 \u001b[0m\u001b[38;5;4mINFO \u001b[0mhttp servers shutting down with eternal grace period\r\nValid configuration\r\n\r\n\u001b[0m\u001b[38;5;5mcaddy liph \u001b[0m\u001b[38;5;4m~\u001b[0m\r\n\u001b[0m\u001b[38;5;5m❯\u001b[0m Read from remote host 100.69.98.182: Connection reset by peer\r\nConnection to 100.69.98.182 closed.\r\nclient_loop: send disconnect: Broken pipe\r\n\u001b[0m\u001b[38;5;1m❯ \u001b[0m\u001b[38;5;2mssh\u001b[0m immi\r\n\u001b[0m\u001b[38;5;5m❯ \u001b[0m\u001b[4m\u001b[38;5;2msudo\u001b[0m \u001b[0m\u001b[38;5;2mmkdir\u001b[0m -p /etc/containers/storage.conf.d\r\n\u001b[0m\u001b[4m\u001b[38;5;2msudo\u001b[0m \u001b[0m\u001b[38;5;2mtee\u001b[0m /etc/containers/storage.conf.d/10-overlay.conf \u001b[0m\u001b[38;5;3m<<'EOF'\u001b[0m\r\n\u001b[0m\u001b[1m\u001b[38;5;1m[storage]\u001b[0m\r\n\u001b[0m\u001b[1m\u001b[38;5;1mdriver\u001b[0m = \u001b[0m\u001b[38;5;3m\"overlay\"\u001b[0m\r\n\r\n\u001b[0m\u001b[1m\u001b[38;5;1m[storage.options.overlay]\u001b[0m\r\n\u001b[0m\u001b[1m\u001b[38;5;1mmount_program\u001b[0m = \u001b[0m\u001b[38;5;3m\"/usr/bin/fuse-overlayfs\"\u001b[0m\r\n\u001b[0m\u001b[1m\u001b[38;5;1mmountopt\u001b[0m = \u001b[0m\u001b[38;5;3m\"nodev\"\u001b[0m\r\n\u001b[0m\u001b[1m\u001b[38;5;1mEOF\u001b[0m\r\n[storage]\r\ndriver = \"overlay\"\r\n\r\n[storage.options.overlay]\r\nmount_program = \"/usr/bin/fuse-overlayfs\"\r\nmountopt = \"nodev\"\r\n\u001b[0m\u001b[38;5;5m❯ \u001b[0m\u001b[4m\u001b[38;5;2msudo\u001b[0m \u001b[0m\u001b[38;5;2mpacman\u001b[0m -S fuse-overlayfs\r\nresolving dependencies...\r\nlooking for conflicting packages...\r\n\r\n\u001b[0m\u001b[1mPackages (3)\u001b[0m fuse-common\u001b[0m\u001b[38;5;243m-3.18.2-1\u001b[0m fuse3\u001b[0m\u001b[38;5;243m-3.18.2-1\u001b[0m fuse-overlayfs\u001b[0m\u001b[38;5;243m-1.18-1\u001b[0m\r\n\r\n\u001b[0m\u001b[1mTotal Download Size: \u001b[0m 0.18 MiB\r\n\u001b[0m\u001b[1mTotal Installed Size:\u001b[0m 0.59 MiB\r\n\r\n\u001b[0m\u001b[1m\u001b[38;5;4m::\u001b[0m\u001b[1m Proceed with installation? [Y/n] \u001b[0my\r\n\u001b[0m\u001b[1m\u001b[38;5;4m::\u001b[0m\u001b[1m Retrieving packages...\u001b[0m\r\n fuse-common-3.18.... 2.7 KiB 17Line truncated
|
"ansi": "\r\n\u001b[0m\u001b[38;5;5march liph \u001b[0m\u001b[38;5;4m~\u001b[0m\r\n\u001b[0m\u001b[38;5;5m❯\u001b[0m ",
|
||||||
"lines": 787
|
"lines": 3
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"panes": {
|
"panes": {
|
||||||
"6": {
|
"5": {
|
||||||
"ansi": "\u001b[0m\u001b[1m\u001b[38;2;234;154;151m\u001b[48;2;35;33;54m phil \u001b[0m\u001b[48;2;35;33;54m spam proton \u001b[0m\r\n\u001b[0m\u001b[38;2;110;106;134m [..] \u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[38;2;110;106;134m [..] \u001b[0m\r\n\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\r\n\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\r\n\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\r\n\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\r\n\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\r\n\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\r\n\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\r\n\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\r\n\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\r\n\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\r\n\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\r\n\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\r\n\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\r\n\u001b[0m\u001b[38;2;110;106;134m \u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[38;2;110;106;134m Line truncated
|
"ansi": "\u001b[0m\u001b[1m\u001b[38;2;234;154;151m\u001b[48;2;35;33;54m phil \u001b[0m\u001b[48;2;35;33;54m spam proton \u001b[0m\r\n\u001b[0m\u001b[38;2;156;207;216m\u001b[48;2;35;33;54m+Action 0\u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;234;154;151m HealPlayLove Connected <no-reply@notification.… Walk & Talk Gathering – Regensberg to Baden Sep 18\u001b[0m\u001b[38;2;35;33;54m\u001b[48;2;110;106;134m \u001b[0m\r\n\u001b[0m\u001b[38;2;156;207;216m\u001b[48;2;35;33;54mArchive 1\u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[38;2;110;106;134m\u001b[48;2;42;39;63m a Liph <liiph@proton.me> another test Sep 18\u001b[0m\u001b[38;2;35;33;54m\u001b[48;2;110;106;134m \u001b[0m\r\n\u001b[0m\u001b[38;2;156;207;216m\u001b[48;2;35;33;54m+Community 0\u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[38;2;110;106;134m\u001b[48;2;42;39;63m a Liph <liiph@proton.me> test email Sep 18\u001b[0m \r\n\u001b[0m\u001b[38;2;156;207;216m\u001b[48;2;35;33;54mDrafts 0\u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[1m\u001b[38;2;224;222;244m\u001b[48;2;42;39;63m O HealPlayLove Connected <no-reply@notification.… Wild Women Gathering - special HPL discount Sep 18\u001b[0m \r\n\u001b[0m\u001b[38;2;156;207;216m\u001b[48;2;35;33;54mEverything 636 / 992\u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[1m\u001b[38;2;224;222;244m\u001b[48;2;42;39;63m O younity - find your flow! Festival <hello@youn… David Gihyam - neuer Speaker am find your flow! Sep 18\u001b[0m \r\n\u001b[0m\u001b[38;2;156;207;216m\u001b[48;2;35;33;54mFinance 0\u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[38;2;110;106;134m\u001b[48;2;42;39;63m Heal Play Love <hello@healplaylove.ch> This moment gave us goosebumps Sep 18\u001b[0m \r\n\u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;234;154;151mInbox 166 / 337\u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[1m\u001b[38;2;224;222;244m\u001b[48;2;42;39;63m O Wise <noreply@info.wise.com> Ready to earn a return? Sep 16\u001b[0m \r\n\u001b[0m\u001b[38;2;156;207;216m\u001b[48;2;35;33;54mJunk 0\u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[1m\u001b[38;2;224;222;244m\u001b[48;2;42;39;63m O Universal Sounds Schweiz <info@universalsounds… Deva Premal & Miten, Ape Chimba & die schönsten Bilder vom OpenAir Sep 15\u001b[0m \r\n\u001b[0m\u001b[38;2;156;207;216m\u001b[48;2;35;33;54m+Mail 0\u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[1m\u001b[38;2;224;222;244m\u001b[48;2;42;39;63m O HealPlayLove Connected <no-reply@notification.… Sa, 19.9 | DayRave@Oerlikon Sep 15\u001b[0m \r\n\u001b[0m\u001b[38;2;156;207;216m\u001b[48;2;35;33;54mNewsletters 0\u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[1m\u001b[38;2;224;222;244m\u001b[48;2;42;39;63m O Megan | Unity Breathwork <megan@unitybreathwor… Ready for a deep reset? Join us for free September 27 💫 Sep 14\u001b[0m \r\n\u001b[0m\u001b[38;2;156;207;216m\u001b[48;2;35;33;54mPersonal 0\u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[38;2;110;106;134m\u001b[48;2;42;39;63m a phil <liiph@protonmail.com> test Sep 14\u001b[0m \r\n\u001b[0m\u001b[38;2;156;207;216m\u001b[48;2;35;33;54m+Priority 0\u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[1m\u001b[38;2;224;222;244m\u001b[48;2;42;39;63m O Dr Joe Dispenza - younity <hello@younity.team> Erlebe Dr Joe 2027 LIVE - Jetzt Ticket sichern! Sep 13\u001b[0m \r\n\u001b[0m\u001b[38;2;156;207;216m\u001b[48;2;35;33;54mPriority1 0\u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;35;33;54m│\u001b[0m\u001b[38;2;110;106;1Line truncated
|
||||||
"lines": 39
|
"lines": 37
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -53,17 +41,33 @@
|
|||||||
"tabs": [
|
"tabs": [
|
||||||
{
|
{
|
||||||
"panes": {
|
"panes": {
|
||||||
"7": {
|
"6": {
|
||||||
"ansi": "\u001b[0m\u001b[38;5;6m~\u001b[0m \r\n \u001b[0m\u001b[38;5;4m\u001b[0m\u001b[7m\u001b[38;5;4m liph \u001b[0m\u001b[38;5;4m\u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.atuin \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;6m /home/liph/scripts\u001b[0m \u001b[0m\u001b[1m\u001b[38;5;8m->\u001b[0m \u001b[0m\u001b[38;5;6m/mnt/tank/\u001b[0m\u001b[1m\u001b[38;5;4mscripts\u001b[0m\r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.cache \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m├── \u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4mledger\u001b[0m \r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.cargo \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ └── \u001b[0m\u001b[38;5;4m \u001b[0m\u001b[1m\u001b[38;5;4mcustom\u001b[0m \r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;255;152;0m \u001b[0m\u001b[38;5;4m.config \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ ├── \u001b[0m\u001b[38;5;3m \u001b[0m\u001b[1m\u001b[38;5;3m1099-INT.tex\u001b[0m \r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.gnupg \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ ├── \u001b[0m\u001b[38;5;3m \u001b[0m\u001b[1m\u001b[38;5;3m1099-MISC.tex\u001b[0m \r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.local \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ ├── \u001b[0m ap_transaction.csv \r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.locale \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ ├── \u001b[0m ap_transaction.html \r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.mozilla \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ ├── \u001b[0m\u001b[38;5;3m \u001b[0m\u001b[1m\u001b[38;5;3map_transaction.tex\u001b[0m \r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.npm \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ ├── \u001b[0m ar_transaction.csv \r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;158;158;158m \u001b[0m\u001b[38;5;4m.pi\u001b[0m\u001b[3m\u001b[38;5;4m -> dotfiles/pi/.pi\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ ├── \u001b[0m ar_transaction.html \r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.pyenv \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ ├── \u001b[0m\u001b[38;5;3m \u001b[0m\u001b[1m\u001b[38;5;3mar_transaction.tex\u001b[0m \r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.rustup \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ ├── \u001b[0m balance_sheet.csv \r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;158;158;158m \u001b[0m\u001b[38;5;4m.ssh\u001b[0m\u001b[3m\u001b[38;5;4m -> dotfiles/ssh/.ssh\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ ├── \u001b[0m balance_sheet.html \r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;158;158;158m \u001b[0m\u001b[38;5;4maerc\u001b[0m\u001b[3m\u001b[38;5;4m -> dotfiles/aerc/aerc\u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[1m\u001b[38;5;8m│ ├── \u001b[0m\u001b[38;5;3m \u001b[0m\u001b[1m\u001b[38;5;3mbalance_sheet.tex\u001b[0m \r\n \u001b[0m\u001b[38;5;7m│\u001b[0m\u001b[38;5;4m \uLine truncated
|
"ansi": "yazi\r\nkk\u001b[0m\u001b[1m\u001b[7m%\u001b[0m \u001b[0m\u001b[38;5;5m❯ \u001b[0myazi\r\n \u001b[0m\u001b[1m\u001b[7m%\u001b[0m \u001b[0m\u001b[38;5;5march liph \u001b[0m\u001b[38;5;4m~/dotfiles\u001b[0m\u001b[38;5;3m main* \u001b[0m\r\n\u001b[0m\u001b[38;5;5m❯\u001b[0m \u001b[0m\u001b[1m\u001b[7m%\u001b[0m \u001b[0m\u001b[38;5;5march liph \u001b[0m\u001b[38;5;4m~/dotfiles\u001b[0m\u001b[38;5;3m main* \u001b[0m\r\n\u001b[0m\u001b[38;5;5m❯\u001b[0m ",
|
||||||
"lines": 37
|
"lines": 5
|
||||||
},
|
},
|
||||||
"8": {
|
"10": {
|
||||||
"ansi": "╭─[1]─Status──────────────────────────╮╮\r\n│\u001b[0m\u001b[38;5;2m✓\u001b[0m dotfiles → main ││\r\n╰─────────────────────────────────────╯│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m╭─[2]─Files \u001b[0m- Worktrees - Submodules\u001b[0m\u001b[1m\u001b[38;5;2m──╮\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m▼ / \u001b[0m\u001b[1m\u001b[38;5;2m▐\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m ▼ herdr/.config/herdr/sessions/home\u001b[0m\u001b[1m\u001b[38;5;2m▐\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m \u001b[0m\u001b[38;5;1mM\u001b[0m session-history.json \u001b[0m\u001b[1m\u001b[38;5;2m▐\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m \u001b[0m\u001b[38;5;1mM\u001b[0m session.json \u001b[0m\u001b[1m\u001b[38;5;2m▐\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m ▼ herdr_1/.config/herdr/plugins \u001b[0m\u001b[1m\u001b[38;5;2m▐\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m ▼ .tmp-install-750065-17853119876\u001b[0m\u001b[1m\u001b[38;5;2m▐\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m \u001b[0m\u001b[38;5;1mD\u001b[0m checkout \u001b[0m\u001b[1m\u001b[38;5;2m▐\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m ▼ github \u001b[0m\u001b[1m\u001b[38;5;2m▐\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m \u001b[0m\u001b[38;5;1mD\u001b[0m herdr-bar-96eebe452a9c \u001b[0m\u001b[1m\u001b[38;5;2m▐\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m \u001b[0m\u001b[38;5;1mD\u001b[0m herdr-lazygit-b11d62e75f78 \u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m \u001b[0m\u001b[38;5;1mD\u001b[0m herdr-spreader-f248c87aa2e2 \u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m \u001b[0m\u001b[38;5;1mD\u001b[0m herdr-zoxide-f7b96c313637 \u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m╰────────────────────────────15 of 15─╯\u001b[0m│\r\n╭─[3]─\u001b[0m\u001b[38;5;2mLocal branches \u001b[0m- Remotes - Tags─╮│\r\n│\u001b[0m\u001b[38;5;2m *\u001b[0m main \u001b[0m\u001b[38;5;2m✓\u001b[0m ││\r\n│ ││\r\n│ ││\r\n│ ││\r\n│ ││\r\n╰──────────────────────────────1 of 1─╯│\r\n╭─[4]─\u001b[0m\u001b[38;5;2mCommits \u001b[0m- Reflog────────────────╮│\r\n│\u001b[0m\u001b[38;5;2m893fe34a\u001b[0m \u001b[0m\u001b[38;2;36;244;94mli\u001b[0m \u001b[0m\u001b[38;2;36;244;94m○\u001b[0m updated dotfiles ▐│\r\n│\u001b[0m\u001b[38;5;2m89b1e380\u001b[0m \u001b[0m\u001b[38;2;36;244;94mli\u001b[0m \u001b[0m\u001b[38;2;36;244;94m○\u001b[0m udated colorscheme ││\r\n│\u001b[0m\u001b[38;5;2me078b218\u001b[0m \u001b[0m\u001b[38;2;36;244;94mli\u001b[0m \u001b[0m\u001b[38;2;36;244;94m○\u001b[0m changed to tokyo night ││\r\n│\u001b[0m\u001b[38;5;2m82af2452\u001b[0m \u001b[0m\u001b[38;2;36;244;94mli\u001b[0m \u001b[0m\u001b[38;2;36;244;94m○\u001b[0m hyprlock changes ││\r\n│\u001b[0m\u001b[38;5;2m0eaac74d\u001b[0m \u001b[0m\u001b[38;2;36;244;94mli\u001b[0m \u001b[0m\u001b[38;2;36;244;94m○\u001b[0m updated zshrc ││\r\n╰─────────────────────────────1 of 77─╯╯\r\n╭─[5]─Stash───────────────────────────╮╮\r\n│\u001b[0m\u001b[38;5;6m1d\u001b[0m On main: tmp install ││\r\n╰──────────────────────────────1 of 1─╯╯\r\n\u001b[0m\u001b[38;5;4mStage: <space\u001b[0m \u001b[0m\u001b[4m\u001b[38;5;5mDonate\u001b[0m \u001b[0m\u001b[4m\u001b[38;5;3mAsk Question\u001b[0m 0.63.0\u001b[0m\u001b[1m\u001b[7m%\u001b[0m \u001b[0m\u001b[38;5;5march liph \u001b[0m\u001b[38;5;4m~/dotfiles\u001b[0m\u001b[38;5;3m main* \u001b[0m\r\n\u001b[0m\u001b[38;5;5m❯\u001b[0m \u001b[0m\u001b[1m\u001b[7m%\u001b[0m \u001b[0m\u001b[38;5;5march liph \u001b[0m\u001b[38;5;4m~/dotfiles\u001b[0m\u001b[38;5;3m main* \u001b[0m\r\n\u001b[0m\u001b[38;5;5m❯\u001b[0m ",
|
"ansi": "╭─[1]─Status─────╮╮\r\n│\u001b[0m\u001b[38;5;2m✓\u001b[0m dotfiles → mai│▐\r\n╰────────────────╯│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m╭─[2]─Files \u001b[0m- Wo\u001b[0m\u001b[1m\u001b[38;5;2m─╮\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m\u001b[1m\u001b[48;5;4m▼ / \u001b[0m\u001b[1m\u001b[38;5;2m▐\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m ▼ aerc/.config\u001b[0m\u001b[1m\u001b[38;5;2m▐\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m \u001b[0m\u001b[38;5;1mM\u001b[0m AGENTS.md\u001b[0m\u001b[1m\u001b[38;5;2m▐\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m \u001b[0m\u001b[38;5;1mM\u001b[0m accounts.\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m \u001b[0m\u001b[38;5;1mM\u001b[0m aerc.conf\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m \u001b[0m\u001b[38;5;1m??\u001b[0m aerc.conf\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m \u001b[0m\u001b[38;5;1m??\u001b[0m aerc.conf\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m \u001b[0m\u001b[38;5;1mM\u001b[0m binds.con\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m \u001b[0m\u001b[38;5;1m??\u001b[0m binds.con\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m ▼ herdr/.confi\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m ▼ plugins/co\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m \u001b[0m\u001b[38;5;1mM\u001b[0m home.ym\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m╰────────1 of 61─╯\u001b[0m│\r\n╭─[3]─\u001b[0m\u001b[38;5;2mLocal bran\u001b[0m─╮│\r\n│\u001b[0m\u001b[38;5;2m *\u001b[0m main \u001b[0m\u001b[38;5;2m✓\u001b[0m ││\r\n│ ││\r\n│ ││\r\n│ ││\r\n│ ││\r\n╰─────────1 of 1─╯│\r\n╭─[4]─\u001b[0m\u001b[38;5;2mCommits \u001b[0m- ─╮│\r\n│\u001b[0m\u001b[38;5;2md1b2fbdf\u001b[0m \u001b[0m\u001b[38;2;36;244;94mli\u001b[0m \u001b[0m\u001b[38;2;36;244;94m○\u001b[0m up▐│\r\n│\u001b[0m\u001b[38;5;2m893fe34a\u001b[0m \u001b[0m\u001b[38;2;36;244;94mli\u001b[0m \u001b[0m\u001b[38;2;36;244;94m○\u001b[0m up││\r\n│\u001b[0m\u001b[38;5;2m89b1e380\u001b[0m \u001b[0m\u001b[38;2;36;244;94mli\u001b[0m \u001b[0m\u001b[38;2;36;244;94m○\u001b[0m ud││\r\n│\u001b[0m\u001b[38;5;2me078b218\u001b[0m \u001b[0m\u001b[38;2;36;244;94mli\u001b[0m \u001b[0m\u001b[38;2;36;244;94m○\u001b[0m ch││\r\n│\u001b[0m\u001b[38;5;2m82af2452\u001b[0m \u001b[0m\u001b[38;2;36;244;94mli\u001b[0m \u001b[0m\u001b[38;2;36;244;94m○\u001b[0m hy││\r\n╰────────1 of 78─╯╯\r\n╭─[5]─Stash──────╮╮\r\n│\u001b[0m\u001b[38;5;6m1w\u001b[0m On main: tmp ││\r\n╰─────────1 of 1─╯╯\r\n \u001b[0m\u001b[4m\u001b[38;5;5mDonate\u001b[0m \u001b[0m\u001b[4m\u001b[38;5;3mAsk Questio\u001b[0m",
|
||||||
|
"lines": 35
|
||||||
|
},
|
||||||
|
"7": {
|
||||||
|
"ansi": "╭─[1]─Status──────────────────────────╮╮\r\n│\u001b[0m\u001b[38;5;2m✓\u001b[0m dotfiles → main │▐\r\n╰─────────────────────────────────────╯│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m╭─[2]─Files \u001b[0m- Worktrees - Submodules\u001b[0m\u001b[1m\u001b[38;5;2m──╮\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m\u001b[1m\u001b[48;5;4m▼ / \u001b[0m\u001b[1m\u001b[38;5;2m▐\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m ▼ aerc/.config/aerc \u001b[0m\u001b[1m\u001b[38;5;2m▐\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m \u001b[0m\u001b[38;5;1mM\u001b[0m AGENTS.md \u001b[0m\u001b[1m\u001b[38;5;2m▐\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m \u001b[0m\u001b[38;5;1mM\u001b[0m accounts.conf \u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m \u001b[0m\u001b[38;5;1mM\u001b[0m aerc.conf \u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m \u001b[0m\u001b[38;5;1m??\u001b[0m aerc.conf.pre-attach \u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m \u001b[0m\u001b[38;5;1mM\u001b[0m binds.conf \u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m \u001b[0m\u001b[38;5;1m??\u001b[0m binds.conf.pre-M \u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m ▼ herdr/.config/herdr \u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m ▼ plugins/config/herdr-spreader \u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m \u001b[0m\u001b[38;5;1mM\u001b[0m home.yml \u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m \u001b[0m\u001b[38;5;1mM\u001b[0m release-notes.json \u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m╰─────────────────────────────1 of 52─╯\u001b[0m│\r\n╭─[3]─\u001b[0m\u001b[38;5;2mLocal branches \u001b[0m- Remotes - Tags─╮│\r\n│\u001b[0m\u001b[38;5;2m *\u001b[0m main \u001b[0m\u001b[38;5;2m✓\u001b[0m ││\r\n│ ││\r\n│ ││\r\n│ ││\r\n│ ││\r\n╰──────────────────────────────1 of 1─╯│\r\n╭─[4]─\u001b[0m\u001b[38;5;2mCommits \u001b[0m- Reflog────────────────╮│\r\n│\u001b[0m\u001b[38;5;2md1b2fbdf\u001b[0m \u001b[0m\u001b[38;2;36;244;94mli\u001b[0m \u001b[0m\u001b[38;2;36;244;94m○\u001b[0m updated nvim treesitter▐│\r\n│\u001b[0m\u001b[38;5;2m893fe34a\u001b[0m \u001b[0m\u001b[38;2;36;244;94mli\u001b[0m \u001b[0m\u001b[38;2;36;244;94m○\u001b[0m updated dotfiles ││\r\n│\u001b[0m\u001b[38;5;2m89b1e380\u001b[0m \u001b[0m\u001b[38;2;36;244;94mli\u001b[0m \u001b[0m\u001b[38;2;36;244;94m○\u001b[0m udated colorscheme ││\r\n│\u001b[0m\u001b[38;5;2me078b218\u001b[0m \u001b[0m\u001b[38;2;36;244;94mli\u001b[0m \u001b[0m\u001b[38;2;36;244;94m○\u001b[0m changed to tokyo night ││\r\n│\u001b[0m\u001b[38;5;2m82af2452\u001b[0m \u001b[0m\u001b[38;2;36;244;94mli\u001b[0m \u001b[0m\u001b[38;2;36;244;94m○\u001b[0m hyprlock changes ││\r\n╰─────────────────────────────1 of 78─╯╯\r\n╭─[5]─Stash───────────────────────────╮╮\r\n│\u001b[0m\u001b[38;5;6m1w\u001b[0m On main: tmp install ││\r\n╰──────────────────────────────1 of 1─╯╯\r\n\u001b[0m\u001b[38;5;4mStage: <space\u001b[0m \u001b[0m\u001b[4m\u001b[38;5;5mDonate\u001b[0m \u001b[0m\u001b[4m\u001b[38;5;3mAsk Question\u001b[0m 0.63.0\u001b[0m\u001b[1m\u001b[7m%\u001b[0m \u001b[0m\u001b[38;5;5march liph \u001b[0m\u001b[38;5;4m~/dotfiles\u001b[0m\u001b[38;5;3m main* \u001b[0m\r\n\u001b[0m\u001b[38;5;5m❯\u001b[0m \u001b[0m\u001b[1m\u001b[7m%\u001b[0m \u001b[0m\u001b[38;5;5march liph \u001b[0m\u001b[38;5;4m~/dotfil\u001b[0m\u001b[38;5;5march liph \u001b[0m\u001b[38;5;4m~/dotfiles\u001b[0m\u001b[38;5;3m main* \u001b[0m\r\n\u001b[Line truncated
|
||||||
"lines": 37
|
"lines": 37
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tabs": [
|
||||||
|
{
|
||||||
|
"panes": {
|
||||||
|
"8": {
|
||||||
|
"ansi": "\u001b[0m\u001b[38;5;5march liph \u001b[0m\u001b[38;5;4m/mnt/tank/code\u001b[0m\r\n\u001b[0m\u001b[38;5;5m❯\u001b[0m \u001b[0m\u001b[1m\u001b[7m%\u001b[0m \u001b[0m\u001b[38;5;5march liph \u001b[0m\u001b[38;5;4m~\u001b[0m\r\n\u001b[0m\u001b[38;5;5march liph \u001b[0m\u001b[38;5;4m~\u001b[0m\r\n\u001b[0m\u001b[38;5;5m❯\u001b[0m \u001b[0m\u001b[38;5;2mcd\u001b[0m \u001b[0m\u001b[4mdot\u001b[0m ",
|
||||||
|
"lines": 4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -2,47 +2,17 @@
|
|||||||
"version": 3,
|
"version": 3,
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
{
|
{
|
||||||
"id": "w4",
|
"id": "w0",
|
||||||
"custom_name": null,
|
|
||||||
"identity_cwd": "/home/liph",
|
|
||||||
"public_pane_numbers": {
|
|
||||||
"1": 1
|
|
||||||
},
|
|
||||||
"next_public_pane_number": 2,
|
|
||||||
"public_tab_numbers": [
|
|
||||||
1
|
|
||||||
],
|
|
||||||
"next_public_tab_number": 2,
|
|
||||||
"tabs": [
|
|
||||||
{
|
|
||||||
"custom_name": null,
|
|
||||||
"layout": {
|
|
||||||
"Pane": 1
|
|
||||||
},
|
|
||||||
"panes": {
|
|
||||||
"1": {
|
|
||||||
"cwd": "/home/liph"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"zoomed": false,
|
|
||||||
"focused": 1,
|
|
||||||
"root_pane": 1
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"active_tab": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "w5",
|
|
||||||
"custom_name": "Home",
|
"custom_name": "Home",
|
||||||
"identity_cwd": "/home/liph/dotfiles/nvim/.config/nvim/lua",
|
"identity_cwd": "/mnt",
|
||||||
"public_pane_numbers": {
|
"public_pane_numbers": {
|
||||||
"6": 5,
|
"1": 1,
|
||||||
"10": 10,
|
"5": 5,
|
||||||
"4": 4,
|
"4": 4,
|
||||||
"3": 6,
|
"2": 2,
|
||||||
"5": 8
|
"3": 3
|
||||||
},
|
},
|
||||||
"next_public_pane_number": 11,
|
"next_public_pane_number": 6,
|
||||||
"public_tab_numbers": [
|
"public_tab_numbers": [
|
||||||
1,
|
1,
|
||||||
2,
|
2,
|
||||||
@@ -57,24 +27,24 @@
|
|||||||
"direction": "Horizontal",
|
"direction": "Horizontal",
|
||||||
"ratio": 0.5,
|
"ratio": 0.5,
|
||||||
"first": {
|
"first": {
|
||||||
"Pane": 3
|
"Pane": 1
|
||||||
},
|
},
|
||||||
"second": {
|
"second": {
|
||||||
"Pane": 10
|
"Pane": 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"panes": {
|
"panes": {
|
||||||
"3": {
|
"2": {
|
||||||
"cwd": "/home/liph/dotfiles/nvim/.config/nvim/lua"
|
"cwd": "/home/liph"
|
||||||
},
|
},
|
||||||
"10": {
|
"1": {
|
||||||
"cwd": "/home/liph/dotfiles/nvim/.config/nvim/lua/plugins"
|
"cwd": "/mnt"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"zoomed": false,
|
"zoomed": false,
|
||||||
"focused": 10,
|
"focused": 2,
|
||||||
"root_pane": 3
|
"root_pane": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"custom_name": "Music",
|
"custom_name": "Music",
|
||||||
@@ -83,51 +53,52 @@
|
|||||||
"direction": "Horizontal",
|
"direction": "Horizontal",
|
||||||
"ratio": 0.5,
|
"ratio": 0.5,
|
||||||
"first": {
|
"first": {
|
||||||
"Pane": 4
|
"Pane": 3
|
||||||
},
|
},
|
||||||
"second": {
|
"second": {
|
||||||
"Pane": 5
|
"Pane": 4
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"panes": {
|
"panes": {
|
||||||
"4": {
|
"4": {
|
||||||
"cwd": "/home/liph"
|
"cwd": "/home/liph/dotfiles/aerc/.config/aerc"
|
||||||
},
|
},
|
||||||
|
"3": {
|
||||||
|
"cwd": "/home/liph"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"zoomed": false,
|
||||||
|
"focused": 3,
|
||||||
|
"root_pane": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"custom_name": "Aerc",
|
||||||
|
"layout": {
|
||||||
|
"Pane": 5
|
||||||
|
},
|
||||||
|
"panes": {
|
||||||
"5": {
|
"5": {
|
||||||
"cwd": "/home/liph"
|
"cwd": "/home/liph"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"zoomed": false,
|
"zoomed": false,
|
||||||
"focused": 4,
|
"focused": 5,
|
||||||
"root_pane": 4
|
"root_pane": 5
|
||||||
},
|
|
||||||
{
|
|
||||||
"custom_name": "Aerc",
|
|
||||||
"layout": {
|
|
||||||
"Pane": 6
|
|
||||||
},
|
|
||||||
"panes": {
|
|
||||||
"6": {
|
|
||||||
"cwd": "/home/liph"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"zoomed": false,
|
|
||||||
"focused": 6,
|
|
||||||
"root_pane": 6
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"active_tab": 0
|
"active_tab": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "w6",
|
"id": "w11",
|
||||||
"custom_name": "Dotfiles",
|
"custom_name": "Dotfiles",
|
||||||
"identity_cwd": "/home/liph/dotfiles",
|
"identity_cwd": "/home/liph/dotfiles",
|
||||||
"public_pane_numbers": {
|
"public_pane_numbers": {
|
||||||
"7": 1,
|
"10": 3,
|
||||||
"8": 2
|
"6": 1,
|
||||||
|
"7": 2
|
||||||
},
|
},
|
||||||
"next_public_pane_number": 3,
|
"next_public_pane_number": 4,
|
||||||
"public_tab_numbers": [
|
"public_tab_numbers": [
|
||||||
1
|
1
|
||||||
],
|
],
|
||||||
@@ -140,25 +111,73 @@
|
|||||||
"direction": "Horizontal",
|
"direction": "Horizontal",
|
||||||
"ratio": 0.7613636,
|
"ratio": 0.7613636,
|
||||||
"first": {
|
"first": {
|
||||||
"Pane": 7
|
"Pane": 6
|
||||||
},
|
},
|
||||||
"second": {
|
"second": {
|
||||||
"Pane": 8
|
"Split": {
|
||||||
|
"direction": "Horizontal",
|
||||||
|
"ratio": 0.5,
|
||||||
|
"first": {
|
||||||
|
"Pane": 7
|
||||||
|
},
|
||||||
|
"second": {
|
||||||
|
"Pane": 10
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"panes": {
|
"panes": {
|
||||||
"8": {
|
"10": {
|
||||||
|
"cwd": "/home/liph/dotfiles",
|
||||||
|
"label": "Git",
|
||||||
|
"launch_argv": [
|
||||||
|
"bash",
|
||||||
|
"-c",
|
||||||
|
"exec bash \"$HERDR_PLUGIN_ROOT/scripts/run-lazygit.sh\""
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"7": {
|
||||||
"cwd": "/home/liph/dotfiles",
|
"cwd": "/home/liph/dotfiles",
|
||||||
"label": "Git"
|
"label": "Git"
|
||||||
},
|
},
|
||||||
"7": {
|
"6": {
|
||||||
"cwd": "/home/liph/dotfiles"
|
"cwd": "/home/liph/dotfiles"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"zoomed": false,
|
"zoomed": false,
|
||||||
"focused": 7,
|
"focused": 10,
|
||||||
"root_pane": 7
|
"root_pane": 6
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"active_tab": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "w12",
|
||||||
|
"custom_name": "Coding",
|
||||||
|
"identity_cwd": "/home/liph",
|
||||||
|
"public_pane_numbers": {
|
||||||
|
"8": 1
|
||||||
|
},
|
||||||
|
"next_public_pane_number": 3,
|
||||||
|
"public_tab_numbers": [
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"next_public_tab_number": 2,
|
||||||
|
"tabs": [
|
||||||
|
{
|
||||||
|
"custom_name": "Pi",
|
||||||
|
"layout": {
|
||||||
|
"Pane": 8
|
||||||
|
},
|
||||||
|
"panes": {
|
||||||
|
"8": {
|
||||||
|
"cwd": "/home/liph"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"zoomed": false,
|
||||||
|
"focused": 8,
|
||||||
|
"root_pane": 8
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"active_tab": 0
|
"active_tab": 0
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
/usr/lib/systemd/user/protonmail-bridge.service
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
/home/liph/.config/systemd/user/swayidle.service
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
/home/liph/dotfiles/systemd/.config/systemd/user/mailsync-login.timer
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
/home/liph/dotfiles/systemd/.config/systemd/user/mailsync.service
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
/home/liph/dotfiles/systemd/.config/systemd/user/mailsync.timer
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
/home/liph/.config/systemd/user/mailsync-login.timer
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
/home/liph/.config/systemd/user/mailsync.timer
|
||||||
@@ -101,7 +101,7 @@ spawn-at-startup "wezterm"
|
|||||||
spawn-at-startup "obsidian"
|
spawn-at-startup "obsidian"
|
||||||
// spawn-at-startup "kanshi"
|
// spawn-at-startup "kanshi"
|
||||||
spawn-at-startup "librewolf"
|
spawn-at-startup "librewolf"
|
||||||
spawn-at-startup "sh" "-c" "sleep 5 && exec swayidle -w timeout 300 hyprlock timeout 600 'niri msg action power-off-monitors' resume 'niri msg action power-on-monitors' timeout 3600 'systemctl suspend'"
|
spawn-at-startup "swayidle" "-w" "timeout" "200" "hyprlock" "timeout" "600" "niri msg action power-off-monitors" "resume" "niri msg action power-on-monitors" "timeout" "3600" "systemctl suspend"
|
||||||
|
|
||||||
prefer-no-csd
|
prefer-no-csd
|
||||||
gestures {
|
gestures {
|
||||||
@@ -126,7 +126,12 @@ window-rule {
|
|||||||
match app-id="Zoom Workplace"
|
match app-id="Zoom Workplace"
|
||||||
open-floating true
|
open-floating true
|
||||||
}
|
}
|
||||||
// Wezterm window rules
|
|
||||||
|
////////////////////////////////////
|
||||||
|
////// Startup Window Rules ////////
|
||||||
|
////////////////////////////////////
|
||||||
|
|
||||||
|
// Wezterm
|
||||||
window-rule {
|
window-rule {
|
||||||
match at-startup=true app-id="wezterm"
|
match at-startup=true app-id="wezterm"
|
||||||
open-on-workspace "1"
|
open-on-workspace "1"
|
||||||
@@ -134,39 +139,52 @@ window-rule {
|
|||||||
open-floating false
|
open-floating false
|
||||||
// clip-to-geometry true
|
// clip-to-geometry true
|
||||||
}
|
}
|
||||||
|
// Librewolf
|
||||||
window-rule {
|
window-rule {
|
||||||
match at-startup=false app-id="wezterm"
|
match at-startup=true app-id="librewolf"
|
||||||
open-floating false
|
open-on-workspace "2"
|
||||||
// clip-to-geometry true
|
open-maximized true
|
||||||
}
|
}
|
||||||
// Obsidian window rules
|
// Obsidian
|
||||||
window-rule {
|
window-rule {
|
||||||
match at-startup=true app-id="obsidian"
|
match at-startup=true app-id="obsidian"
|
||||||
open-on-workspace "3"
|
open-on-workspace "3"
|
||||||
open-maximized true
|
open-maximized true
|
||||||
open-floating false
|
open-floating false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////
|
||||||
|
/////// Normal Window Rules ////////
|
||||||
|
////////////////////////////////////
|
||||||
|
|
||||||
|
// Wezterm
|
||||||
|
window-rule {
|
||||||
|
match app-id="wezterm"
|
||||||
|
open-floating false
|
||||||
|
clip-to-geometry true
|
||||||
|
default-column-width {
|
||||||
|
proportion 0.5
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Steam
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="steam_app_4197610"
|
match app-id="steam_app_4197610"
|
||||||
open-fullscreen true
|
open-fullscreen true
|
||||||
}
|
}
|
||||||
|
// Obsidian
|
||||||
window-rule {
|
window-rule {
|
||||||
match at-startup=false app-id="obsidian"
|
match at-startup=false app-id="obsidian"
|
||||||
open-maximized true
|
open-maximized true
|
||||||
open-floating false
|
open-floating false
|
||||||
}
|
}
|
||||||
// Librewolf window rules
|
// Librewolf
|
||||||
window-rule {
|
|
||||||
match at-startup=true app-id="librewolf"
|
|
||||||
open-on-workspace "2"
|
|
||||||
open-maximized true
|
|
||||||
}
|
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="librewolf"
|
match app-id="librewolf"
|
||||||
open-maximized true
|
open-maximized true
|
||||||
clip-to-geometry true
|
clip-to-geometry true
|
||||||
open-floating false
|
open-floating false
|
||||||
}
|
}
|
||||||
|
// Slack
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="slack"
|
match app-id="slack"
|
||||||
open-maximized true
|
open-maximized true
|
||||||
@@ -174,6 +192,7 @@ window-rule {
|
|||||||
open-on-workspace "4"
|
open-on-workspace "4"
|
||||||
open-floating false
|
open-floating false
|
||||||
}
|
}
|
||||||
|
// Tidal
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="tidal-hifi"
|
match app-id="tidal-hifi"
|
||||||
open-maximized true
|
open-maximized true
|
||||||
@@ -181,6 +200,7 @@ window-rule {
|
|||||||
open-floating false
|
open-floating false
|
||||||
open-on-workspace "4"
|
open-on-workspace "4"
|
||||||
}
|
}
|
||||||
|
// Tor
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="Tor Browser"
|
match app-id="Tor Browser"
|
||||||
open-maximized true
|
open-maximized true
|
||||||
@@ -188,15 +208,14 @@ window-rule {
|
|||||||
open-floating false
|
open-floating false
|
||||||
open-on-workspace "2"
|
open-on-workspace "2"
|
||||||
}
|
}
|
||||||
|
// Claude
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="Claude"
|
match app-id="Claude"
|
||||||
open-on-workspace "4"
|
open-on-workspace "4"
|
||||||
default-column-width {
|
open-maximized true
|
||||||
proportion 0.6667
|
|
||||||
}
|
|
||||||
clip-to-geometry true
|
clip-to-geometry true
|
||||||
}
|
}
|
||||||
// 2. Specific rule for windows opening at startup
|
// Betterbird
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="eu.betterbird.Betterbird"
|
match app-id="eu.betterbird.Betterbird"
|
||||||
open-maximized true
|
open-maximized true
|
||||||
@@ -204,26 +223,11 @@ window-rule {
|
|||||||
open-on-workspace "3"
|
open-on-workspace "3"
|
||||||
}
|
}
|
||||||
|
|
||||||
window-rule {
|
////////////////////////////////////
|
||||||
match app-id="Slack"
|
/////// Special Window Rules ///////
|
||||||
open-maximized true
|
////////////////////////////////////
|
||||||
clip-to-geometry true
|
|
||||||
open-on-workspace "4"
|
// Htop
|
||||||
}
|
|
||||||
window-rule {
|
|
||||||
match app-id="floating_btop"
|
|
||||||
default-column-width {
|
|
||||||
proportion 0.6667
|
|
||||||
}
|
|
||||||
open-floating true
|
|
||||||
}
|
|
||||||
window-rule {
|
|
||||||
match app-id="floating_musikcube"
|
|
||||||
default-column-width {
|
|
||||||
proportion 0.6667
|
|
||||||
}
|
|
||||||
open-floating true
|
|
||||||
}
|
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="floating_htop"
|
match app-id="floating_htop"
|
||||||
default-column-width {
|
default-column-width {
|
||||||
@@ -231,6 +235,23 @@ window-rule {
|
|||||||
}
|
}
|
||||||
open-floating true
|
open-floating true
|
||||||
}
|
}
|
||||||
|
// Btop
|
||||||
|
window-rule {
|
||||||
|
match app-id="floating_btop"
|
||||||
|
default-column-width {
|
||||||
|
proportion 0.6667
|
||||||
|
}
|
||||||
|
open-floating true
|
||||||
|
}
|
||||||
|
// Musikcube
|
||||||
|
window-rule {
|
||||||
|
match app-id="floating_musikcube"
|
||||||
|
default-column-width {
|
||||||
|
proportion 0.6667
|
||||||
|
}
|
||||||
|
open-floating true
|
||||||
|
}
|
||||||
|
// Bluetui
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="floating_bluetui"
|
match app-id="floating_bluetui"
|
||||||
default-column-width {
|
default-column-width {
|
||||||
@@ -238,6 +259,7 @@ window-rule {
|
|||||||
}
|
}
|
||||||
open-floating true
|
open-floating true
|
||||||
}
|
}
|
||||||
|
// Pulsemixer
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="floating_pulsemixer"
|
match app-id="floating_pulsemixer"
|
||||||
default-column-width {
|
default-column-width {
|
||||||
@@ -245,6 +267,7 @@ window-rule {
|
|||||||
}
|
}
|
||||||
open-floating true
|
open-floating true
|
||||||
}
|
}
|
||||||
|
// Wavemon
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="floating_wavemon"
|
match app-id="floating_wavemon"
|
||||||
default-column-width {
|
default-column-width {
|
||||||
@@ -252,6 +275,7 @@ window-rule {
|
|||||||
}
|
}
|
||||||
open-floating true
|
open-floating true
|
||||||
}
|
}
|
||||||
|
// network-tui
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="floating_network-tui"
|
match app-id="floating_network-tui"
|
||||||
default-column-width {
|
default-column-width {
|
||||||
@@ -259,6 +283,7 @@ window-rule {
|
|||||||
}
|
}
|
||||||
open-floating true
|
open-floating true
|
||||||
}
|
}
|
||||||
|
// Yazi
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="floating_yazi"
|
match app-id="floating_yazi"
|
||||||
default-column-width {
|
default-column-width {
|
||||||
@@ -266,12 +291,18 @@ window-rule {
|
|||||||
}
|
}
|
||||||
open-floating true
|
open-floating true
|
||||||
}
|
}
|
||||||
|
|
||||||
window-rule {
|
window-rule {
|
||||||
geometry-corner-radius 5
|
geometry-corner-radius 5
|
||||||
clip-to-geometry true
|
clip-to-geometry true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////
|
||||||
|
//////////// Keybinds///////////////
|
||||||
|
////////////////////////////////////
|
||||||
|
|
||||||
binds {
|
binds {
|
||||||
// Mod+Shift+Slash { show-hotkey-overlay; }
|
|
||||||
Mod+Mod5+J {
|
Mod+Mod5+J {
|
||||||
spawn "hyprlock"
|
spawn "hyprlock"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -126,7 +126,12 @@ window-rule {
|
|||||||
match app-id="Zoom Workplace"
|
match app-id="Zoom Workplace"
|
||||||
open-floating true
|
open-floating true
|
||||||
}
|
}
|
||||||
// Wezterm window rules
|
|
||||||
|
////////////////////////////////////
|
||||||
|
////// Startup Window Rules ////////
|
||||||
|
////////////////////////////////////
|
||||||
|
|
||||||
|
// Wezterm
|
||||||
window-rule {
|
window-rule {
|
||||||
match at-startup=true app-id="wezterm"
|
match at-startup=true app-id="wezterm"
|
||||||
open-on-workspace "1"
|
open-on-workspace "1"
|
||||||
@@ -134,39 +139,52 @@ window-rule {
|
|||||||
open-floating false
|
open-floating false
|
||||||
// clip-to-geometry true
|
// clip-to-geometry true
|
||||||
}
|
}
|
||||||
|
// Librewolf
|
||||||
window-rule {
|
window-rule {
|
||||||
match at-startup=false app-id="wezterm"
|
match at-startup=true app-id="librewolf"
|
||||||
open-floating false
|
open-on-workspace "2"
|
||||||
// clip-to-geometry true
|
open-maximized true
|
||||||
}
|
}
|
||||||
// Obsidian window rules
|
// Obsidian
|
||||||
window-rule {
|
window-rule {
|
||||||
match at-startup=true app-id="obsidian"
|
match at-startup=true app-id="obsidian"
|
||||||
open-on-workspace "3"
|
open-on-workspace "3"
|
||||||
open-maximized true
|
open-maximized true
|
||||||
open-floating false
|
open-floating false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////
|
||||||
|
/////// Normal Window Rules ////////
|
||||||
|
////////////////////////////////////
|
||||||
|
|
||||||
|
// Wezterm
|
||||||
|
window-rule {
|
||||||
|
match app-id="wezterm"
|
||||||
|
open-floating false
|
||||||
|
clip-to-geometry true
|
||||||
|
default-column-width {
|
||||||
|
proportion 0.5
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Steam
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="steam_app_4197610"
|
match app-id="steam_app_4197610"
|
||||||
open-fullscreen true
|
open-fullscreen true
|
||||||
}
|
}
|
||||||
|
// Obsidian
|
||||||
window-rule {
|
window-rule {
|
||||||
match at-startup=false app-id="obsidian"
|
match at-startup=false app-id="obsidian"
|
||||||
open-maximized true
|
open-maximized true
|
||||||
open-floating false
|
open-floating false
|
||||||
}
|
}
|
||||||
// Librewolf window rules
|
// Librewolf
|
||||||
window-rule {
|
|
||||||
match at-startup=true app-id="librewolf"
|
|
||||||
open-on-workspace "2"
|
|
||||||
open-maximized true
|
|
||||||
}
|
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="librewolf"
|
match app-id="librewolf"
|
||||||
open-maximized true
|
open-maximized true
|
||||||
clip-to-geometry true
|
clip-to-geometry true
|
||||||
open-floating false
|
open-floating false
|
||||||
}
|
}
|
||||||
|
// Slack
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="slack"
|
match app-id="slack"
|
||||||
open-maximized true
|
open-maximized true
|
||||||
@@ -174,6 +192,7 @@ window-rule {
|
|||||||
open-on-workspace "4"
|
open-on-workspace "4"
|
||||||
open-floating false
|
open-floating false
|
||||||
}
|
}
|
||||||
|
// Tidal
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="tidal-hifi"
|
match app-id="tidal-hifi"
|
||||||
open-maximized true
|
open-maximized true
|
||||||
@@ -181,6 +200,7 @@ window-rule {
|
|||||||
open-floating false
|
open-floating false
|
||||||
open-on-workspace "4"
|
open-on-workspace "4"
|
||||||
}
|
}
|
||||||
|
// Tor
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="Tor Browser"
|
match app-id="Tor Browser"
|
||||||
open-maximized true
|
open-maximized true
|
||||||
@@ -188,15 +208,14 @@ window-rule {
|
|||||||
open-floating false
|
open-floating false
|
||||||
open-on-workspace "2"
|
open-on-workspace "2"
|
||||||
}
|
}
|
||||||
|
// Claude
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="Claude"
|
match app-id="Claude"
|
||||||
open-on-workspace "4"
|
open-on-workspace "4"
|
||||||
default-column-width {
|
open-maximized true
|
||||||
proportion 0.6667
|
|
||||||
}
|
|
||||||
clip-to-geometry true
|
clip-to-geometry true
|
||||||
}
|
}
|
||||||
// 2. Specific rule for windows opening at startup
|
// Betterbird
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="eu.betterbird.Betterbird"
|
match app-id="eu.betterbird.Betterbird"
|
||||||
open-maximized true
|
open-maximized true
|
||||||
@@ -204,26 +223,11 @@ window-rule {
|
|||||||
open-on-workspace "3"
|
open-on-workspace "3"
|
||||||
}
|
}
|
||||||
|
|
||||||
window-rule {
|
////////////////////////////////////
|
||||||
match app-id="Slack"
|
/////// Special Window Rules ///////
|
||||||
open-maximized true
|
////////////////////////////////////
|
||||||
clip-to-geometry true
|
|
||||||
open-on-workspace "4"
|
// Htop
|
||||||
}
|
|
||||||
window-rule {
|
|
||||||
match app-id="floating_btop"
|
|
||||||
default-column-width {
|
|
||||||
proportion 0.6667
|
|
||||||
}
|
|
||||||
open-floating true
|
|
||||||
}
|
|
||||||
window-rule {
|
|
||||||
match app-id="floating_musikcube"
|
|
||||||
default-column-width {
|
|
||||||
proportion 0.6667
|
|
||||||
}
|
|
||||||
open-floating true
|
|
||||||
}
|
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="floating_htop"
|
match app-id="floating_htop"
|
||||||
default-column-width {
|
default-column-width {
|
||||||
@@ -231,6 +235,23 @@ window-rule {
|
|||||||
}
|
}
|
||||||
open-floating true
|
open-floating true
|
||||||
}
|
}
|
||||||
|
// Btop
|
||||||
|
window-rule {
|
||||||
|
match app-id="floating_btop"
|
||||||
|
default-column-width {
|
||||||
|
proportion 0.6667
|
||||||
|
}
|
||||||
|
open-floating true
|
||||||
|
}
|
||||||
|
// Musikcube
|
||||||
|
window-rule {
|
||||||
|
match app-id="floating_musikcube"
|
||||||
|
default-column-width {
|
||||||
|
proportion 0.6667
|
||||||
|
}
|
||||||
|
open-floating true
|
||||||
|
}
|
||||||
|
// Bluetui
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="floating_bluetui"
|
match app-id="floating_bluetui"
|
||||||
default-column-width {
|
default-column-width {
|
||||||
@@ -238,6 +259,7 @@ window-rule {
|
|||||||
}
|
}
|
||||||
open-floating true
|
open-floating true
|
||||||
}
|
}
|
||||||
|
// Pulsemixer
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="floating_pulsemixer"
|
match app-id="floating_pulsemixer"
|
||||||
default-column-width {
|
default-column-width {
|
||||||
@@ -245,6 +267,7 @@ window-rule {
|
|||||||
}
|
}
|
||||||
open-floating true
|
open-floating true
|
||||||
}
|
}
|
||||||
|
// Wavemon
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="floating_wavemon"
|
match app-id="floating_wavemon"
|
||||||
default-column-width {
|
default-column-width {
|
||||||
@@ -252,6 +275,7 @@ window-rule {
|
|||||||
}
|
}
|
||||||
open-floating true
|
open-floating true
|
||||||
}
|
}
|
||||||
|
// network-tui
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="floating_network-tui"
|
match app-id="floating_network-tui"
|
||||||
default-column-width {
|
default-column-width {
|
||||||
@@ -259,6 +283,7 @@ window-rule {
|
|||||||
}
|
}
|
||||||
open-floating true
|
open-floating true
|
||||||
}
|
}
|
||||||
|
// Yazi
|
||||||
window-rule {
|
window-rule {
|
||||||
match app-id="floating_yazi"
|
match app-id="floating_yazi"
|
||||||
default-column-width {
|
default-column-width {
|
||||||
@@ -266,12 +291,18 @@ window-rule {
|
|||||||
}
|
}
|
||||||
open-floating true
|
open-floating true
|
||||||
}
|
}
|
||||||
|
|
||||||
window-rule {
|
window-rule {
|
||||||
geometry-corner-radius 5
|
geometry-corner-radius 5
|
||||||
clip-to-geometry true
|
clip-to-geometry true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////
|
||||||
|
//////////// Keybinds///////////////
|
||||||
|
////////////////////////////////////
|
||||||
|
|
||||||
binds {
|
binds {
|
||||||
// Mod+Shift+Slash { show-hotkey-overlay; }
|
|
||||||
Mod+Mod5+J {
|
Mod+Mod5+J {
|
||||||
spawn "hyprlock"
|
spawn "hyprlock"
|
||||||
}
|
}
|
||||||
@@ -296,8 +327,8 @@ binds {
|
|||||||
Mod+Alt+Return hotkey-overlay-title="Open Kitty" {
|
Mod+Alt+Return hotkey-overlay-title="Open Kitty" {
|
||||||
spawn "wezterm"
|
spawn "wezterm"
|
||||||
}
|
}
|
||||||
Mod+Alt+Space hotkey-overlay-title="Open Wofi" {
|
Mod+Alt+Space hotkey-overlay-title="Open Launcher" {
|
||||||
spawn "wofi" "--show" "drun"
|
spawn "qs" "ipc" "call" "launcher" "toggle"
|
||||||
}
|
}
|
||||||
Mod+Mod5+Q hotkey-overlay-title="Open Htop" {
|
Mod+Mod5+Q hotkey-overlay-title="Open Htop" {
|
||||||
spawn "wezterm" "start" "--class" "floating_htop" "-e" "htop"
|
spawn "wezterm" "start" "--class" "floating_htop" "-e" "htop"
|
||||||
@@ -1,655 +0,0 @@
|
|||||||
// This config is in the KDL format: https://kdl.dev
|
|
||||||
// "/-" comments out the following node.
|
|
||||||
// Check the wiki for a full description of the configuration:
|
|
||||||
// https://yalter.github.io/niri/Configuration:-Introduction
|
|
||||||
input {
|
|
||||||
keyboard {
|
|
||||||
|
|
||||||
xkb {
|
|
||||||
layout "ch"
|
|
||||||
variant "de_mac"
|
|
||||||
model "apple"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
touchpad {
|
|
||||||
tap
|
|
||||||
natural-scroll
|
|
||||||
}
|
|
||||||
mouse {
|
|
||||||
|
|
||||||
}
|
|
||||||
trackpoint {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// x11 support for wayland
|
|
||||||
xwayland-satellite {
|
|
||||||
path "xwayland-satellite"
|
|
||||||
}
|
|
||||||
environment {
|
|
||||||
ELECTRON_OZONE_PLATFORM_HINT "auto"
|
|
||||||
ELECTRON_ENABLE_LOGGING "1"
|
|
||||||
// GDK_SCALE "1.75"
|
|
||||||
// GDK_DPI_SCALE "1"
|
|
||||||
}
|
|
||||||
output "eDP-1" {
|
|
||||||
mode "2880x1800@59.990"
|
|
||||||
scale 1.1
|
|
||||||
position x=0 y=0
|
|
||||||
focus-at-startup
|
|
||||||
}
|
|
||||||
output "eDP-2" {
|
|
||||||
mode "2880x1800@59.990"
|
|
||||||
scale 1.1
|
|
||||||
position x=0 y=0
|
|
||||||
focus-at-startup
|
|
||||||
}
|
|
||||||
output "eDP-3" {
|
|
||||||
mode "2880x1800@59.990"
|
|
||||||
scale 1.1
|
|
||||||
position x=0 y=0
|
|
||||||
focus-at-startup
|
|
||||||
}
|
|
||||||
output "DP-4" {
|
|
||||||
mode "2560x1440@59.951"
|
|
||||||
position x=1645 y=0
|
|
||||||
scale 1.1
|
|
||||||
}
|
|
||||||
layout {
|
|
||||||
gaps 2
|
|
||||||
center-focused-column "never"
|
|
||||||
preset-column-widths {
|
|
||||||
proportion 0.5
|
|
||||||
proportion 0.66667
|
|
||||||
proportion 0.3333
|
|
||||||
}
|
|
||||||
default-column-width {
|
|
||||||
proportion 0.5
|
|
||||||
}
|
|
||||||
focus-ring {
|
|
||||||
width 2
|
|
||||||
active-color "#7daea3"
|
|
||||||
inactive-color "#928374"
|
|
||||||
}
|
|
||||||
border {
|
|
||||||
off
|
|
||||||
width 4
|
|
||||||
active-color "#eba0ac"
|
|
||||||
inactive-color "#505050"
|
|
||||||
urgent-color "#9b0000"
|
|
||||||
}
|
|
||||||
shadow {
|
|
||||||
softness 30
|
|
||||||
spread 5
|
|
||||||
offset x=0 y=5
|
|
||||||
color "#0007"
|
|
||||||
}
|
|
||||||
struts {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
spawn-at-startup "bash" "/mnt/tank/scripts/fix-bitwarden.sh"
|
|
||||||
// spawn-at-startup "waybar" "-c" "/home/liph/.config/niri/waybar-niri/config.jsonc" "-s" "/home/liph/.config/niri/waybar-niri/style.css"
|
|
||||||
spawn-at-startup "swaync"
|
|
||||||
spawn-at-startup "quickshell"
|
|
||||||
// spawn-at-startup "kanshi"
|
|
||||||
spawn-at-startup "awww-daemon"
|
|
||||||
spawn-at-startup "xwayland-satellite"
|
|
||||||
spawn-at-startup "gammastep" "-l" "47.38:8.54" "-t" "6000:4000"
|
|
||||||
spawn-at-startup "wezterm"
|
|
||||||
spawn-at-startup "obsidian"
|
|
||||||
// spawn-at-startup "kanshi"
|
|
||||||
spawn-at-startup "librewolf"
|
|
||||||
spawn-at-startup "sh" "-c" "sleep 5 && exec swayidle -w timeout 300 hyprlock timeout 600 'niri msg action power-off-monitors' resume 'niri msg action power-on-monitors' timeout 3600 'systemctl suspend'"
|
|
||||||
|
|
||||||
prefer-no-csd
|
|
||||||
gestures {
|
|
||||||
hot-corners {
|
|
||||||
off
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
workspace "1"
|
|
||||||
workspace "2"
|
|
||||||
workspace "3"
|
|
||||||
workspace "4"
|
|
||||||
|
|
||||||
// Example: block out two password managers from screen capture.
|
|
||||||
// (This example rule is commented out with a "/-" in front.)
|
|
||||||
/-window-rule {
|
|
||||||
match app-id=r#"^org\.keepassxc\.KeePassXC$"#
|
|
||||||
match app-id=r#"^org\.gnome\.World\.Secrets$"#
|
|
||||||
block-out-from "screen-capture"
|
|
||||||
}
|
|
||||||
window-rule {
|
|
||||||
match app-id="Zoom Workplace"
|
|
||||||
open-floating true
|
|
||||||
}
|
|
||||||
// Wezterm window rules
|
|
||||||
window-rule {
|
|
||||||
match at-startup=true app-id="wezterm"
|
|
||||||
open-on-workspace "1"
|
|
||||||
open-maximized true
|
|
||||||
open-floating false
|
|
||||||
// clip-to-geometry true
|
|
||||||
}
|
|
||||||
window-rule {
|
|
||||||
match at-startup=false app-id="wezterm"
|
|
||||||
open-floating false
|
|
||||||
// clip-to-geometry true
|
|
||||||
}
|
|
||||||
// Obsidian window rules
|
|
||||||
window-rule {
|
|
||||||
match at-startup=true app-id="obsidian"
|
|
||||||
open-on-workspace "3"
|
|
||||||
open-maximized true
|
|
||||||
open-floating false
|
|
||||||
}
|
|
||||||
window-rule {
|
|
||||||
match app-id="steam_app_4197610"
|
|
||||||
open-fullscreen true
|
|
||||||
}
|
|
||||||
window-rule {
|
|
||||||
match at-startup=false app-id="obsidian"
|
|
||||||
open-maximized true
|
|
||||||
open-floating false
|
|
||||||
}
|
|
||||||
// Librewolf window rules
|
|
||||||
window-rule {
|
|
||||||
match at-startup=true app-id="librewolf"
|
|
||||||
open-on-workspace "2"
|
|
||||||
open-maximized true
|
|
||||||
}
|
|
||||||
window-rule {
|
|
||||||
match app-id="librewolf"
|
|
||||||
open-maximized true
|
|
||||||
clip-to-geometry true
|
|
||||||
open-floating false
|
|
||||||
}
|
|
||||||
window-rule {
|
|
||||||
match app-id="slack"
|
|
||||||
open-maximized true
|
|
||||||
clip-to-geometry true
|
|
||||||
open-on-workspace "4"
|
|
||||||
open-floating false
|
|
||||||
}
|
|
||||||
window-rule {
|
|
||||||
match app-id="tidal-hifi"
|
|
||||||
open-maximized true
|
|
||||||
clip-to-geometry true
|
|
||||||
open-floating false
|
|
||||||
open-on-workspace "4"
|
|
||||||
}
|
|
||||||
window-rule {
|
|
||||||
match app-id="Tor Browser"
|
|
||||||
open-maximized true
|
|
||||||
clip-to-geometry true
|
|
||||||
open-floating false
|
|
||||||
open-on-workspace "2"
|
|
||||||
}
|
|
||||||
window-rule {
|
|
||||||
match app-id="Claude"
|
|
||||||
open-on-workspace "4"
|
|
||||||
default-column-width {
|
|
||||||
proportion 0.6667
|
|
||||||
}
|
|
||||||
clip-to-geometry true
|
|
||||||
}
|
|
||||||
// 2. Specific rule for windows opening at startup
|
|
||||||
window-rule {
|
|
||||||
match app-id="eu.betterbird.Betterbird"
|
|
||||||
open-maximized true
|
|
||||||
clip-to-geometry true
|
|
||||||
open-on-workspace "3"
|
|
||||||
}
|
|
||||||
|
|
||||||
window-rule {
|
|
||||||
match app-id="Slack"
|
|
||||||
open-maximized true
|
|
||||||
clip-to-geometry true
|
|
||||||
open-on-workspace "4"
|
|
||||||
}
|
|
||||||
window-rule {
|
|
||||||
match app-id="floating_btop"
|
|
||||||
default-column-width {
|
|
||||||
proportion 0.6667
|
|
||||||
}
|
|
||||||
open-floating true
|
|
||||||
}
|
|
||||||
window-rule {
|
|
||||||
match app-id="floating_musikcube"
|
|
||||||
default-column-width {
|
|
||||||
proportion 0.6667
|
|
||||||
}
|
|
||||||
open-floating true
|
|
||||||
}
|
|
||||||
window-rule {
|
|
||||||
match app-id="floating_htop"
|
|
||||||
default-column-width {
|
|
||||||
proportion 0.6667
|
|
||||||
}
|
|
||||||
open-floating true
|
|
||||||
}
|
|
||||||
window-rule {
|
|
||||||
match app-id="floating_bluetui"
|
|
||||||
default-column-width {
|
|
||||||
proportion 0.6667
|
|
||||||
}
|
|
||||||
open-floating true
|
|
||||||
}
|
|
||||||
window-rule {
|
|
||||||
match app-id="floating_pulsemixer"
|
|
||||||
default-column-width {
|
|
||||||
proportion 0.6667
|
|
||||||
}
|
|
||||||
open-floating true
|
|
||||||
}
|
|
||||||
window-rule {
|
|
||||||
match app-id="floating_wavemon"
|
|
||||||
default-column-width {
|
|
||||||
proportion 0.6667
|
|
||||||
}
|
|
||||||
open-floating true
|
|
||||||
}
|
|
||||||
window-rule {
|
|
||||||
match app-id="floating_network-tui"
|
|
||||||
default-column-width {
|
|
||||||
proportion 0.6667
|
|
||||||
}
|
|
||||||
open-floating true
|
|
||||||
}
|
|
||||||
window-rule {
|
|
||||||
match app-id="floating_yazi"
|
|
||||||
default-column-width {
|
|
||||||
proportion 0.6667
|
|
||||||
}
|
|
||||||
open-floating true
|
|
||||||
}
|
|
||||||
window-rule {
|
|
||||||
geometry-corner-radius 5
|
|
||||||
clip-to-geometry true
|
|
||||||
}
|
|
||||||
binds {
|
|
||||||
// Mod+Shift+Slash { show-hotkey-overlay; }
|
|
||||||
Mod+Mod5+J {
|
|
||||||
spawn "hyprlock"
|
|
||||||
}
|
|
||||||
Mod+Alt+P hotkey-overlay-title="Open Bitwarden" {
|
|
||||||
spawn "bitwarden-desktop"
|
|
||||||
}
|
|
||||||
Mod+Alt+T hotkey-overlay-title="Open Tipp10" {
|
|
||||||
spawn "tipp10"
|
|
||||||
}
|
|
||||||
Mod+Alt+S hotkey-overlay-title="Open Tidal" {
|
|
||||||
spawn "tidal-hifi" "--ozone-platform=wayland" "--enable-features=WaylandWindowDecorations"
|
|
||||||
}
|
|
||||||
Mod+Alt+O hotkey-overlay-title="Open Obsidian" {
|
|
||||||
spawn "obsidian"
|
|
||||||
}
|
|
||||||
Mod+Alt+C hotkey-overlay-title="Open Claude" {
|
|
||||||
spawn "claude-desktop"
|
|
||||||
}
|
|
||||||
Mod+Alt+Z hotkey-overlay-title="Open Librewolf" {
|
|
||||||
spawn "librewolf"
|
|
||||||
}
|
|
||||||
Mod+Alt+Return hotkey-overlay-title="Open Kitty" {
|
|
||||||
spawn "wezterm"
|
|
||||||
}
|
|
||||||
Mod+Alt+Space hotkey-overlay-title="Open Wofi" {
|
|
||||||
spawn "wofi" "--show" "drun"
|
|
||||||
}
|
|
||||||
Mod+Mod5+Q hotkey-overlay-title="Open Htop" {
|
|
||||||
spawn "wezterm" "start" "--class" "floating_htop" "-e" "htop"
|
|
||||||
}
|
|
||||||
Mod+Mod5+W hotkey-overlay-title="Open Btop" {
|
|
||||||
spawn "wezterm" "start" "--class" "floating_btop" "-e" "btop"
|
|
||||||
}
|
|
||||||
Mod+Mod5+E hotkey-overlay-title="Open Pulsemixer" {
|
|
||||||
spawn "wezterm" "start" "--class" "floating_pulsemixer" "-e" "pulsemixer"
|
|
||||||
}
|
|
||||||
Mod+Mod5+R allow-inhibiting=false hotkey-overlay-title="Open Bluetui" {
|
|
||||||
spawn "wezterm" "start" "--class" "floating_bluetui" "-e" "bluetui"
|
|
||||||
}
|
|
||||||
Mod+Mod5+T hotkey-overlay-title="Open Wavemon" {
|
|
||||||
spawn "wezterm" "start" "--class" "floating_wavemon" "-e" "wavemon"
|
|
||||||
}
|
|
||||||
Mod+Mod5+Z hotkey-overlay-title="Open network-tui" {
|
|
||||||
spawn "wezterm" "start" "--class" "floating_network-tui" "-e" "network-tui"
|
|
||||||
}
|
|
||||||
Mod+Mod5+U hotkey-overlay-title="Open Musikcube" {
|
|
||||||
spawn "wezterm" "start" "--class" "floating_musikcube" "-e" "musikcube"
|
|
||||||
}
|
|
||||||
Mod+Mod5+Y hotkey-overlay-title="Open Yazi" {
|
|
||||||
spawn "wezterm" "start" "--class" "floating_yazi" "-e" "yazi"
|
|
||||||
}
|
|
||||||
// Brightness Controll
|
|
||||||
Mod+Ctrl+0 {
|
|
||||||
spawn "sh" "-c" "~/scripts/layer_notify.sh 0"
|
|
||||||
}
|
|
||||||
Mod+Ctrl+1 {
|
|
||||||
spawn "sh" "-c" "~/scripts/layer_notify.sh 1"
|
|
||||||
}
|
|
||||||
Mod+Ctrl+2 {
|
|
||||||
spawn "sh" "-c" "~/scripts/layer_notify.sh 2"
|
|
||||||
}
|
|
||||||
Mod+Ctrl+3 {
|
|
||||||
spawn "sh" "-c" "~/scripts/layer_notify.sh 3"
|
|
||||||
}
|
|
||||||
// Brightness controls
|
|
||||||
Mod+Ctrl+4 {
|
|
||||||
spawn "sh" "-c" "~/scripts/niri_br_up.sh"
|
|
||||||
}
|
|
||||||
Mod+Ctrl+5 {
|
|
||||||
spawn "sh" "-c" "~/scripts/niri_br_down.sh"
|
|
||||||
}
|
|
||||||
Mod+Ctrl+6 {
|
|
||||||
spawn "sh" "-c" "~/scripts/niri_br_blue.sh"
|
|
||||||
}
|
|
||||||
Mod+Ctrl+7 {
|
|
||||||
spawn "sh" "-c" "~/scripts/niri_br_reset.sh"
|
|
||||||
}
|
|
||||||
// Swaync Notifications
|
|
||||||
Mod+Ctrl+8 {
|
|
||||||
spawn "swaync-client" "-t"
|
|
||||||
}
|
|
||||||
Super+Alt+S allow-when-locked=true hotkey-overlay-title=null {
|
|
||||||
spawn-sh "pkill orca || exec orca"
|
|
||||||
}
|
|
||||||
XF86AudioRaiseVolume allow-when-locked=true {
|
|
||||||
spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+ -l 1.0"
|
|
||||||
}
|
|
||||||
XF86AudioLowerVolume allow-when-locked=true {
|
|
||||||
spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-"
|
|
||||||
}
|
|
||||||
XF86AudioMute allow-when-locked=true {
|
|
||||||
spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
|
|
||||||
}
|
|
||||||
XF86AudioMicMute allow-when-locked=true {
|
|
||||||
spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"
|
|
||||||
}
|
|
||||||
XF86AudioPlay allow-when-locked=true {
|
|
||||||
spawn-sh "playerctl play-pause"
|
|
||||||
}
|
|
||||||
XF86AudioStop allow-when-locked=true {
|
|
||||||
spawn-sh "playerctl stop"
|
|
||||||
}
|
|
||||||
XF86AudioPrev allow-when-locked=true {
|
|
||||||
spawn-sh "playerctl previous"
|
|
||||||
}
|
|
||||||
XF86AudioNext allow-when-locked=true {
|
|
||||||
spawn-sh "playerctl next"
|
|
||||||
}
|
|
||||||
XF86MonBrightnessUp allow-when-locked=true {
|
|
||||||
spawn "brightnessctl" "--class=backlight" "set" "+10%"
|
|
||||||
}
|
|
||||||
XF86MonBrightnessDown allow-when-locked=true {
|
|
||||||
spawn "brightnessctl" "--class=backlight" "set" "10%-"
|
|
||||||
}
|
|
||||||
Mod+O repeat=false {
|
|
||||||
toggle-overview
|
|
||||||
}
|
|
||||||
Mod+Shift+C repeat=false {
|
|
||||||
close-window
|
|
||||||
}
|
|
||||||
Mod+Left {
|
|
||||||
focus-column-left
|
|
||||||
}
|
|
||||||
Mod+Down {
|
|
||||||
focus-window-down
|
|
||||||
}
|
|
||||||
Mod+Up {
|
|
||||||
focus-window-up
|
|
||||||
}
|
|
||||||
Mod+Right {
|
|
||||||
focus-column-right
|
|
||||||
}
|
|
||||||
Mod+H {
|
|
||||||
focus-column-left
|
|
||||||
}
|
|
||||||
Mod+J {
|
|
||||||
focus-window-down
|
|
||||||
}
|
|
||||||
Mod+K {
|
|
||||||
focus-window-up
|
|
||||||
}
|
|
||||||
Mod+L {
|
|
||||||
focus-column-right
|
|
||||||
}
|
|
||||||
Mod+Ctrl+Left {
|
|
||||||
move-column-left
|
|
||||||
}
|
|
||||||
Mod+Ctrl+Down {
|
|
||||||
move-window-down
|
|
||||||
}
|
|
||||||
Mod+Ctrl+Up {
|
|
||||||
move-window-up
|
|
||||||
}
|
|
||||||
Mod+Ctrl+Right {
|
|
||||||
move-column-right
|
|
||||||
}
|
|
||||||
Mod+Ctrl+H {
|
|
||||||
move-column-left
|
|
||||||
}
|
|
||||||
Mod+Ctrl+J {
|
|
||||||
move-window-down
|
|
||||||
}
|
|
||||||
Mod+Ctrl+K {
|
|
||||||
move-window-up
|
|
||||||
}
|
|
||||||
Mod+Ctrl+L {
|
|
||||||
move-column-right
|
|
||||||
}
|
|
||||||
// Mod+Shift+Down { focus-monitor-down; }
|
|
||||||
// Mod+Shift+Up { focus-monitor-up; }
|
|
||||||
// Mod+Shift+Right { focus-monitor-right; }
|
|
||||||
Mod+Shift+H {
|
|
||||||
focus-monitor-left
|
|
||||||
}
|
|
||||||
// Mod+Shift+J { focus-monitor-down; }
|
|
||||||
// Mod+Shift+K { focus-monitor-up; }
|
|
||||||
Mod+Shift+L {
|
|
||||||
focus-monitor-right
|
|
||||||
}
|
|
||||||
Mod+Shift+Ctrl+Left {
|
|
||||||
move-column-to-monitor-left
|
|
||||||
}
|
|
||||||
// Mod+Shift+Ctrl+Down { move-column-to-monitor-down; }
|
|
||||||
// Mod+Shift+Ctrl+Up { move-column-to-monitor-up; }
|
|
||||||
Mod+Shift+Ctrl+Right {
|
|
||||||
move-column-to-monitor-right
|
|
||||||
}
|
|
||||||
Mod+Shift+Ctrl+H {
|
|
||||||
move-column-to-monitor-left
|
|
||||||
}
|
|
||||||
// Mod+Shift+Ctrl+J { move-column-to-monitor-down; }
|
|
||||||
// Mod+Shift+Ctrl+K { move-column-to-monitor-up; }
|
|
||||||
Mod+Shift+Ctrl+L {
|
|
||||||
move-column-to-monitor-right
|
|
||||||
}
|
|
||||||
Mod+U {
|
|
||||||
focus-workspace-down
|
|
||||||
}
|
|
||||||
Mod+I {
|
|
||||||
focus-workspace-up
|
|
||||||
}
|
|
||||||
Mod+Alt+J {
|
|
||||||
move-column-to-workspace-down
|
|
||||||
}
|
|
||||||
Mod+Alt+K {
|
|
||||||
move-column-to-workspace-up
|
|
||||||
}
|
|
||||||
Mod+Alt+U {
|
|
||||||
move-column-to-workspace-down
|
|
||||||
}
|
|
||||||
Mod+Alt+I {
|
|
||||||
move-column-to-workspace-up
|
|
||||||
}
|
|
||||||
Mod+Shift+U {
|
|
||||||
move-workspace-down
|
|
||||||
}
|
|
||||||
Mod+Shift+I {
|
|
||||||
move-workspace-up
|
|
||||||
}
|
|
||||||
Mod+WheelScrollDown cooldown-ms=150 {
|
|
||||||
focus-workspace-down
|
|
||||||
}
|
|
||||||
Mod+WheelScrollUp cooldown-ms=150 {
|
|
||||||
focus-workspace-up
|
|
||||||
}
|
|
||||||
Mod+Ctrl+WheelScrollDown cooldown-ms=150 {
|
|
||||||
move-column-to-workspace-down
|
|
||||||
}
|
|
||||||
Mod+Ctrl+WheelScrollUp cooldown-ms=150 {
|
|
||||||
move-column-to-workspace-up
|
|
||||||
}
|
|
||||||
Mod+WheelScrollRight {
|
|
||||||
focus-column-right
|
|
||||||
}
|
|
||||||
Mod+WheelScrollLeft {
|
|
||||||
focus-column-left
|
|
||||||
}
|
|
||||||
Mod+Ctrl+WheelScrollRight {
|
|
||||||
move-column-right
|
|
||||||
}
|
|
||||||
Mod+Ctrl+WheelScrollLeft {
|
|
||||||
move-column-left
|
|
||||||
}
|
|
||||||
Mod+Shift+WheelScrollDown {
|
|
||||||
focus-column-right
|
|
||||||
}
|
|
||||||
Mod+Shift+WheelScrollUp {
|
|
||||||
focus-column-left
|
|
||||||
}
|
|
||||||
Mod+Ctrl+Shift+WheelScrollDown {
|
|
||||||
move-column-right
|
|
||||||
}
|
|
||||||
Mod+Ctrl+Shift+WheelScrollUp {
|
|
||||||
move-column-left
|
|
||||||
}
|
|
||||||
Mod+1 {
|
|
||||||
focus-workspace 1
|
|
||||||
}
|
|
||||||
Mod+2 {
|
|
||||||
focus-workspace 2
|
|
||||||
}
|
|
||||||
Mod+3 {
|
|
||||||
focus-workspace 3
|
|
||||||
}
|
|
||||||
Mod+4 {
|
|
||||||
focus-workspace 4
|
|
||||||
}
|
|
||||||
Mod+5 {
|
|
||||||
focus-workspace 5
|
|
||||||
}
|
|
||||||
Mod+6 {
|
|
||||||
focus-workspace 6
|
|
||||||
}
|
|
||||||
Mod+7 {
|
|
||||||
focus-workspace 7
|
|
||||||
}
|
|
||||||
Mod+8 {
|
|
||||||
focus-workspace 8
|
|
||||||
}
|
|
||||||
Mod+9 {
|
|
||||||
focus-workspace 9
|
|
||||||
}
|
|
||||||
// Mod+Ctrl+1 { move-column-to-workspace 1; }
|
|
||||||
// Mod+Ctrl+2 { move-column-to-workspace 2; }
|
|
||||||
// Mod+Ctrl+3 { move-column-to-workspace 3; }
|
|
||||||
// Mod+Ctrl+4 { move-column-to-workspace 4; }
|
|
||||||
// Mod+Ctrl+5 { move-column-to-workspace 5; }
|
|
||||||
// Mod+Ctrl+6 { move-column-to-workspace 6; }
|
|
||||||
// Mod+Ctrl+7 { move-column-to-workspace 7; }
|
|
||||||
// Mod+Ctrl+8 { move-column-to-workspace 8; }
|
|
||||||
// Mod+Ctrl+9 { move-column-to-workspace 9; }
|
|
||||||
Mod+BracketLeft {
|
|
||||||
consume-or-expel-window-left
|
|
||||||
}
|
|
||||||
Mod+BracketRight {
|
|
||||||
consume-or-expel-window-right
|
|
||||||
}
|
|
||||||
Mod+Comma {
|
|
||||||
consume-window-into-column
|
|
||||||
}
|
|
||||||
Mod+Period {
|
|
||||||
expel-window-from-column
|
|
||||||
}
|
|
||||||
Mod+R {
|
|
||||||
switch-preset-column-width
|
|
||||||
}
|
|
||||||
// Cycling through the presets in reverse order is also possible.
|
|
||||||
// Mod+R { switch-preset-column-width-back; }
|
|
||||||
// Mod+Shift+R {
|
|
||||||
// switch-preset-window-height
|
|
||||||
// }
|
|
||||||
// Mod+Ctrl+R {
|
|
||||||
// reset-window-height
|
|
||||||
// }
|
|
||||||
Mod+F {
|
|
||||||
maximize-column
|
|
||||||
}
|
|
||||||
Mod+Shift+F {
|
|
||||||
fullscreen-window
|
|
||||||
}
|
|
||||||
Mod+Ctrl+F {
|
|
||||||
expand-column-to-available-width
|
|
||||||
}
|
|
||||||
// Mod+C { center-column; }
|
|
||||||
Mod+Ctrl+C {
|
|
||||||
center-visible-columns
|
|
||||||
}
|
|
||||||
Mod+Minus {
|
|
||||||
set-column-width "-10%"
|
|
||||||
}
|
|
||||||
Mod+Equal {
|
|
||||||
set-column-width "+10%"
|
|
||||||
}
|
|
||||||
// Finer height adjustments when in column with other windows.
|
|
||||||
Mod+Shift+Minus {
|
|
||||||
set-window-height "-10%"
|
|
||||||
}
|
|
||||||
Mod+Shift+Equal {
|
|
||||||
set-window-height "+10%"
|
|
||||||
}
|
|
||||||
// Move the focused window between the floating and the tiling layout.
|
|
||||||
Mod+V {
|
|
||||||
toggle-window-floating
|
|
||||||
}
|
|
||||||
Mod+Shift+V {
|
|
||||||
switch-focus-between-floating-and-tiling
|
|
||||||
}
|
|
||||||
Mod+W {
|
|
||||||
toggle-column-tabbed-display
|
|
||||||
}
|
|
||||||
// screenshot
|
|
||||||
Mod+Alt+4 {
|
|
||||||
spawn "sh" "-c" "grim -g \"$(slurp)\" ~/Pictures/screenshot-$(date +%Y%m%d-%H%M%S).png && notify-send 'Screenshot' 'Area screenshot saved'"
|
|
||||||
}
|
|
||||||
// Fullscreen and save
|
|
||||||
Mod+Alt+5 {
|
|
||||||
spawn "sh" "-c" "grim ~/Pictures/screenshot-$(date +%Y%m%d-%H%M%S).png && notify-send -t 2000 'Screenshot' 'Fullscreen screenshot saved'"
|
|
||||||
}
|
|
||||||
// Select area to clipboard
|
|
||||||
Mod+Shift+4 {
|
|
||||||
spawn "sh" "-c" "grim -g \"$(slurp)\" - | wl-copy && notify-send -t 2000 'Screenshot' 'Area copied to clipboard'"
|
|
||||||
}
|
|
||||||
// area screenshot → annotate in swappy
|
|
||||||
Mod+Shift+5 {
|
|
||||||
spawn "sh" "-c" "grim -g \"$(slurp)\" - | swappy -f -"
|
|
||||||
}
|
|
||||||
Mod+Escape allow-inhibiting=false {
|
|
||||||
toggle-keyboard-shortcuts-inhibit
|
|
||||||
}
|
|
||||||
Mod+Shift+E {
|
|
||||||
quit
|
|
||||||
}
|
|
||||||
Ctrl+Alt+Delete {
|
|
||||||
quit
|
|
||||||
}
|
|
||||||
Mod+Shift+P {
|
|
||||||
power-off-monitors
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// include "theme.kdl"
|
|
||||||
|
|
||||||
@@ -140,3 +140,78 @@ end
|
|||||||
-- Keybinds
|
-- Keybinds
|
||||||
vim.keymap.set("i", "<C-f>", pick_email, { buffer = true, desc = "Pick email from abook" })
|
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" })
|
vim.keymap.set("n", "<C-f>", pick_email, { buffer = true, desc = "Pick email from abook" })
|
||||||
|
|
||||||
|
-- Jump to the Subject line when a fresh (non-reply) compose opens
|
||||||
|
local function is_reply_buffer(buf)
|
||||||
|
local lines = vim.api.nvim_buf_get_lines(buf, 0, 40, false)
|
||||||
|
for _, l in ipairs(lines) do
|
||||||
|
if l:match("^On .+ wrote:") or l:match("^%s*>") or l:match("^In%-Reply%-To:") then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
if not is_reply_buffer(0) then
|
||||||
|
local buf = 0
|
||||||
|
for i, l in ipairs(vim.api.nvim_buf_get_lines(buf, 0, 30, false)) do
|
||||||
|
if l:match("^%s*[Ss]ubject:") then
|
||||||
|
vim.api.nvim_win_set_cursor(0, { i, #l })
|
||||||
|
vim.schedule(function()
|
||||||
|
if vim.bo.filetype == "mail" or vim.bo[buf].filetype == "mail" then
|
||||||
|
vim.cmd("startinsert!")
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Attach files to the aerc draft via yazi (terminal split + aerc IPC)
|
||||||
|
-- Normal mode: `,a` · Insert mode: <Alt+a> · aerc-side fallback: <F4>
|
||||||
|
local function yazi_attach()
|
||||||
|
local chooser = vim.fn.tempname()
|
||||||
|
vim.cmd('belowright 15split')
|
||||||
|
local tbuf = vim.api.nvim_get_current_buf()
|
||||||
|
vim.fn.jobstart(
|
||||||
|
{ 'yazi', '--chooser-file=' .. chooser, vim.fn.expand('~/Downloads') },
|
||||||
|
{ term = true }
|
||||||
|
)
|
||||||
|
vim.cmd('startinsert')
|
||||||
|
vim.api.nvim_create_autocmd('TermClose', {
|
||||||
|
buffer = tbuf,
|
||||||
|
once = true,
|
||||||
|
callback = function()
|
||||||
|
vim.schedule(function()
|
||||||
|
local win = vim.fn.bufwinid(tbuf)
|
||||||
|
if win ~= -1 then pcall(vim.api.nvim_win_close, win, true) end
|
||||||
|
local f = io.open(chooser, 'r')
|
||||||
|
if not f then return end
|
||||||
|
local content = f:read('*a')
|
||||||
|
f:close()
|
||||||
|
os.remove(chooser)
|
||||||
|
local n = 0
|
||||||
|
for p in content:gmatch('[^\r\n]+') do
|
||||||
|
local path = p:gsub('%s+$', '')
|
||||||
|
if path ~= '' then
|
||||||
|
vim.fn.system({ 'aerc', ':attach', path })
|
||||||
|
n = n + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if n > 0 then
|
||||||
|
vim.notify(('Attached %d file(s) to the draft'):format(n), vim.log.levels.INFO)
|
||||||
|
else
|
||||||
|
vim.notify('yazi: nothing selected', vim.log.levels.WARN)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
vim.keymap.set('n', ',a', yazi_attach, { buffer = true, desc = 'Attach files via yazi' })
|
||||||
|
vim.keymap.set('i', '<M-a>', yazi_attach, { buffer = true, desc = 'Attach files via yazi' })
|
||||||
|
|
||||||
|
-- Spell-check while writing emails
|
||||||
|
vim.opt_local.spell = true
|
||||||
|
vim.opt_local.spelllang = 'en_us'
|
||||||
|
vim.opt_local.complete:append('kspell')
|
||||||
@@ -1,3 +1,22 @@
|
|||||||
|
-- lates ledger
|
||||||
|
-- LedgerSMB template preview: build current file's <base>.build.* directly
|
||||||
|
local function lsmb_base()
|
||||||
|
local b = vim.fn.expand("%:t:r") -- name without final extension
|
||||||
|
b = b:gsub("%.build$", ""):gsub("%.stripped$", "") -- work even from generated files
|
||||||
|
return b
|
||||||
|
end
|
||||||
|
|
||||||
|
-- <leader>lb -> regenerate + compile via latexmk (uses .latexmkrc hook)
|
||||||
|
vim.keymap.set("n", "<leader>lb", function()
|
||||||
|
vim.cmd("!cd %:p:h && latexmk " .. lsmb_base() .. ".build.tex")
|
||||||
|
end, { desc = "LedgerSMB: build preview" })
|
||||||
|
|
||||||
|
-- <leader>lv -> open the PDF in zathura, non-blocking
|
||||||
|
vim.keymap.set("n", "<leader>lv", function()
|
||||||
|
local dir = vim.fn.expand("%:p:h")
|
||||||
|
vim.fn.jobstart({ "zathura", dir .. "/" .. lsmb_base() .. ".build.pdf" }, { detach = true })
|
||||||
|
end, { desc = "LedgerSMB: view preview" })
|
||||||
|
|
||||||
vim.opt.clipboard = "unnamedplus"
|
vim.opt.clipboard = "unnamedplus"
|
||||||
-- In your init.lua or after lazy setup
|
-- In your init.lua or after lazy setup
|
||||||
vim.opt.termguicolors = true
|
vim.opt.termguicolors = true
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
+529
-483
File diff suppressed because it is too large.
Load diff
Executable
+9
@@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# aerc-md-convert — multipart-converter for aerc ([multipart-converters] text/html)
|
||||||
|
# Reads the draft (markdown) on stdin, writes the HTML part to stdout.
|
||||||
|
# Minimal clean HTML: no pandoc boilerplate, small readable CSS inline.
|
||||||
|
{
|
||||||
|
printf '%s\n' '<html><head><meta charset="utf-8"><style>body{font-family:sans-serif;font-size:14px;line-height:1.5;max-width:60em}pre,code{font-family:monospace;font-size:13px;background:#f4f4f4;padding:1px 4px;border-radius:3px}pre{padding:8px;overflow-x:auto}img{max-width:100%}blockquote{border-left:3px solid #ccc;margin-left:0;padding-left:1em;color:#555}table{border-collapse:collapse}td,th{border:1px solid #ccc;padding:4px 8px}</style></head><body>'
|
||||||
|
pandoc -f markdown -t html5
|
||||||
|
printf '%s\n' '</body></html>'
|
||||||
|
}
|
||||||
Executable
+113
@@ -0,0 +1,113 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# mail-compose — :menu picker for aerc's :compose (runs INSIDE aerc's popover)
|
||||||
|
# Bound to `M`: M = :menu -t Compose -c 'mail-compose' :compose<Enter>
|
||||||
|
#
|
||||||
|
# Flow (each step labelled, each skippable with Esc):
|
||||||
|
# [1/5] account → switches the account tab via IPC (:change-tab)
|
||||||
|
# [2/5] from/alias (identities parsed from accounts.conf)
|
||||||
|
# [3/5] To (fzf --multi over abook)
|
||||||
|
# [4/5] Cc
|
||||||
|
# [5/5] Bcc
|
||||||
|
# aerc appends our stdout to `:compose` (xargs-style, quotes preserved):
|
||||||
|
# :compose -H "From: ..." -H "To: ..." -H "Cc: ..." -H "Bcc: ..."
|
||||||
|
# Nothing picked → bare :compose (empty message).
|
||||||
|
|
||||||
|
set -u
|
||||||
|
|
||||||
|
AERC_ACCOUNTS="$HOME/.config/aerc/accounts.conf"
|
||||||
|
DRY_RUN=0
|
||||||
|
[ "${1:-}" = "--dry-run" ] && DRY_RUN=1
|
||||||
|
|
||||||
|
# ---------- accounts & identities from accounts.conf ----------
|
||||||
|
mapfile -t ACCOUNTS < <(awk '/^\[/{print substr($0,2,index($0,"]")-2)}' "$AERC_ACCOUNTS")
|
||||||
|
|
||||||
|
_acct_field() { # $1=account $2=field-regex → value after '='
|
||||||
|
awk -v a="$1" -v f="$2" '/^\[/{sec=substr($0,2,index($0,"]")-2); next}
|
||||||
|
sec==a && $0 ~ "^" f "[ \\t]*=" {print; exit}' "$AERC_ACCOUNTS"
|
||||||
|
}
|
||||||
|
|
||||||
|
# print "Name <email>" identity lines for one account (default From first, then aliases)
|
||||||
|
identities() {
|
||||||
|
local acct="$1" from_line name from_addr
|
||||||
|
from_line=$(_acct_field "$acct" 'from')
|
||||||
|
name=$(printf '%s\n' "$from_line" | sed 's/^[^=]*=[ \t]*//' | sed 's/<.*//' | sed 's/^[ \t"]*//; s/[ \t"]*$//')
|
||||||
|
{
|
||||||
|
printf '%s\n' "$from_line" | sed 's/^[^=]*=[ \t]*//' | sed 's/.*<//; s/>.*//'
|
||||||
|
_acct_field "$acct" 'aliases' | sed 's/^[^=]*=[ \t]*//' | tr ',' '\n'
|
||||||
|
} | sed 's/^[ \t]*//; s/[ \t]*$//' | awk -v n="$name" 'NF && !seen[$0]++ {
|
||||||
|
if ($0 ~ /</) print
|
||||||
|
else if (n != "") print n " <" $0 ">"
|
||||||
|
else print
|
||||||
|
}'
|
||||||
|
}
|
||||||
|
|
||||||
|
# ---------- contacts from abook ----------
|
||||||
|
CONTACTS=$(abook --mutt-query "" 2>/dev/null | awk -F'\t' '
|
||||||
|
{
|
||||||
|
email = $1; name = $2
|
||||||
|
if (email == "") next
|
||||||
|
gsub(/^[ \t]+|[ \t]+$/, "", email); gsub(/^[ \t]+|[ \t]+$/, "", name)
|
||||||
|
if (name == "" || name == email || name ~ /[(),<>"]/) printf "%s\n", email
|
||||||
|
else printf "%s <%s>\n", name, email
|
||||||
|
}')
|
||||||
|
|
||||||
|
# ---------- fzf helpers (clear step labelling) ----------
|
||||||
|
pick_single() { # $1=prompt $2=header ; input on stdin; echoes selection or empty on Esc
|
||||||
|
fzf --reverse --info=inline --height=100% --prompt="$1" --header="$2" 2>/dev/null || true
|
||||||
|
}
|
||||||
|
pick_multi() { # $1=prompt $2=header ; input on stdin; echoes comma-joined selection
|
||||||
|
local sel
|
||||||
|
sel=$(fzf --multi --reverse --info=inline --height=100% --prompt="$1" --header="$2" \
|
||||||
|
--bind 'ctrl-space:toggle,ctrl-a:toggle-all' 2>/dev/null) || true
|
||||||
|
[ -z "$sel" ] && return 0
|
||||||
|
printf '%s' "$sel" | awk '{ printf "%s%s", (NR > 1 ? ", " : ""), $0 }'
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ -z "$CONTACTS" ]; then
|
||||||
|
echo '-H "To: (no contacts — run mailsync first)"'
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ---------- 1/5: account ----------
|
||||||
|
account="$(printf '%s\n' "${ACCOUNTS[@]}" \
|
||||||
|
| pick_single 'account> ' '▸ 1/5 · SEND FROM ACCOUNT · Enter=select · Esc=keep current')"
|
||||||
|
|
||||||
|
# switch the account tab so :compose uses the right outgoing transport
|
||||||
|
if [ -n "$account" ] && [ "$DRY_RUN" = "0" ]; then
|
||||||
|
aerc ":change-tab $account" >/dev/null 2>&1
|
||||||
|
sleep 0.2
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ---------- 2/5: from/alias ----------
|
||||||
|
from=""
|
||||||
|
if [ -n "$account" ]; then
|
||||||
|
from="$(identities "$account" \
|
||||||
|
| pick_single 'from/alias> ' "▸ 2/5 · FROM — $account · Enter=select · Esc=account default")"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ---------- 3/5: To ----------
|
||||||
|
to="$(printf '%s\n' "$CONTACTS" \
|
||||||
|
| pick_multi 'to> ' '▸ 3/5 · TO · type to filter · Tab/Ctrl+Space=mark · Enter=done · Esc=skip')"
|
||||||
|
|
||||||
|
# ---------- 4/5: Cc ----------
|
||||||
|
cc=""
|
||||||
|
if [ -n "$to" ]; then
|
||||||
|
cc="$(printf '%s\n' "$CONTACTS" \
|
||||||
|
| pick_multi 'cc> ' '▸ 4/5 · CC · type to filter · Tab/Ctrl+Space=mark · Enter=done · Esc=skip')"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ---------- 5/5: Bcc ----------
|
||||||
|
bcc=""
|
||||||
|
if [ -n "$to" ]; then
|
||||||
|
bcc="$(printf '%s\n' "$CONTACTS" \
|
||||||
|
| pick_multi 'bcc> ' '▸ 5/5 · BCC · type to filter · Tab/Ctrl+Space=mark · Enter=done · Esc=skip')"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ---------- output: ONE line — :menu appends it to :compose as ONE command ----------
|
||||||
|
# (each stdout line = one separate command execution, so -H needs its value on the same line)
|
||||||
|
out=""
|
||||||
|
[ -n "$from" ] && out="$out -H \"From: $from\""
|
||||||
|
[ -n "$to" ] && out="$out -H \"To: $to\""
|
||||||
|
[ -n "$cc" ] && out="$out -H \"Cc: $cc\""
|
||||||
|
[ -n "$bcc" ] && out="$out -H \"Bcc: $bcc\""
|
||||||
|
printf '%s' "$out"
|
||||||
Executable
+192
@@ -0,0 +1,192 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# mailsync — full mail update pipeline for aerc
|
||||||
|
# 1. mbsync: pull all mail (config: ~/.config/isync/mksyncrc)
|
||||||
|
# 2. notmuch new: index every account's database
|
||||||
|
# 3. abook: rebuild contacts from every unique sender (phil + proton)
|
||||||
|
# Triggered by: aerc keybind `u`, systemd user timers (08:00/12:00/17:00 + login+2min)
|
||||||
|
|
||||||
|
set -u
|
||||||
|
|
||||||
|
# ---------- configuration ----------
|
||||||
|
SYNC_CONF="$HOME/.config/isync/mksyncrc"
|
||||||
|
NM_CONF_DIR="$HOME/.config/notmuch"
|
||||||
|
ABOOK_RC="$HOME/.config/abook/abookrc"
|
||||||
|
ABOOK_DB="$HOME/.local/share/abook/addressbook"
|
||||||
|
LOG_DIR="$HOME/.local/share/aerc/logs"
|
||||||
|
LOG="$LOG_DIR/mailsync.log"
|
||||||
|
LOCK="$HOME/.local/share/aerc/mailsync.lock"
|
||||||
|
LOG_KEEP=7
|
||||||
|
|
||||||
|
CHANNELS="liphlink-phil liphlink-spam proton" # mbsync channels
|
||||||
|
INDEX_ACCOUNTS="phil proton spam" # notmuch databases to index
|
||||||
|
CONTACT_ACCOUNTS="phil proton" # accounts harvested for abook
|
||||||
|
|
||||||
|
HARVEST_EXCLUDE='and not folder:Junk and not folder:Spam and not folder:Trash and not tag:deleted'
|
||||||
|
PHIL_QUERY="(folder:Inbox or folder:INBOX or folder:Sent or folder:Archive or folder:Personal or folder:Priority1 or folder:Priority2 or folder:Work) $HARVEST_EXCLUDE"
|
||||||
|
PROTON_QUERY="(folder:INBOX or folder:Sent or folder:Archive or folder:Starred) and not folder:Spam and not folder:Trash and not tag:deleted"
|
||||||
|
|
||||||
|
# own addresses are never added as contacts
|
||||||
|
# own addresses are never added as contacts; MAILER-DAEMON bounces are noise
|
||||||
|
OWN_ADDRESSES='phil@liphlink.xyz|pw@liphlink.xyz|p\.waibel@liphlink.xyz|philipp\.waibel@liphlink.xyz|spam@liphlink.xyz|blue@liphlink.xyz|red@liphlink.xyz|liiph@protonmail.com|liiph@proton.me|liiph@pm.me|ph\.waibel@proton.me|ph\.waibel@pm.me|liph@liphlink.xyz|mailer-daemon@'
|
||||||
|
# -----------------------------------
|
||||||
|
|
||||||
|
exec 9>"$LOCK"
|
||||||
|
if ! flock -n 9; then
|
||||||
|
echo "mailsync: already running, skipping."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p "$LOG_DIR" "$(dirname "$ABOOK_RC")" "$(dirname "$ABOOK_DB")"
|
||||||
|
|
||||||
|
# ---------- log rotation (keep last $LOG_KEEP previous runs) ----------
|
||||||
|
rm -f "$LOG_DIR/mailsync.log.$LOG_KEEP"
|
||||||
|
i=$((LOG_KEEP - 1))
|
||||||
|
while [ "$i" -ge 1 ]; do
|
||||||
|
[ -f "$LOG_DIR/mailsync.log.$i" ] && mv "$LOG_DIR/mailsync.log.$i" "$LOG_DIR/mailsync.log.$((i + 1))"
|
||||||
|
i=$((i - 1))
|
||||||
|
done
|
||||||
|
[ -f "$LOG" ] && mv "$LOG" "$LOG_DIR/mailsync.log.1"
|
||||||
|
|
||||||
|
exec > >(tee "$LOG") 2>&1
|
||||||
|
echo "=== mailsync started: $(date '+%Y-%m-%d %H:%M:%S') ==="
|
||||||
|
|
||||||
|
# ---------- 1. mbsync: pull mail ----------
|
||||||
|
echo
|
||||||
|
echo "--- mbsync ---"
|
||||||
|
sync_ok=0
|
||||||
|
sync_fail=0
|
||||||
|
for ch in $CHANNELS; do
|
||||||
|
if [ "$ch" = "proton" ] && ! pgrep -f protonmail-bridge >/dev/null 2>&1; then
|
||||||
|
echo " WARN: Proton Bridge not running — skipping proton"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
printf ' syncing %-16s ... ' "$ch"
|
||||||
|
if mbsync -c "$SYNC_CONF" "$ch" >/dev/null 2>&1; then
|
||||||
|
echo "OK"
|
||||||
|
sync_ok=$((sync_ok + 1))
|
||||||
|
else
|
||||||
|
echo "FAILED"
|
||||||
|
sync_fail=$((sync_fail + 1))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo " (ok: $sync_ok, failed: $sync_fail)"
|
||||||
|
|
||||||
|
# ---------- 2. notmuch: index ----------
|
||||||
|
echo
|
||||||
|
echo "--- notmuch new ---"
|
||||||
|
index_ok=0
|
||||||
|
for acct in $INDEX_ACCOUNTS; do
|
||||||
|
printf ' indexing %-8s ... ' "$acct"
|
||||||
|
nm_out=$(NOTMUCH_CONFIG="$NM_CONF_DIR/$acct/config" notmuch new 2>&1)
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "OK"
|
||||||
|
echo "$nm_out" | grep -v '^$' | sed 's/^/ /'
|
||||||
|
index_ok=$((index_ok + 1))
|
||||||
|
else
|
||||||
|
echo "FAILED"
|
||||||
|
echo "$nm_out" | sed 's/^/ /'
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# ---------- 3. abook: rebuild contacts ----------
|
||||||
|
echo
|
||||||
|
echo "--- abook contacts ---"
|
||||||
|
|
||||||
|
# Initialize abook only if absent; never clobber existing data.
|
||||||
|
if [ ! -f "$ABOOK_RC" ]; then
|
||||||
|
printf '# abook config (managed by mailsync)\n[options]\nautosave=true\n' > "$ABOOK_RC"
|
||||||
|
echo " created $ABOOK_RC"
|
||||||
|
fi
|
||||||
|
if [ ! -f "$ABOOK_DB" ]; then
|
||||||
|
printf '# abook addressbook file\n\n[format]\nprogram=abook\nversion=0.6.2\n' > "$ABOOK_DB"
|
||||||
|
echo " created $ABOOK_DB"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# harvest: emit "Name <email>" (or bare "<email>") lines from an account's db
|
||||||
|
harvest() {
|
||||||
|
NOTMUCH_CONFIG="$NM_CONF_DIR/$1/config" notmuch address --output=sender "$2" 2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
# "Name <email>" lines -> tab pairs "email\tname"; dedupe by email, keep longest name
|
||||||
|
to_pairs() {
|
||||||
|
grep -viE "$OWN_ADDRESSES" | awk -F'[<>]' '
|
||||||
|
{
|
||||||
|
if ($2 != "") { email = $2; name = $1 }
|
||||||
|
else { email = $0; name = "" }
|
||||||
|
gsub(/^[ \t]+|[ \t]+$/, "", email)
|
||||||
|
gsub(/^[ \t]+|[ \t]+$/, "", name)
|
||||||
|
gsub(/^"|"$/, "", name)
|
||||||
|
if (email !~ /@/) next
|
||||||
|
if (!(email in seen) || length(name) > length(seen[email])) seen[email] = name
|
||||||
|
if (!(email in order)) order[email] = ++n
|
||||||
|
}
|
||||||
|
END { for (e in order) printf "%s\t%s\n", e, seen[e] }
|
||||||
|
'
|
||||||
|
}
|
||||||
|
|
||||||
|
harvest_tmp="$(mktemp /tmp/mailsync-harvest.XXXXXX)"
|
||||||
|
|
||||||
|
for acct in $CONTACT_ACCOUNTS; do
|
||||||
|
q="$PHIL_QUERY"; [ "$acct" = "proton" ] && q="$PROTON_QUERY"
|
||||||
|
printf ' harvesting %-8s ... ' "$acct"
|
||||||
|
n=$(harvest "$acct" "$q" | wc -l)
|
||||||
|
echo "$n sender lines"
|
||||||
|
harvest "$acct" "$q" | to_pairs >> "$harvest_tmp"
|
||||||
|
done
|
||||||
|
|
||||||
|
# existing entries (email\tname) parsed straight from the current datafile
|
||||||
|
existing_tmp="$(mktemp /tmp/mailsync-existing.XXXXXX)"
|
||||||
|
awk '/^name=/{n=substr($0,6)} /^email=/{e=substr($0,7); if (e != "") printf "%s\t%s\n", e, n}' \
|
||||||
|
"$ABOOK_DB" | sort > "$existing_tmp"
|
||||||
|
|
||||||
|
# union: existing entries win (manual edits preserved); add harvested ones not present
|
||||||
|
merge_tmp="$(mktemp /tmp/mailsync-merge.XXXXXX)"
|
||||||
|
awk -F'\t' '
|
||||||
|
NR==FNR { if ($1 != "") existing[$1] = $2; next }
|
||||||
|
{ if (!($1 in existing)) new[$1] = $2; ++m; ord[m] = $1 }
|
||||||
|
END {
|
||||||
|
for (e in existing) printf "%s\t%s\n", existing[e], e
|
||||||
|
for (k = 1; k <= m; k++) { e = ord[k]; if (e in new) printf "%s\t%s\n", new[e], e }
|
||||||
|
}' "$existing_tmp" "$harvest_tmp" \
|
||||||
|
| awk -F'\t' '!seen[$2]++' \
|
||||||
|
| sort -t$'\t' -k1,1 > "$merge_tmp"
|
||||||
|
|
||||||
|
# write final native-format abook file atomically (only after validation passes)
|
||||||
|
final_tmp="$(mktemp /tmp/mailsync-abook.XXXXXX)"
|
||||||
|
{
|
||||||
|
echo "# abook addressbook file"
|
||||||
|
echo ""
|
||||||
|
echo "[format]"
|
||||||
|
echo "program=abook"
|
||||||
|
echo "version=0.6.2"
|
||||||
|
echo ""
|
||||||
|
n=0
|
||||||
|
while IFS=$'\t' read -r name email; do # merge_tmp is "name\temail"
|
||||||
|
[ -z "$email" ] && continue
|
||||||
|
printf '[%d]\nname=%s\nemail=%s\n\n' "$n" "$name" "$email"
|
||||||
|
n=$((n + 1))
|
||||||
|
done < "$merge_tmp"
|
||||||
|
} > "$final_tmp"
|
||||||
|
|
||||||
|
count=$(awk '/^\[[0-9]+\]/{c++} END{print c+0}' "$final_tmp")
|
||||||
|
if abook --convert --informat abook --outformat mutt --infile "$final_tmp" --outfile /dev/null >/dev/null 2>&1; then
|
||||||
|
[ -f "$ABOOK_DB.pre-mailsync" ] || cp "$ABOOK_DB" "$ABOOK_DB.pre-mailsync" 2>/dev/null
|
||||||
|
mv "$final_tmp" "$ABOOK_DB"
|
||||||
|
echo " abook updated: $count contacts ($(awk -F'\t' '{c++} END{print c}' "$existing_tmp") kept, $(awk -F'\t' '{c++} END{print c}' "$merge_tmp") total)"
|
||||||
|
else
|
||||||
|
echo " ERROR: generated abook file failed validation — keeping existing datafile"
|
||||||
|
rm -f "$final_tmp"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -f "$harvest_tmp" "$existing_tmp" "$merge_tmp"
|
||||||
|
|
||||||
|
# ---------- summary ----------
|
||||||
|
echo
|
||||||
|
echo "=== mailsync finished: $(date '+%Y-%m-%d %H:%M:%S') (sync ok=$sync_ok fail=$sync_fail, index ok=$index_ok) ==="
|
||||||
|
|
||||||
|
# keep the aerc terminal open so output can be read
|
||||||
|
if [ -t 1 ]; then
|
||||||
|
printf 'Done. Press any key to close...'
|
||||||
|
read -n 1 -s -r
|
||||||
|
echo
|
||||||
|
fi
|
||||||
+2
-2
@@ -23,8 +23,8 @@ Host code
|
|||||||
IdentityFile ~/.ssh/keys/code_ed25519
|
IdentityFile ~/.ssh/keys/code_ed25519
|
||||||
|
|
||||||
Host mail
|
Host mail
|
||||||
HostName 100.79.210.76
|
# HostName 100.79.210.76
|
||||||
# HostName 100.69.37.217
|
HostName 100.69.37.217
|
||||||
port 50105
|
port 50105
|
||||||
User liph
|
User liph
|
||||||
IdentityFile ~/.ssh/keys/mail_ed25519
|
IdentityFile ~/.ssh/keys/mail_ed25519
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Run mailsync 2 minutes after login (safety catch-up run)
|
||||||
|
|
||||||
|
[Timer]
|
||||||
|
OnStartupSec=2min
|
||||||
|
Unit=mailsync.service
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Mail sync (mbsync + notmuch index + abook contacts)
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=%h/.local/bin/mailsync
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Run mailsync every day at 08:00, 12:00 and 17:00
|
||||||
|
|
||||||
|
[Timer]
|
||||||
|
OnCalendar=*-*-* 08:00:00
|
||||||
|
OnCalendar=*-*-* 12:00:00
|
||||||
|
OnCalendar=*-*-* 17:00:00
|
||||||
|
Persistent=true
|
||||||
|
Unit=mailsync.service
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
||||||
File renamed without changes.
File diff suppressed because it is too large.
Load diff
Reference in new issue
Block a user