Compare commits

..
9 Commits
Author SHA1 Message Date
liphh bae0ffbdd1 added quickshell,btop,atuin 2026-10-02 21:12:48 +02:00
liphh 71b27f5ab7 updated kitty/ghostty etx 2026-10-01 19:51:14 +02:00
liphh 6079f6639b updated everything 2026-09-20 22:58:16 +02:00
liphh d1b2fbdf15 updated nvim treesitter 2026-09-10 10:21:19 +02:00
liphh 893fe34a11 updated dotfiles 2026-09-09 07:28:20 +02:00
liphh 89b1e380aa udated colorscheme 2026-09-07 16:51:37 +02:00
liphh e078b21843 changed to tokyo night 2026-09-07 16:06:47 +02:00
liphh 82af24522a hyprlock changes 2026-09-07 16:03:24 +02:00
liphh 0eaac74dfa updated zshrc 2026-09-07 09:07:11 +02:00
94 changed files with 8715 additions and 591 deletions

No files matched your search

+30 -15
View File
@@ -1,25 +1,28 @@
# 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
### Sync and Maintenance
- **Global Sync**: Run `mailsync` (bound to `u` in `aerc`) to perform:
1. `mbsync -a` (Mail sync)
2. `vdirsyncer sync` (Calendar sync)
3. `caldawarrior sync` (Task sync)
4. `notmuch new` for all account databases (Indexing)
5. `notmuch-abook-sync` (Address book population)
- **Global Sync**: Run `mailsync` (`~/.local/bin/mailsync`, bound to `u` in `aerc`) to perform:
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. `NOTMUCH_CONFIG=~/.config/notmuch/<acct>/config notmuch new` for `phil`, `proton`, `spam` (per-account databases)
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`
- **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.
- **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
- **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
- **Filters**: `cat email.html | w3m -T text/html -dump`
- **Calendar**: `khal list`
- **Tasks**: `task list`
- **Contacts**: `abook --mutt-query "<term>"` (must output tab-delimited `email\tname`)
- **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
@@ -32,12 +35,24 @@ This repository contains the configuration and customization for `aerc`, a termi
- **Leader**: `,` (comma).
- **Tab switching**: `Alt+n` (next) and `Alt+p` (prev).
- **Contacts**: `,ab` opens `abook`.
- **Calendar**: `,ca` opens unified `khal`.
- **Tasks**: `,ta` opens `taskwarrior-tui`.
- **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.
- **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)
- **Escape**: Press `Ctrl+x` to release terminal focus and use `aerc` commands.
- **Tab Passthrough**: `Tab` and `Backtab` are passed to terminal apps for internal navigation.
### Helper scripts (`~/.local/bin`)
- **`mailsync`** — see the Sync and Maintenance section.
- **`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`)
- **Completion**: Triggered by `Tab` on header lines using `abook --mutt-query`.
+3 -3
View File
@@ -1,5 +1,5 @@
[phil]
source = notmuch:///home/liph/Mail/phil
source = notmuch://phil
query-map = ~/.config/aerc/phil.queries
outgoing = smtp://phil%40liphlink.xyz@mail.liphlink.xyz:587
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
[spam]
source = notmuch:///home/liph/Mail/spam
source = notmuch://spam
query-map = ~/.config/aerc/notmuch-queries.conf
outgoing = smtp://spam%40liphlink.xyz@mail.liphlink.xyz:587
outgoing-cred-cmd = pass show mail/spam@liphlink.xyz
@@ -20,7 +20,7 @@ default = Inbox
aliases = blue@liphlink.xyz,red@liphlink.xyz
[proton]
source = notmuch:///home/liph/Mail/proton
source = notmuch://proton
query-map = ~/.config/aerc/notmuch-queries.conf
outgoing = smtp+insecure://liiph%40protonmail.com@127.0.0.1:1025
outgoing-cred-cmd = pass show mail/liiph@protonmail.com
+11 -10
View File
@@ -5,7 +5,7 @@
# 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=
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.
@@ -22,7 +22,6 @@
#
# 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.
@@ -58,8 +57,6 @@ log-level=warn
# 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.
#
@@ -282,6 +279,9 @@ dirlist-collapse=1
#
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
#
# Default: true
@@ -576,7 +576,7 @@ pager= bat --style=plain --paging=always
# html-unsafe-images=false
# html-filter=dante
image/*=chafa -f kitty -s ${width}x${height}
text/html=w3m -T text/html -dump -o display_link_number=1
text/html=/usr/lib/aerc/filters/html
application/pdf=zathura
video/*=mpv
header-layout=From,To,Subject,Date
@@ -640,6 +640,9 @@ editor=nvim +'set ft=mail.markdown'
# 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'
@@ -700,6 +703,8 @@ edit-headers=true
# 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
#
@@ -740,8 +745,6 @@ 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
@@ -773,11 +776,10 @@ text/plain=sed 's/^$//'
# 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/html=/usr/lib/aerc/filters/html
#text/*=bat -fP --file-name="$AERC_FILENAME"
#application/x-sh=bat -fP -l sh
#image/*=catimg -w $(tput cols) -
@@ -814,7 +816,6 @@ text/html=w3m -T text/html -dump -o display_link_number=1
text/html=w3m
x-scheme-handler/http=librewolf
x-scheme-handler/https=librewolf
text/calendar=khal import --batch
[hooks]
#
+886
View File
@@ -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
+891
View File
@@ -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
+8 -4
View File
@@ -14,6 +14,7 @@
<A-n> = :next-tab<Enter>
<C-t> = :terminal<Enter>
? = :help keys<Enter>
M = :menu -t Compose -c 'mail-compose' :compose<Enter>
<C-c> = :prompt 'Quit?' quit<Enter>
<C-q> = :prompt 'Quit?' quit<Enter>
<C-z> = :suspend<Enter>
@@ -98,7 +99,8 @@ rq = :reply -aq<Enter>
Rr = :reply<Enter>
Rq = :reply -q<Enter>
H = :toggle-headers<Enter>
,l = :pipe urlscan<Enter>
,l = :menu -lc fzf :open-link<Enter>
,lu = :pipe urlscan<Enter>
# Attachment Handling
n = :next-part<Enter>
@@ -124,18 +126,19 @@ $complete = <C-o>
<C-k> = :attach<space>
<C-a> = :attach<space>
<F4> = :attach<space>
,a = :menu -t Attach -c 'yazi --chooser-file=%f ~/Downloads' :attach<Enter>
<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)
# While focused in the text editor (nvim) — only these keys reach aerc, the rest go to nvim
$noinherit = true
$ex = <C-x>
<C-k> = :attach<space>
<C-a> = :attach<space>
<F4> = :attach<space>
<F4> = :menu -t Attach -c 'yazi --chooser-file=%f ~/Downloads' :attach<Enter>
[compose::review]
# After exiting the editor
@@ -145,7 +148,7 @@ v = :preview<Enter>
p = :postpone<Enter>
q = :choose -o d discard abort -o p postpone postpone<Enter>
e = :edit<Enter>
a = :attach<space>
,a = :menu -t Attach -c 'yazi --chooser-file=%f ~/Downloads' :attach<Enter>
<C-k> = :attach<space>
<C-a> = :attach<space>
d = :detach<space>
@@ -155,6 +158,7 @@ d = :detach<space>
$ex = <C-x>
<C-p> =
<C-n> =
M =
<tab> =
<backtab> =
<A-p> = :prev-tab<Enter>
+161
View File
@@ -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>
+286
View File
@@ -0,0 +1,286 @@
#? Config file for btop v.1.4.7
#* Name of a btop++/bpytop/bashtop formatted ".theme" file, "Default" and "TTY" for builtin themes.
#* Themes should be placed in "../share/btop/themes" relative to binary or "$HOME/.config/btop/themes"
color_theme = "dracula.theme"
#* If the theme set background should be shown, set to False if you want terminal background transparency.
theme_background = true
#* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false.
truecolor = true
#* Set to true to force tty mode regardless if a real tty has been detected or not.
#* Will force 16-color mode and TTY theme, set all graph symbols to "tty" and swap out other non tty friendly symbols.
force_tty = false
#* Option to disable presets. Either the default preset, custom presets, or all presets.
#* "Off" All presets are enabled.
#* "Default" preset is disabled.#* "Custom" presets are disabled.#* "All" presets are disabled.
disable_presets = "Off"
#* Define presets for the layout of the boxes. Preset 0 is always all boxes shown with default settings. Max 9 presets.
#* Format: "box_name:P:G,box_name:P:G" P=(0 or 1) for alternate positions, G=graph symbol to use for box.
#* Use whitespace " " as separator between different presets.
#* Example: "cpu:0:default,mem:0:tty,proc:1:default cpu:0:braille,proc:0:tty"
presets = "cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:default cpu:0:block,net:0:tty"
#* Set to True to enable "h,j,k,l,g,G" keys for directional control in lists.
#* Conflicting keys for h:"help" and k:"kill" is accessible while holding shift.
vim_keys = false
#* Disable all mouse events.
disable_mouse = false
#* Rounded corners on boxes, is ignored if TTY mode is ON.
rounded_corners = true
#* Use terminal synchronized output sequences to reduce flickering on supported terminals.
terminal_sync = true
#* Default symbols to use for graph creation, "braille", "block" or "tty".
#* "braille" offers the highest resolution but might not be included in all fonts.
#* "block" has half the resolution of braille but uses more common characters.
#* "tty" uses only 3 different symbols but will work with most fonts and should work in a real TTY.
#* Note that "tty" only has half the horizontal resolution of the other two, so will show a shorter historical view.
graph_symbol = "braille"
# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
graph_symbol_cpu = "default"
# Graph symbol to use for graphs in gpu box, "default", "braille", "block" or "tty".
graph_symbol_gpu = "default"
# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
graph_symbol_mem = "default"
# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
graph_symbol_net = "default"
# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
graph_symbol_proc = "default"
#* Manually set which boxes to show. Available values are "cpu mem net proc" and "gpu0" through "gpu5", separate values with whitespace.
shown_boxes = "cpu mem net proc"
#* Update time in milliseconds, recommended 2000 ms or above for better sample times for graphs.
update_ms = 2000
#* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu direct",
#* "cpu lazy" sorts top process over time (easier to follow), "cpu direct" updates top process directly.
proc_sorting = "cpu lazy"
#* Reverse sorting order, True or False.
proc_reversed = false
#* Show processes as a tree.
proc_tree = false
#* Use the cpu graph colors in the process list.
proc_colors = true
#* Use a darkening gradient in the process list.
proc_gradient = true
#* If process cpu usage should be of the core it's running on or usage of the total available cpu power.
proc_per_core = false
#* Show process memory as bytes instead of percent.
proc_mem_bytes = true
#* Show cpu graph for each process.
proc_cpu_graphs = true
#* Use /proc/[pid]/smaps for memory information in the process info box (very slow but more accurate)
proc_info_smaps = false
#* Show proc box on left side of screen instead of right.
proc_left = false
#* (Linux) Filter processes tied to the Linux kernel(similar behavior to htop).
proc_filter_kernel = false
#* Should the process list follow the selected process when detailed view is open.
proc_follow_detailed = true
#* In tree-view, always accumulate child process resources in the parent process.
proc_aggregate = false
#* Should cpu and memory usage display be preserved for dead processes when paused.
keep_dead_proc_usage = false
#* Sets the CPU stat shown in upper half of the CPU graph, "total" is always available.
#* Select from a list of detected attributes from the options menu.
cpu_graph_upper = "Auto"
#* Sets the CPU stat shown in lower half of the CPU graph, "total" is always available.
#* Select from a list of detected attributes from the options menu.
cpu_graph_lower = "Auto"
#* If gpu info should be shown in the cpu box. Available values = "Auto", "On" and "Off".
show_gpu_info = "Auto"
#* Toggles if the lower CPU graph should be inverted.
cpu_invert_lower = true
#* Set to True to completely disable the lower CPU graph.
cpu_single_graph = false
#* Show cpu box at bottom of screen instead of top.
cpu_bottom = false
#* Shows the system uptime in the CPU box.
show_uptime = true
#* Shows the CPU package current power consumption in watts. Requires running `make setcap` or `make setuid` or running with sudo.
show_cpu_watts = true
#* Show cpu temperature.
check_temp = true
#* Which sensor to use for cpu temperature, use options menu to select from list of available sensors.
cpu_sensor = "Auto"
#* Show temperatures for cpu cores also if check_temp is True and sensors has been found.
show_coretemp = true
#* Set a custom mapping between core and coretemp, can be needed on certain cpus to get correct temperature for correct core.
#* Use lm-sensors or similar to see which cores are reporting temperatures on your machine.
#* Format "x:y" x=core with wrong temp, y=core with correct temp, use space as separator between multiple entries.
#* Example: "4:0 5:1 6:3"
cpu_core_map = ""
#* Which temperature scale to use, available values: "celsius", "fahrenheit", "kelvin" and "rankine".
temp_scale = "celsius"
#* Use base 10 for bits/bytes sizes, KB = 1000 instead of KiB = 1024.
base_10_sizes = false
#* Show CPU frequency.
show_cpu_freq = true
#* How to calculate CPU frequency, available values: "first", "range", "lowest", "highest" and "average".
freq_mode = "first"
#* Draw a clock at top of screen, formatting according to strftime, empty string to disable.
#* Special formatting: /host = hostname | /user = username | /uptime = system uptime
clock_format = "%X"
#* Update main ui in background when menus are showing, set this to false if the menus is flickering too much for comfort.
background_update = true
#* Custom cpu model name, empty string to disable.
custom_cpu_name = ""
#* Optional filter for shown disks, should be full path of a mountpoint, separate multiple values with whitespace " ".
#* Only disks matching the filter will be shown. Prepend exclude= to only show disks not matching the filter. Examples: disk_filter="/boot /home/user", disks_filter="exclude=/boot /home/user"
disks_filter = ""
#* Show graphs instead of meters for memory values.
mem_graphs = true
#* Show mem box below net box instead of above.
mem_below_net = false
#* Count ZFS ARC in cached and available memory.
zfs_arc_cached = true
#* If swap memory should be shown in memory box.
show_swap = true
#* Show swap as a disk, ignores show_swap value above, inserts itself after first disk.
swap_disk = true
#* If mem box should be split to also show disks info.
show_disks = true
#* Filter out non physical disks. Set this to False to include network disks, RAM disks and similar.
only_physical = true
#* Read disks list from /etc/fstab. This also disables only_physical.
use_fstab = true
#* Setting this to True will hide all datasets, and only show ZFS pools. (IO stats will be calculated per-pool)
zfs_hide_datasets = false
#* Set to true to show available disk space for privileged users.
disk_free_priv = false
#* Toggles if io activity % (disk busy time) should be shown in regular disk usage view.
show_io_stat = true
#* Toggles io mode for disks, showing big graphs for disk read/write speeds.
io_mode = false
#* Set to True to show combined read/write io graphs in io mode.
io_graph_combined = false
#* Set the top speed for the io graphs in MiB/s (100 by default), use format "mountpoint:speed" separate disks with whitespace " ".
#* Example: "/mnt/media:100 /:20 /boot:1".
io_graph_speeds = ""
#* Swap the positions of the upload and download speed graphs. When true, upload will be on top.
swap_upload_download = false
#* Set fixed values for network graphs in Mebibits. Is only used if net_auto is also set to False.
net_download = 100
net_upload = 100
#* Use network graphs auto rescaling mode, ignores any values set above and rescales down to 10 Kibibytes at the lowest.
net_auto = true
#* Sync the auto scaling for download and upload to whichever currently has the highest scale.
net_sync = true
#* Starts with the Network Interface specified here.
net_iface = ""
#* "True" shows bitrates in base 10 (Kbps, Mbps). "False" shows bitrates in binary sizes (Kibps, Mibps, etc.). "Auto" uses base_10_sizes.
base_10_bitrate = "Auto"
#* Show battery stats in top right if battery is present.
show_battery = true
#* Which battery to use if multiple are present. "Auto" for auto detection.
selected_battery = "Auto"
#* Show power stats of battery next to charge indicator.
show_battery_watts = true
#* Set loglevel for "~/.local/state/btop.log" levels are: "ERROR" "WARNING" "INFO" "DEBUG".
#* The level set includes all lower levels, i.e. "DEBUG" will show all logging info.
log_level = "WARNING"
#* Automatically save current settings to config file on exit.
save_config_on_exit = true
#* Measure PCIe throughput on NVIDIA cards, may impact performance on certain cards.
nvml_measure_pcie_speeds = true
#* Measure PCIe throughput on AMD cards, may impact performance on certain cards.
rsmi_measure_pcie_speeds = true
#* Horizontally mirror the GPU graph.
gpu_mirror_graph = true
#* Set which GPU vendors to show. Available values are "nvidia amd intel apple"
shown_gpus = "nvidia amd intel apple"
#* Custom gpu0 model name, empty string to disable.
custom_gpu_name0 = ""
#* Custom gpu1 model name, empty string to disable.
custom_gpu_name1 = ""
#* Custom gpu2 model name, empty string to disable.
custom_gpu_name2 = ""
#* Custom gpu3 model name, empty string to disable.
custom_gpu_name3 = ""
#* Custom gpu4 model name, empty string to disable.
custom_gpu_name4 = ""
#* Custom gpu5 model name, empty string to disable.
custom_gpu_name5 = ""
+89
View File
@@ -0,0 +1,89 @@
#Bashtop theme with nord palette (https://www.nordtheme.com)
#by Justin Zobel <justin.zobel@gmail.com>
# Colors should be in 6 or 2 character hexadecimal or single spaced rgb decimal: "#RRGGBB", "#BW" or "0-255 0-255 0-255"
# example for white: "#ffffff", "#ff" or "255 255 255".
# All graphs and meters can be gradients
# For single color graphs leave "mid" and "end" variable empty.
# Use "start" and "end" variables for two color gradient
# Use "start", "mid" and "end" for three color gradient
# Main background, empty for terminal default, need to be empty if you want transparent background
theme[main_bg]="#282A36"
# Main text color
theme[main_fg]="#BD93F9"
# Title color for boxes
theme[title]="#f8f8f2"
# Higlight color for keyboard shortcuts
theme[hi_fg]="#ff79c6"
# Background color of selected item in processes box
theme[selected_bg]="#44475A"
# Foreground color of selected item in processes box
theme[selected_fg]="#ECEFF4"
# Color of inactive/disabled text
theme[inactive_fg]="#6272a4"
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
theme[proc_misc]="#BD93F9"
# Cpu box outline color
theme[cpu_box]="#ff79c6"
# Memory/disks box outline color
theme[mem_box]="#ff79c6"
# Net up/down box outline color
theme[net_box]="#ff79c6"
# Processes box outline color
theme[proc_box]="#ff79c6"
# Box divider line and small boxes line color
theme[div_line]="#ff79c6"
# Temperature graph colors
theme[temp_start]="#bd93f9"
theme[temp_mid]="#bd93f9"
theme[temp_end]="#bd93f9"
# CPU graph colors
theme[cpu_start]="#bd93f9"
theme[cpu_mid]="#bd93f9"
theme[cpu_end]="#bd93f9"
# Mem/Disk free meter
theme[free_start]="#bd93f9"
theme[free_mid]="#bd93f9"
theme[free_end]="#bd93f9"
# Mem/Disk cached meter
theme[cached_start]="#bd93f9"
theme[cached_mid]="#bd93f9"
theme[cached_end]="#bd93f9"
# Mem/Disk available meter
theme[available_start]="#bd93f9"
theme[available_mid]="#bd93f9"
theme[available_end]="#bd93f9"
# Mem/Disk used meter
theme[used_start]="#bd93f9"
theme[used_mid]="#bd93f9"
theme[used_end]="#bd93f9"
# Download graph colors
theme[download_start]="#bd93f9"
theme[download_mid]="#bd93f9"
theme[download_end]="#bd93f9"
# Upload graph colors
theme[upload_start]="#bd93f9"
theme[upload_mid]="#bd93f9"
theme[upload_end]="#bd93f9"
@@ -0,0 +1 @@
theme = Dracula
+91
View File
@@ -0,0 +1,91 @@
# theme = catppuccin-mocha
# font-size = 12
# background-blur-radius = 20
# mouse-hide-while-typing = true
# window-decoration = true
# keybind = global:cmd+/=toggle_quick_terminal
# macos-option-as-alt = true
# background-opacity = 0.7
# background-blur-radius = 20
# By default Reload config with shft + cmd + ,
gtk-titlebar = false
# background = #000000
background-opacity = 0.8
background-blur-radius = 20
font-family = JetBrainsMonoNL Nerd Font
font-size = 12
# cursor
# cursor-color = cell-background
cursor-style = block
cursor-style-blink = true
# cursor-invert-fg-bg = true
# macos-titlebar-style = hidden
# macos-option-as-alt = true
# mouse-hide-while-typing = true
#confirm-close-surface = false
#window-decoration = true
window-padding-x = 10
window-padding-y = 10
window-padding-balance = true
auto-update = check
auto-update-channel = stable
# extras
# shell-integration-features = no-cursor
copy-on-select = clipboard
# Custom Keybinds & Config (super represents cmd key on mac)
# For Simple Keybinds
# keybind = super+r=reload_config
keybind = super+i=inspector:toggle
keybind = super+b>,=toggle_quick_terminal
keybind = ctrl+alt+n=text:~
# Similar Tmux but with Ghostty
# (ctrl b for tmux -> cmb b for ghostty)
keybind = super+b>r=reload_config
keybind = super+b>x=close_surface
# this only works if you have `macos-titlebar-style = tabs or native or transparent`
# else it behaves like new window
keybind = super+b>c=new_tab
keybind = super+b>n=new_window
# tab nav
#keybind = super+b>1=goto_tab:1
#keybind = super+b>2=goto_tab:2
#keybind = super+b>3=goto_tab:3
#keybind = super+b>4=goto_tab:4
#keybind = super+b>5=goto_tab:5
#keybind = super+b>6=goto_tab:6
#keybind = super+b>7=goto_tab:7
#keybind = super+b>8=goto_tab:8
#keybind = super+b>9=goto_tab:9
# splitting
#keybind = super+a>\=new_split:right
#keybind = super+a>-=new_split:down
#keybind = super+a>e=equalize_splits
# split nav (setting this to control will not work if tmux already uses it)
#keybind = super+a>h=goto_split:left
#keybind = super+a>j=goto_split:bottom
#keybind = super+a>k=goto_split:top
#keybind = super+a>l=goto_split:right
# typecraft
# theme = catppuccin-mocha
# theme = GruvboxDark
# font-family = CaskaydiaCove Nerd Font
# font-size = 12
# gtk-titlebar = false
# custom-shader = shaders/cursor_sweep.glsl
# custom-shader = shaders/cursor_tail.glsl
custom-shader = shaders/cursor_warp.glsl
# custom-shader = shaders/cursor_sweep.glsl
config-file = ?auto/theme.ghostty
@@ -1,22 +1,21 @@
# theme = catppuccin-mocha
# font-size = 12
# background-blur-radius = 20
# mouse-hide-while-typing = true
# window-decoration = true
# keybind = global:cmd+/=toggle_quick_terminal
# macos-option-as-alt = true
macos-option-as-alt = true
# background-opacity = 0.7
# background-blur-radius = 20
# By default Reload config with shft + cmd + ,
gtk-titlebar = false
# config-file = themes/rosepine
# background = #000000
# background-opacity = 0.85
# background-blur-radius = 20
background-opacity = 0.8
background-blur-radius = 20
# font-family = JetBrainsMonoNL Nerd Font
# font-size = 12
font-family = JetBrainsMonoNL Nerd Font
font-size = 12
cursor-style = block
cursor-style-blink = false
cursor-invert-fg-bg = true
@@ -78,9 +77,7 @@ keybind = super+b>n=new_window
# typecraft
# theme = catppuccin-mocha
# theme = GruvboxDark
font-family = CaskaydiaCove Nerd Font
font-size = 12
background-opacity = 0.95
gtk-titlebar = false
# custom-shader = /home/chris/bloom.glsl
# font-family = CaskaydiaCove Nerd Font
# font-size = 12
# gtk-titlebar = false
#custom-shader = /home/chris/crt.glsl
Submodule ghostty/.config/ghostty/shaders added at 0a274beac8.
View File
Whitespace-only changes.
+1
View File
@@ -96,3 +96,4 @@ description = "command bar"
[experimental]
pane_history = true
kitty_graphics = true
Submodule herdr/.config/herdr/plugins/.tmp-install-750065-1785311987680/checkout deleted from 5f76bc9eab.
@@ -0,0 +1,148 @@
# Herdr Navigator default config
# Location after first run:
# $(herdr plugin config-dir herdr-navigator)/config.toml
[picker]
# What happens after selecting an entry:
# - true: focus an already-open workspace for the selected path
# - false: always use create_missing behavior
reuse_existing = true
# Create a new Herdr workspace when the selected path is not open yet.
create_missing = true
# Search engine: "nucleo" | "skim" | "simple"
# - nucleo: best default; fast, fzf-like scoring, good Unicode support
# - skim: skim/fzf-style matcher via fuzzy-matcher crate
# - simple: tiny built-in ordered-character matcher for debugging
engine = "nucleo"
# Source priority controls initial ordering and tie/near-tie ranking.
# Accepted names: agent, server/remote, workspace/open, project, session, zoxide, root, quick, plugin.
source_order = ["workspace", "agent", "project", "session", "zoxide", "root", "server", "quick", "plugin"]
# How strongly source_order influences search ranking.
# Set 0 for pure matcher score.
source_priority_boost = 5
# Agent view sorting for `@` and Ctrl-A:
# - herdr: read Herdr's agent_panel_sort setting
# - priority: blocked/error, attention/request, done, working, then idle
# - spaces: keep Herdr/pane order
agent_sort = "herdr"
# Show the right-side preview pane on open. Ctrl-O toggles it at runtime.
preview = true
# Use Herdr-style source-aware rows: metadata aligns right, while zoxide/root
# entries expand to a second full-path line. Set false for the compact list.
detailed_rows = true
# Check GitHub releases in the background at most once per day. Network errors
# are ignored; a newer version appears as a badge in the Navigator header.
check_updates = true
# Vim-style normal mode: j/k move, source keys filter, and / starts searching.
vim_mode = false
# Start searching immediately after a Vim source-filter key.
vim_filter_search = false
# Optional: override source filter shortcuts. Values accept "ctrl-x", "ctrl+x", "^x", or "x".
# Defaults: server=ctrl-s, agent=ctrl-a, quick=ctrl-q, workspace=ctrl-w, project=ctrl-p,
# zoxide=ctrl-z, root=ctrl-r, session=ctrl-l.
# [picker.filter_keys]
# server = "ctrl-g"
[notifications]
# Show Navigator success/error notifications.
enabled = true
# Enable notification audio. Notifications remain visible when this is false.
audio = false
# Audio mode when enabled: "default" uses Herdr's done/request sounds;
# "custom" plays custom_sound with afplay (macOS) or pw-play/paplay/aplay (Linux).
sound = "default"
custom_sound = "" # Example: "~/sounds/navigator.wav"
[jump_back]
# Master switch for Jump Back.
# - true: remember successful local workspace changes and enable the jump-back action
# - false: do not record, pin, or jump; any saved history is kept for later re-enabling
# The global keybinding itself belongs in Herdr's main config; see README.md.
enabled = true
# Put the previous workspace first when the picker opens with no query or source filter.
# This only changes the initial view; typed searches and Ctrl source filters keep normal ranking.
pin_previous = true
[sources]
# Existing Herdr workspaces. Selecting focuses the workspace.
open_workspaces = true
# Herdr Plus project templates from:
# ~/.config/herdr/plugins/config/cloudmanic.herdr-plus/projects/*.toml
herdr_plus_projects = true
# zoxide history from `zoxide query -l`.
zoxide = true
# Direct filesystem scan of [[roots]] below.
roots = true
# Agent panes from Herdr pane metadata. Selecting focuses the agent.
agents = true
# Remote Herdr targets from remote entries in [sessions] below.
servers = true
# Local Herdr sessions from `herdr session list --json` and local [sessions] entries below.
sessions = true
# Herdr Plus Quick Actions. Selecting opens the Quick Actions picker.
herdr_plus_quick_actions = true
[theme]
# Reads ~/.config/herdr/config.toml theme name and [theme.custom] tokens when available.
# Falls back to the built-in One Light palette.
inherit_herdr = true
# Keep roots short; zoxide should handle most frequent directories.
[[roots]]
path = "~/workspace"
max_depth = 3
[[roots]]
path = "~/projects"
max_depth = 3
# Optional agent aliases. All match fields are optional and matched as text contains.
# Aliases become extra search terms for matching agent panes.
#
# [[agent_aliases]]
# alias = "main ai dot"
# agent = "claude"
# workspace = "Dotfiles"
# path = "dotfiles"
[sessions]
# Include local named sessions from `herdr session list --json`.
local = true
# Manual remote targets. Selecting runs: herdr --remote <remote> --handoff.
# [[sessions.entries]]
# name = "prod"
# remote = "prod-api"
# tags = ["prod", "api"]
# Optional command/JSON integrations. A plugin only needs:
# - collect: command that prints JSON array
# - open: command to run when the item is selected
#
# [[integrations]]
# id = "demo"
# label = "Bookmarks"
# enabled = true
# collect = "bookmarks list --json"
# open = "bookmarks open {{id}}"
# notify_success = true
# notify_error = true
#
@@ -0,0 +1,2 @@
1788530642
0.3.6
@@ -11,14 +11,14 @@ workspaces:
focus: true
- label: Music
panes:
- focus: true
- focus: false
- split: right
ratio: 0.5
command: mc
- label: Aerc
panes:
- command: aerc
focus: true
focus: false
- name: Dotfiles
root: /home/liph/dotfiles
@@ -28,3 +28,13 @@ workspaces:
panes:
- command: yazi
focus: true
- name: Coding
root: /home/liph/code
focus: false
tabs:
- label: Pi
panes:
- focus: false
- split: right
ratio: 0.5
Submodule herdr/.config/herdr/plugins/github/herdr-bar-96eebe452a9c updated: 58c23e5c8d...b57aa342f8.
Submodule herdr/.config/herdr/plugins/github/herdr-lazygit-b11d62e75f78 updated: a13e12c99e...6b1e34f426.
Submodule herdr/.config/herdr/plugins/github/herdr-navigator-3a5a6fa5dfb5 added at 03b803a003.
Submodule herdr/.config/herdr/plugins/github/herdr-spreader-f248c87aa2e2 updated: 5f76bc9eab...206ae55aff.
+2 -2
View File
@@ -1,5 +1,5 @@
{
"version": "0.8.2",
"body": "### Added\n- CLI help now points coding agents to Herdr's plain-text guide, documentation index, and built-in control skill.\n- Added Qwen Code detection for idle, working, and user-confirmation states, plus optional native session restore. (#2730, #2743)\n- Herdr now keeps the outer terminal window title in sync with the session through `ui.window_title`, so window managers and terminal tab bars show the active workspace and the host the panes actually run on. (#2627, thanks @dhh)\n- The desktop tab bar now has configurable right-aligned status entries for zoom state, hostname, date/time, literal text, and asynchronously refreshed command output.\n- Optional `keys.move_tab_previous` and `keys.move_tab_next` bindings now reorder the active tab in place, wrapping at either end. (#2561, thanks @dhh)\n- Optional `keys.resize_pane_left`, `keys.resize_pane_down`, `keys.resize_pane_up`, and `keys.resize_pane_right` bindings now resize the focused pane in one keystroke without entering resize mode. (#2558, thanks @dhh)\n- Windows clients can now use `herdr --remote` to attach to Herdr servers on Linux and macOS. (#2329)\n- Cursor Agent CLI, MastraCode, Hermes Agent, and Grok CLI integrations now install and run natively on Windows.\n- Panes can now route normal right-click gestures to mouse-reporting applications through the pane menu, `herdr pane input`, `pane.input.set`, or the `pane split --right-click pane` launch option.\n- `ui.pane_outer_borders` can now keep or hide the outside edges of split-pane borders independently from internal dividers. (#2535, thanks @dhh)\n- `theme.custom.sidebar_bg` can now give the desktop sidebar its own background without changing built-in theme defaults.\n- Settings and `ui.status_indicators = \"symbols\"` can now use distinct static shapes for blocked, working, done, idle, and unknown agent states. (#2260)\n- Navigate-mode selection rows now use a dedicated per-theme cursor color, customizable via `theme.custom.selection_bg`, so the cursor stays distinguishable from the active Space and Agent highlight.\n- Copy mode now supports `B`, `E`, and `W` motions over whitespace-delimited big words. (#2270, thanks @jplew)\n- The plugin marketplace now discovers valid manifests at repository roots and subdirectories, groups multiple plugins under each repository, and publishes their versions and exact default-branch commits.\n\n### Changed\n- Windows support is now generally available through stable releases and uses the stable update channel by default. Existing preview installs stay on preview until explicitly switched.\n- Headless servers now use a configurable 120×40 virtual terminal instead of 80×24 when no client is attached, giving newly created panes a practical default size. (#2828)\n- Desktop tab labels are now centered in their tabs, so the active-tab highlight has symmetric padding. (#2570, thanks @dhh)\n- Experimental pane graphics now support bounded named layers, acknowledged full-RGBA primary-layer direct file frames on audited local terminals, owned BGRA fallback, exact pixel mouse input, and placement-only resize replay.\n\n### Fixed\n- Unix CLI commands now exit quietly when a downstream pipe closes instead of panicking with exit 101. (#2994)\n- The terminal theme now keeps the active Space row fill visible when the Navigate cursor lands on it, in both expanded and collapsed sidebars. (#2987)\n- Busy multi-pane sessions now avoid redundant hidden-pane wakeups and full terminal-state formatting in pane-scaled paths, preventing CPU regressions from high-rate background output, scrollbars, and enhanced keyboard modes. (#2550, #2901, #2962)\n- Chinese IME commits now reach panes on macOS when the focused application requests printable key-release events. (#2924)\n- Windows now recognizes `Ctrl+1` through `Ctrl+9` keybindings instead of decoding those key records as control characters. (#2910)\n- PowerShell panes now keep their process-reported working directory synchronized with the shell's logical location. (#2879, thanks @Pimpmuckl)\n- Foreground typing no longer waits behind render cadence consumed by output from panes in hidden tabs. (#2890)\n- The Windows ARM64 installer now waits for x64 emulation to release the verified executable before activating the downloaded release. (#2916)\n- On Unix, Ctrl-click URL openers are now reaped after they exit, preventing defunct child processes from accumulating on long-running servers. (#2903)\n- Windows updates now reuse only verified local packages, avoiding security-tool download blocks while preserving checksum validation. (#2751, #2816, thanks @Pimpmuckl)\n- Herdr no longer sends the full OSC 4 palette query burst under WSL, preventing reply fragments from leaking into the shell through ConPTY. (#2440)\n- Qwen Code panes now use locale-independent terminal-title states and localized confirmation fallbacks, preventing active or blocked turns from appearing idle. (#2756)\n- Claude Code panes now recognize and stLine truncated
"version": "0.9.3",
"body": "This is a hotfix release for v0.9.2. See the v0.9.2 notes for the full feature release: https://github.com/herdrdev/herdr/releases/tag/v0.9.2\n\n### Fixed\n- Terminal shortcuts that send Escape followed by a key work again in panes. On macOS, Option+Left/Right and Option+Backspace from Ghostty's defaults or iTerm2's Natural Text Editing preset move and delete by word again, instead of typing `b` and `f` or deleting one character. Escape-based Shift+Enter bindings insert a newline in Claude Code instead of submitting. Clicking a pane still doesn't send a stray Escape. (#4751)\n- Alt+[ followed quickly by another key no longer merges into a different key. (#4751)",
"show_on_startup": true
}
@@ -10,6 +10,7 @@ TARGET_DIR="$(realpath ~/dotfiles)"
# Close any existing versions of these workspaces so this is idempotent.
herdr workspace close Home 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.
"$SPREADER" apply --file "$CONFIG_DIR/home.yml"
@@ -5,35 +5,11 @@
"tabs": [
{
"panes": {
"7": {
"ansi": "neo\r\n\u001b[0m\u001b[38;5;5m❯ \u001b[0m\u001b[38;5;2mneo\u001b[0m\r\n\u001b[0m\u001b[1m\u001b[38;5;6m -` liph\u001b[0m@\u001b[0m\u001b[1m\u001b[38;5;6march\u001b[0m \r\n\u001b[0m\u001b[1m\u001b[38;5;6m .o+` \u001b[0m--------- \r\n\u001b[0m\u001b[1m\u001b[38;5;6m `ooo/ OS\u001b[0m: Arch Linux x86_64 \r\n\u001b[0m\u001b[1m\u001b[38;5;6m `+oooo: Host\u001b[0m: 20BWS3GD00 ThinkPad T450s \r\n\u001b[0m\u001b[1m\u001b[38;5;6m `+oooooo: Kernel\u001b[0m: 6.18.48-1-lts \r\n\u001b[0m\u001b[1m\u001b[38;5;6m -+oooooo+: Uptime\u001b[0m: 3 hours, 11 mins \r\n\u001b[0m\u001b[1m\u001b[38;5;6m `/:-:++oooo+: Packages\u001b[0m: 1682 (pacman) \r\n\u001b[0m\u001b[1m\u001b[38;5;6m `/++++/+++++++: Shell\u001b[0m: zsh 5.9.2 \r\n\u001b[0m\u001b[1m\u001b[38;5;6m `/++++++++++++++: Resolution\u001b[0m: 1920x1080 \r\n\u001b[0m\u001b[1m\u001b[38;5;6m `/+++ooooooooooooo/` DE\u001b[0m: Niri \r\n\u001b[0m\u001b[1m\u001b[38;5;6m ./ooosssso++osssssso+` WM\u001b[0m: sway \r\n\u001b[0m\u001b[1m\u001b[38;5;6m .oossssso-````/ossssss+` Theme\u001b[0m: Gruvbox-Material-Dark-HIDPI [GTK2/3] \r\n\u001b[0m\u001b[1m\u001b[38;5;6m -osssssso. :ssssssso. Icons\u001b[0m: Pop [GTK2/3] \r\n\u001b[0m\u001b[1m\u001b[38;5;6m :osssssss/ osssso+++. Terminal\u001b[0m: WezTerm \r\n\u001b[0m\u001b[1m\u001b[38;5;6m /ossssssss/ +ssssooo/- CPU\u001b[0m: Intel i5-5300U (4) @ 2.900GHz \r\n\u001b[0m\u001b[1m\u001b[38;5;6m `/ossssso+/:- -:/+osssso+- GPU\u001b[0m: Intel Broadwell-U GT2 [HD Graphics 5500 \r\n\u001b[0m\u001b[1m\u001b[38;5;6m `+sso+:-` `.-/+oso: Memory\u001b[0m: 4376MiB / 7635MiB \r\n\u001b[0m\u001b[1m\u001b[38;5;6m `++:. `-/+/\u001b[0m\r\n\u001b[0m\u001b[1m\u001b[38;5;6m .` `/ \u001b[0m\u001b[38;5;0m\u001b[48;5;0m \u001b[0m\u001b[38;5;1m\u001b[48;5;1m \u001b[0m\u001b[38;5;2m\u001b[48;5;2m \u001b[0m\u001b[38;5;3m\u001b[48;5;3m \u001b[0m\u001b[38;5;4m\u001b[48;5;4m \u001b[0m\u001b[38;5;5m\u001b[48;5;5m \u001b[0m\u001b[38;5;6m\u001b[48;5;6m \u001b[0m\u001b[38;5;7m\u001b[48;5;7m \u001b[0m\r\n \u001b[0m\u001b[38;5;8m\u001b[48;5;8m \u001b[0m\u001b[38;5;9m\u001b[48;5;9m \u001b[0m\u001b[38;5;10m\u001b[48;5;10m \u001b[0m\u001b[38;5;11m\u001b[48;5;11m \u001b[0m\u001b[38;5;12m\u001b[48;5;12m \u001b[0m\u001b[38;5;13m\u001b[48;5;13m \u001b[0m\u001b[38;5;14m\u001b[48;5;14m \u001b[0m\u001b[38;5;15m\u001b[48;5;15m \u001b[0m\r\n\r\n\r\n\u001b[0m\u001b[38;5;5m❯ \u001b[0m\u001b[38;5;2my\u001b[0m\r\n\u001b[0m\u001b[38;5;5m❯ \u001b[0m\u001b[38;5;2my\u001b[0m\r\n\u001b[0m\u001b[38;5;5m❯ \u001b[0m\u001b[38;5;2my\u001b[0m\r\n\r\n\u001b[0m\u001b[38;5;5march liph \u001b[0m\u001b[38;5;4m/home\u001b[0m\r\n\u001b[0m\u001b[38;5;5m❯\u001b[0m ",
"lines": 30
},
"8": {
"ansi": "\u001b[0m\u001b[38;2;144;140;170m\u001b[48;2;42;39;63m \u001b[0m\u001b[38;2;156;66;33m\u001b[48;2;42;39;63m\u001b[0m\u001b[38;2;144;140;170m\u001b[48;2;42;39;63m \u001b[0m\u001b[1m\u001b[38;2;144;140;170m\u001b[48;2;42;39;63myazi.toml\u001b[0m\u001b[38;2;144;140;170m\u001b[48;2;42;39;63m  mgr  ratio  0 \u001b[0m\r\n 1 \u001b[0m\u001b[3m\u001b[38;2;144;140;170m# A TOML linter such as Tombi can use this schema to validate your config.\u001b[0m\r\n 2 \u001b[0m\u001b[3m\u001b[38;2;144;140;170m# If you encounter any problems, please file an issue at https://github.com/y\u001b[0m \u001b[0m\u001b[3m\u001b[38;2;144;140;170mazi-rs/schemas.\u001b[0m\r\n 3 \r\n 4 \u001b[0m\u001b[3m\u001b[38;2;144;140;170m#:schema https://yazi-rs.github.io/schemas/yazi.json\u001b[0m\r\n 5 \r\n 6 \u001b[0m\u001b[1m\u001b[38;2;156;207;216m[mgr]\u001b[0m\r\n 7 \u001b[0m\u001b[38;2;224;222;244mratio\u001b[0m = [\u001b[0m\u001b[38;2;246;193;119m1\u001b[0m, \u001b[0m\u001b[38;2;246;193;119m2\u001b[0m, \u001b[0m\u001b[38;2;246;193;119m3\u001b[0m]\r\n 8 \u001b[0m\u001b[38;2;224;222;244msort_by\u001b[0m = \u001b[0m\u001b[38;2;246;193;119m\"alphabetical\"\u001b[0m \r\n 9 \u001b[0m\u001b[38;2;224;222;244msort_sensitive\u001b[0m = \u001b[0m\u001b[38;2;234;154;151mfalse\u001b[0m \r\n 10 \u001b[0m\u001b[38;2;224;222;244msort_reverse\u001b[0m = \u001b[0m\u001b[38;2;234;154;151mfalse\u001b[0m \r\n 11 \u001b[0m\u001b[38;2;224;222;244msort_dir_first\u001b[0m = \u001b[0m\u001b[38;2;234;154;151mtrue\u001b[0m \r\n 12 \u001b[0m\u001b[38;2;224;222;244msort_translit\u001b[0m = \u001b[0m\u001b[38;2;234;154;151mfalse\u001b[0m \r\n 13 \u001b[0m\u001b[38;2;224;222;244msort_fallback\u001b[0m = \u001b[0m\u001b[38;2;246;193;119m\"alphabetical\"\u001b[0m\r\n 14 \u001b[0m\u001b[38;2;224;222;244mlinemode\u001b[0m = \u001b[0m\u001b[38;2;246;193;119m\"none\"\u001b[0m \r\n 15 \u001b[0m\u001b[38;2;117;77;75m┃ \u001b[0m\u001b[38;2;224;222;244mshow_hidden\u001b[0m = \u001b[0m\u001b[38;2;234;154;151mtrue\u001b[0m \r\n 16 \u001b[0m\u001b[38;2;224;222;244mshow_symlink\u001b[0m = \u001b[0m\u001b[38;2;234;154;151mtrue\u001b[0m \r\n 17 \u001b[0m\u001b[38;2;224;222;244mscrolloff\u001b[0m = \u001b[0m\u001b[38;2;246;193;119m5\u001b[0m \r\n 18 \u001b[0m\u001b[38;2;224;222;244mmouse_events\u001b[0m = [\u001b[0m\u001b[38;2;246;193;119m\"click\"\u001b[0m, \u001b[0m\u001b[38;2;246;193;119m\"scroll\"\u001b[0m, \u001b[0m\u001b[38;2;246;193;119m\"drag\"\u001b[0m]\r\n 19 \r\n 20 \u001b[0m\u001b[1m\u001b[38;2;156;207;216m[preview]\u001b[0m \r\n 21 \u001b[0m\u001b[38;2;224;222;244mwrap\u001b[0m = \u001b[0m\u001b[38;2;246;193;119m\"no\"\u001b[0m \r\n 22 \u001b[0m\u001b[38;2;224;222;244mtab_size\u001b[0m = \u001b[0m\u001b[38;2;246;193;119m2\u001b[0m \r\n 23 \u001b[0m\u001b[38;2;117;77;75m┃ \u001b[0m\u001b[38;2;224;222;244mmax_width\u001b[0m = \u001b[0m\u001b[38;2;246;193;119m800\u001b[0m \r\n 24 \u001b[0m\u001b[38;2;117;77;75m┃ \u001b[0m\u001b[38;2;224;222;244mmax_height\u001b[0m = \u001b[0m\u001b[38;2;246;193;119m1200\u001b[0m\r\n 25 \u001b[0m\u001b[38;2;224;222;244mcache_dir\u001b[0m = \u001b[0m\u001b[38;2;246;193;119m\"\"\u001b[0m \r\n 26 \u001b[0m\u001b[38;2;224;222;244mimage_delay\u001b[0m = \u001b[0m\u001b[38;2;246;193;119m30\u001b[0m\r\n 27 \u001b[0m\u001b[38;2;224;222;244mimage_filter\u001b[0m = \u001b[0m\u001b[38;2;246;193;119m\"triangle\"\u001b[0m\r\n 28 \u001b[0m\u001b[38;2;224;222;244mimage_quality\u001b[0m = \u001b[0m\u001b[38;2;246;193;119m75\u001b[0m\r\n 29 \u001b[0m\u001b[38;2;224;222;244mueberzug_scale\u001b[0m = \u001b[0m\u001b[38;2;246;193;119m1\u001b[0m\r\n 30 \u001b[0m\u001b[38;2;224;222;244mueberzug_offset\u001b[0m = [\u001b[0m\u001b[38;2;246;193;119m0\u001b[0m, \u001b[0m\u001b[38;2;246;193;119m0\u001b[0m, \u001b[0m\u001b[38;2;246;193;119m0\u001b[0m, \u001b[0m\u001b[38;2;246;193;119m0\u001b[0m]\r\n 31 \r\n 32 \u001b[0m\u001b[1m\u001b[38;2;156;207;216m[opener]\u001b[0m\r\n\u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;234;154;151m NORMAL \u001b[0m\u001b[38;2;234;154;151m\u001b[48;2;57;53;82m  main \u001b[0m\u001b[38;2;156;207;216m\u001b[48;2;57;53;82m +25 \u001b[0m\u001b[38;2;234;154;151m\u001b[48;2;57;53;82m~6 \u001b[0m\u001b[38;2;235;111;146m\u001b[48;2;57;53;82m-1 \u001b[0m\u001b[38;2;57;53;82m\u001b[48;2;42;39;63m\u001b[0m\u001b[38;2;224;222;244m\u001b[48;2;42;39;63m yazi.toml \u001b[0m\u001b[38;2;57;53;82m\u001b[48;2;42;39;63m\u001b[0m\u001b[38;2;234;154;151m\u001b[48;2;57;53;82m 1% \u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;234;154;151m 7:10 \u001b[0m",
"lines": 34
}
}
},
{
"panes": {
"10": {
"ansi": "\u001b[0m\u001b[38;5;167m┌─ album artists ───┐\u001b[0m\u001b[38;5;251m┌─ tracks (sorted by album) ───────────────────────────────────┐\u001b[0m\r\n\u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;0m\u001b[48;5;185mBon Iver \u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m│\u001b[0m\u001b[38;5;148m22, a Million - 34:10 \u001b[0m\u001b[7m\u001b[38;5;251m \u001b[0m\r\n\u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251mBon Iver & Daniel..\u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m│\u001b[0m\u001b[38;5;0m\u001b[48;5;185m 1 22 (OVER S∞∞N)\u001b[0m\u001b[48;5;185m \u001b[0m\u001b[38;5;0m\u001b[48;5;185m2:48 Bon Iver \u001b[0m\u001b[38;5;251m│\u001b[0m\r\n\u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251mBon Iver & Dijon ..\u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m│ 2 10 d E A T h b R E a s T ⚄ ⚄ 2:24 Bon Iver │\u001b[0m\r\n\u001b[0m\u001b[38;5;167m│ │\u001b[0m\u001b[38;5;251m│ 3 715 - CR∑∑KS 2:12 Bon Iver │\u001b[0m\r\n\u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m \u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m│ 4 33 “GOD” 3:33 Bon Iver │\u001b[0m\r\n\u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m \u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m│ 5 29 #Strafford APTS 4:05 Bon Iver │\u001b[0m\r\n\u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m \u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m│ 6 666 ʇ 4:12 Bon Iver │\u001b[0m\r\n\u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m \u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m│ 7 21 M◊◊N WATER 3:08 Bon Iver │\u001b[0m\r\n\u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m \u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m│ 8 8 (circle) 5:09 Bon Iver │\u001b[0m\r\n\u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m \u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m│ 9 ____45_____ 2:46 Bon Iver │\u001b[0m\r\n\u001b[0m\u001b[38;5;167m│ │\u001b[0m\u001b[38;5;251m│ 10 00000 Million 3:53 Bon Iver │\u001b[0m\r\n\u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m \u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m│\u001b[0m\u001b[38;5;148mBon Iver, Bon Iver - 39:30 \u001b[0m\u001b[38;5;251m│\u001b[0m\r\n\u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m \u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m│ 1 Perth 4:22 Bon Iver │\u001b[0m\r\n\u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m \u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m│ 2 Minnesota, WI 3:53 Bon Iver │\u001b[0m\r\n\u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m \u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m│ 3 Holocene 5:37 Bon Iver │\u001b[0m\r\n\u001b[0m\u001b[38;5;167m│ │\u001b[0m\u001b[38;5;251m│ 4 Towers 3:08 Bon Iver │\u001b[0m\r\n\u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m \u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m│ 5 Michicant 3:46 Bon Iver │\u001b[0m\r\n\u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m \u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m│ 6 Hinnom, TX 2:45 Bon Iver │\u001b[0m\r\n\u001b[0m\u001b[38;5;167m│ │\u001b[0m\u001b[38;5;251m│ 7 Wash. 4:59 Bon Iver │\u001b[0m\r\n\u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m \u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m│ 8 Calgary 4:10 Bon Iver │\u001b[0m\r\n\u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m \u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m│ 9 Lisbon, OH 1:33 Bon Iver │\u001b[0m\r\n\u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m \u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m│ 10 Beth/Rest 5:17 Bon Iver │\u001b[0m\r\n\u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m \u001b[0m\u001b[38;5;167m│\u001b[0m\u001b[38;5;251m│\u001b[0m\Line truncated
"lines": 35
},
"9": {
"1": {
"ansi": "\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": 2
}
}
},
{
"panes": {
"11": {
"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;224;222;244m\u001b[48;2;42;39;63m O Jenny Quénard <jenny@jennyquenard.com> Ice Baths @ Heal Play Love // Your gifts as promised :) 12:50\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 424 / 561\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 Ollama <hello@ollama.com> GLM 5.3 & 5.3 Flash models are now available 03:30\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 Ollama <no-reply@mail.ollama.com> Complete code challenge Aug 28\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;54mEverything 594 / 929\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 Oa Noah Zollinger <info@noahzollinger.com> [This full moon] The power of the group field Aug 27\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;54mFinance 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 Ashton <meganashton@gmail.com> Your Friendly Tuition Reminder 🐖 Aug 27\u001b[0m\u001b[38;2;35;33;54m\u001b[48;2;110;106;134m \u001b[0m\r\n\u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;234;154;151mInbox 149 / 305\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 Ollama <hello@ollama.com> Ollama weekly usage at 90% Aug 27\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 Ollama <hello@ollama.com> Claude Desktop support with Ollama Aug 26\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 TCS Camping <camping@camping-news.tcs.ch> Wo geht Ihr nächstes Camping-Abenteuer hin? ⛺ Aug 26\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 Ollama <no-reply@mail.ollama.com> Complete code challenge Aug 26\u001b[0m \r\n\u001b[0m\u001b[38;2;156;207;216m\u001b[48;2;35;33;54mStarred 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 Ollama <hello@ollama.com> Ollama session usage at 90% Aug 26\u001b[0m \r\n\u001b[0m\u001b[38;2;156;207;216m\u001b[48;2;35;33;54m+Time 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 Ollama <hello@ollama.com> Ollama session usage at 90% Aug 25\u001b[0m \r\n\u001b[0m\u001b[38;2;156;207;216m\u001b[48;2;35;33;54mUnread 573 / 573\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 Ollama <no-reply@mail.ollama.com> Complete code challenge Aug 24\u001b[0m \r\n\u001b[0m\u001b[38;2;156;Line truncated
"lines": 37
}
}
}
]
},
@@ -41,13 +17,65 @@
"tabs": [
{
"panes": {
"12": {
"ansi": "\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;4m \u001b[0m\u001b[38;2;158;158;158m \u001b[0m\u001b[38;5;4mautobook\u001b[0m\u001b[3m\u001b[38;5;4m -> /mnt\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 .crew \u001b[0m\u001b[38;5;4m\u001b[0m\u001b[38;5;7m│ \u001b[0mNo items\r\n \u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4mbak \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;4m.git \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \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/ss\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;4maerc \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \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/fla\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;4mansible \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;158;158;158m \u001b[0m\u001b[38;5;4mconsume_liph\u001b[0m\u001b[3m\u001b[38;5;4m -> \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;4matuin \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;0;188;212m \u001b[0m\u001b[38;5;4mDesktop \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;4mbackgrounds \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \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\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4mgarmin \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4mdot_omerx \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;4mghostty \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;4m\u001b[0m\u001b[7m\u001b[38;5;4m dotfiles \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;4mherdr \u001b[0m\u001b[38;5;3m \u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \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\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4mherdr_1 \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4mgarmin_device \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;4mhypr \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4mgo \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;4mkanata \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4mMail \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;4mkitty \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;0;188;212m \u001b[0m\u001b[38;5;4mMusic \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;4mniri \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4mnetbox-docker \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;4mnushell \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4mparu \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;4mnvim Line truncated
"lines": 35
"11": {
"ansi": "\u001b[0m\u001b[38;5;5march liph \u001b[0m\u001b[38;5;4m/mnt/tank/cloud_phil/consume/paint/invoices\u001b[0m\r\n\u001b[0m\u001b[38;5;5m❯\u001b[0m ",
"lines": 2
},
"13": {
"ansi": "╭─[1]─Status─────────────────────────╮╮\r\n│\u001b[0m\u001b[38;5;2m✓ \u001b[0mdotfiles → 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[38;5;10m\u001b[48;5;4m▼\u001b[0m\u001b[1m\u001b[48;5;4m \u001b[0m\u001b[1m\u001b[38;5;10m\u001b[48;5;4m/\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\u001b[38;5;2m▼ ClipCascade \u001b[0m\u001b[1m\u001b[38;5;2m▐\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│ \u001b[0m\u001b[38;5;2mD LICENSE \u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│ \u001b[0m\u001b[38;5;2m▼ cli \u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│ \u001b[0m\u001b[38;5;2mD echo.py \u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│ \u001b[0m\u001b[38;5;2mD info.py \u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│ \u001b[0m\u001b[38;5;2mD login.py \u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│ \u001b[0m\u001b[38;5;2mD message_box.py \u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│ \u001b[0m\u001b[38;5;2mD tray.py \u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│ \u001b[0m\u001b[38;5;2m▼ clipboard \u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│ \u001b[0m\u001b[38;5;2mD clipboard_manager.py \u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m│ \u001b[0m\u001b[38;5;2mD clipboard_monitor_linux.py \u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m╰────────────────────────────1 of 75─╯\u001b[0m│\r\n╭─[3]─\u001b[0m\u001b[38;5;2mLocal branches \u001b[0m- Remotes - Tag─╮│\r\n│\u001b[0m\u001b[38;5;2m * \u001b[0mmain \u001b[0m\u001b[38;5;2m✓ \u001b[0m││\r\n│\u001b[0m\u001b[38;5;6m1M \u001b[0mtest (worktree) ││\r\n│ ││\r\n│ ││\r\n│ ││\r\n╰─────────────────────────────1 of 2─╯│\r\n╭─[4]─\u001b[0m\u001b[38;5;2mCommits \u001b[0m- Reflog───────────────╮│\r\n│\u001b[0m\u001b[38;5;2m4ff0615b \u001b[0m\u001b[38;2;221;12;75mli ○ \u001b[0mupdated yazi ▐│\r\n│\u001b[0m\u001b[38;5;2m81aa62d9 \u001b[0m\u001b[38;2;221;12;75mli ○ \u001b[0mupdated yazi config ││\r\n│\u001b[0m\u001b[38;5;2m6868bb0f \u001b[0m\u001b[38;2;221;12;75mli ○ \u001b[0mupdated yazi config ││\r\n│\u001b[0m\u001b[38;5;2ma8a1b5a7 \u001b[0m\u001b[38;2;221;12;75mli ○ \u001b[0mrestertet yazi setup ││\r\n│\u001b[0m\u001b[38;5;2md6fd64c8 \u001b[0m\u001b[38;2;221;12;75mli ○ \u001b[0madd lxc-update ││\r\n╰────────────────────────────1 of 70─╯╯\r\n╭─[5]─Stash──────────────────────────╮╮\r\n│\u001b[0m\u001b[38;5;6m23h \u001b[0mWIP on main: d6fd64c add lxc-upd││\r\n╰─────────────────────────────1 of 8─╯╯\r\n\u001b[0m\u001b[38;5;4mStage: <spac \u001b[0m\u001b[4m\u001b[38;5;5mDonate \u001b[0m\u001b[4m\u001b[38;5;3mAsk Question \u001b[0m0.63.0",
"lines": 35
"3": {
"ansi": "\r\n\u001b[0m\u001b[38;5;5march liph \u001b[0m\u001b[38;5;4m~/cloud/consume/paint/invoices\u001b[0m\r\n\u001b[0m\u001b[38;5;5m❯\u001b[0m ",
"lines": 3
}
}
},
{
"panes": {
"5": {
"ansi": "\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 freecad\r\n[sudo] password for liph: \r\nSorry, try again.\r\n[sudo] password for liph: \r\nresolving dependencies...\r\nlooking for conflicting packages...\r\n\r\n\u001b[0m\u001b[1mPackages (30)\u001b[0m coin\u001b[0m\u001b[38;5;243m-1:4.0.10-1\u001b[0m gumbo-parser\u001b[0m\u001b[38;5;243m-0.13.2-1\u001b[0m libspnav\u001b[0m\u001b[38;5;243m-1.2-1\u001b[0m\r\n litehtml\u001b[0m\u001b[38;5;243m-0.10-1\u001b[0m med\u001b[0m\u001b[38;5;243m-5.0.0-4\u001b[0m opencascade\u001b[0m\u001b[38;5;243m-1:7.9.3-3\u001b[0m\r\n pybind11\u001b[0m\u001b[38;5;243m-3.1.0-1\u001b[0m pyside6\u001b[0m\u001b[38;5;243m-6.11.2-1\u001b[0m\r\n python-contourpy\u001b[0m\u001b[38;5;243m-1.4.0-1\u001b[0m python-cycler\u001b[0m\u001b[38;5;243m-0.12.1-4\u001b[0m\r\n python-defusedxml\u001b[0m\u001b[38;5;243m-0.7.1-8\u001b[0m python-filelock\u001b[0m\u001b[38;5;243m-3.31.2-1\u001b[0m\r\n python-fonttools\u001b[0m\u001b[38;5;243m-4.66.1-1\u001b[0m python-kiwisolver\u001b[0m\u001b[38;5;243m-1.5.1-1\u001b[0m\r\n python-matplotlib\u001b[0m\u001b[38;5;243m-3.11.2-1\u001b[0m python-pillow\u001b[0m\u001b[38;5;243m-12.3.0-1\u001b[0m\r\n python-pip\u001b[0m\u001b[38;5;243m-26.2.1-1\u001b[0m python-pivy\u001b[0m\u001b[38;5;243m-1:0.6.11-2\u001b[0m\r\n python-ply\u001b[0m\u001b[38;5;243m-3.11-17\u001b[0m python-pyparsing\u001b[0m\u001b[38;5;243m-3.3.3-1\u001b[0m\r\n python-yaml\u001b[0m\u001b[38;5;243m-6.0.3-2\u001b[0m qhull\u001b[0m\u001b[38;5;243m-2020.2-6\u001b[0m\r\n qt6-tools\u001b[0m\u001b[38;5;243m-6.11.2-1\u001b[0m shiboken6\u001b[0m\u001b[38;5;243m-6.11.2-1\u001b[0m soqt\u001b[0m\u001b[38;5;243m-1.6.4-2\u001b[0m\r\n tcl\u001b[0m\u001b[38;5;243m-8.6.16-1\u001b[0m tk\u001b[0m\u001b[38;5;243m-8.6.16-1\u001b[0m xerces-c\u001b[0m\u001b[38;5;243m-3.3.0-4\u001b[0m\r\n yaml-cpp\u001b[0m\u001b[38;5;243m-0.9.0-1\u001b[0m freecad\u001b[0m\u001b[38;5;243m-1.1.4-1\u001b[0m\r\n\r\n\u001b[0m\u001b[1mTotal Download Size: \u001b[0m 165.09 MiB\r\n\u001b[0m\u001b[1mTotal Installed Size:\u001b[0m 704.81 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 python-matplotli... 7.0 MiB 4.90 MiB/s 00:01 [-----------] 100%\r\n pyside6-6.11.2-1... 9.1 MiB 6.28 MiB/s 00:01 [-----------] 100%\r\n python-fonttools... 3.1 MiB 3.35 MiB/s 00:01 [-----------] 100%\r\n qt6-tools-6.11.2... 6.6 MiB 2.20 MiB/s 00:03 [-----------] 100%\r\n python-pip-26.2.... 2.8 MiB 3.30 MiB/s 00:01 [-----------] 100%\r\n coin-1:4.0.10-1-... 5.2 MiB 2.58 MiB/s 00:02 [-----------] 100%\r\n python-pivy-1:0.6.11-2-x86_64 2013.9 KiB 2.37 MiB/s 00:01 [-------------------------------------------------] 100%\r\n med-5.0.0-4-x86_64 1569.0 KiB 1235 KiB/s 00:01 [-------------------------------------------------] 100%\r\n xerces-c-3.3.0-4-x86_64 1452.9 KiB 1106 KiB/s 00:01 [-------------------------------------------------] 100%\r\n qhull-2020.2-6-x86_64 1280.5 KiB 1803 KiB/s 00:01 [-------------------------------------------------] 100%\r\n python-pillow-12.3.0-1-x86_64 954.5 KiB 3.54 MiB/s 00:00 [-------------------------------------------------] 100%\r\n litehtml-0.10-1-x86_64 501.3 KiB 2.83 MiB/s 00:00 [-------------------------------------------------] 100%\r\n shiboken6-6.11.2-1-x86_64 306.1 KiB 2.55 MiB/s 00:00 [-------------------------------------------------] 100%\r\n python-contourpy-1.4.0-1-x86_64 272.5 KiB 2.58 MiB/s 00:00 [-------------------------------------------------] 100%\r\n python-pyparsing-3.3.3-1-any 264.4 KiB 2.44 MiB/s 00:00 [-------------------------------------------------] 100%\r\n pybind11-3.1.0-1-any 239.5 KiB 2.13 MiB/s 00:00 [-------------------------------------------------] 100%\r\n python-yaml-6.0.3-2-x86_64 198.3 KiB 2.51 MiB/s 00:00 [-------------------------------------------------] 100%\r\n python-filelock-3.31.2-1-any 197.4 KiB 2035 KiB/s 00:00 [-------------------------------------------------] 100%\r\n yaml-cpp-0.9.0-1-x86_64 153.0 KiB 2.05 MiB/s 00:00 [-------------------------------------------------] 100%\r\n gumbo-parser-0.13.2-1-x86_64 126.9 KiB 1813 KiB/s 00:00 [-------------------------------------------------] 100%\r\n python-ply-3.11-17-Line truncated
"lines": 183
},
"4": {
"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": 3
}
}
},
{
"panes": {
"6": {
"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;224;222;244m\u001b[48;2;42;39;63m O Megan <notifications@courses.ruzuku.… Payment receipt for Unity Tuition Payments & Plans 00:10\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[1m\u001b[38;2;224;222;244m\u001b[48;2;42;39;63m O HealPlayLove Connected <no-reply@not… This week on HealPlayLove Connected: September 24 - Octo… Oct 01\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[1m\u001b[38;2;35;33;54m\u001b[48;2;234;154;151m Ollama <hello@ollama.com> Ollama now supports Jev-like decision models Sep 30\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 Heal Play Love <hello@healplaylove.c… Who brings out the best in you? Sep 29\u001b[0m \r\n\u001b[0m\u001b[38;2;156;207;216m\u001b[48;2;35;33;54mEverything 655 / 1.0K\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@not… New event: Community Dinner incl Cacao Ceremony in Basel Sep 29\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 HealPlayLove Connected <no-reply@not… ✨ Save the date: Community Dinner in Basel Sep 29\u001b[0m \r\n\u001b[0m\u001b[1m\u001b[38;2;35;33;54m\u001b[48;2;234;154;151mInbox 172 / 346\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@unive… Clara Sophia, Laura Misch, YAIMA & die schönsten Bilder … Sep 29\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 HealPlayLove Connected <no-reply@not… Daily breathwork practice Sep 29\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 Megan Ashton <meganashton@gmail.com> Your Friendly Tuition Reminder 🐖 Sep 28\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[38;2;110;106;134m\u001b[48;2;42;39;63m HealPlayLove Connected <no-reply@not… Be there for Endings & Beginnings: A Breathwork Journey … Sep 28\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 HealPlayLove Connected <no-reply@not… New event: Endings & Beginnings: A Breathwork Journey fo… Sep 28\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 Breathing Space <notifications@train… Join Now: September: Sunday Sessions is starting Sep 27\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[1m\u001b[38;2;224;222;244m\u001b[48;2;42;39;63m O Breathing Space <notifications@train… Your live breathwork with Benedict is starting in an hour Sep 27\u001b[0m \r\n\u001b[0m\u001b[38;2;156;207;216m\u001b[48;2;35;33;54mPriority2 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 HLine truncated
"lines": 41
}
}
}
]
},
{
"tabs": [
{
"panes": {
"7": {
"ansi": "\u001b[0m\u001b[38;5;6m~/dotfiles\u001b[0m\r\n \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[7m\u001b[38;5;4m .git \u001b[0m\u001b[38;5;4m\u001b[0m\u001b[38;5;7m│ \u001b[0mNo items\r\n \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[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4maerc \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \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[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4mansible \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \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[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4matuin \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \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[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4mbackgrounds \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \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[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4mgarmin \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \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[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4mghostty \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \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[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4mherdr \u001b[0m\u001b[38;5;3m \u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \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[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4mhypr \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \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[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4mkanata \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4m.password-s… \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;4mkitty \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \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 -> dotf\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;4mniri \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \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[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4mnushell \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \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[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4mnvim \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \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 -> dot\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;4mohmyposh \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \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[38;5;4m \u001b[0m\u001b[38;2;3;169;244m \u001b[0m\u001b[38;5;4mopencode \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \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 -\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;4mpi \u001b[0m\u001b[38;5;7m│\u001b[0m\r\n \u001b[0m\u001b[38;5;4m \u001b[0m\u001b[38;2Line truncated
"lines": 39
},
"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[1m\u001b[48;5;4m▼ 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 \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 \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 \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 \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 \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 \u001b[0m\u001b[1m\u001b[38;5;2m│\u001b[0m│\r\n\u001b[0m\u001b[1m\u001b[38;5;2m╰──────────────────────────────1 of 3─╯\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│ ││\r\n╰──────────────────────────────1 of 1─╯│\r\n╭─[4]─\u001b[0m\u001b[38;5;2mCommits \u001b[0m- Reflog────────────────╮│\r\n│\u001b[0m\u001b[38;5;2m71b27f5a\u001b[0m \u001b[0m\u001b[38;2;36;244;94mli\u001b[0m \u001b[0m\u001b[38;2;36;244;94m○\u001b[0m updated kitty/ghostty e▐│\r\n│\u001b[0m\u001b[38;5;2m6079f663\u001b[0m \u001b[0m\u001b[38;2;36;244;94mli\u001b[0m \u001b[0m\u001b[38;2;36;244;94m○\u001b[0m updated everything ││\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╰─────────────────────────────1 of 80─╯╯\r\n╭─[5]─Stash───────────────────────────╮╮\r\n│\u001b[0m\u001b[38;5;6m3w\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",
"lines": 39
}
}
}
]
},
{
"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 ",
"lines": 2
},
"9": {
"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 ",
"lines": 2
}
}
}
+113 -40
View File
@@ -2,17 +2,47 @@
"version": 3,
"workspaces": [
{
"id": "w4",
"custom_name": "Home",
"identity_cwd": "/home",
"id": "w1",
"custom_name": null,
"identity_cwd": "/home/liph",
"public_pane_numbers": {
"8": 2,
"10": 4,
"7": 1,
"11": 5,
"9": 3
"1": 1
},
"next_public_pane_number": 6,
"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": "w2",
"custom_name": "Home",
"identity_cwd": "/mnt/tank/cloud_phil/consume/paint/invoices",
"public_pane_numbers": {
"4": 3,
"5": 4,
"3": 2,
"11": 6,
"6": 5
},
"next_public_pane_number": 7,
"public_tab_numbers": [
1,
2,
@@ -27,24 +57,24 @@
"direction": "Horizontal",
"ratio": 0.5,
"first": {
"Pane": 7
"Pane": 3
},
"second": {
"Pane": 8
"Pane": 11
}
}
},
"panes": {
"7": {
"cwd": "/home"
"11": {
"cwd": "/mnt/tank/cloud_phil/consume/paint/invoices"
},
"8": {
"cwd": "/home/liph/dotfiles/yazi/.config/yazi"
"3": {
"cwd": "/mnt/tank/cloud_phil/consume/paint/invoices"
}
},
"zoomed": false,
"focused": 7,
"root_pane": 7
"focused": 3,
"root_pane": 3
},
{
"custom_name": "Music",
@@ -53,49 +83,49 @@
"direction": "Horizontal",
"ratio": 0.5,
"first": {
"Pane": 9
"Pane": 4
},
"second": {
"Pane": 10
"Pane": 5
}
}
},
"panes": {
"9": {
"5": {
"cwd": "/home/liph"
},
"10": {
"4": {
"cwd": "/home/liph"
}
},
"zoomed": false,
"focused": 9,
"root_pane": 9
"focused": 5,
"root_pane": 4
},
{
"custom_name": "Aerc",
"layout": {
"Pane": 11
"Pane": 6
},
"panes": {
"11": {
"6": {
"cwd": "/home/liph"
}
},
"zoomed": false,
"focused": 11,
"root_pane": 11
"focused": 6,
"root_pane": 6
}
],
"active_tab": 0
"active_tab": 1
},
{
"id": "w5",
"id": "w3",
"custom_name": "Dotfiles",
"identity_cwd": "/home/liph/dotfiles",
"public_pane_numbers": {
"13": 2,
"12": 1
"7": 1,
"10": 2
},
"next_public_pane_number": 3,
"public_tab_numbers": [
@@ -108,17 +138,20 @@
"layout": {
"Split": {
"direction": "Horizontal",
"ratio": 0.7613636,
"ratio": 0.71034485,
"first": {
"Pane": 12
"Pane": 7
},
"second": {
"Pane": 13
"Pane": 10
}
}
},
"panes": {
"13": {
"7": {
"cwd": "/home/liph/dotfiles"
},
"10": {
"cwd": "/home/liph/dotfiles",
"label": "Git",
"launch_argv": [
@@ -126,14 +159,54 @@
"-c",
"exec bash \"$HERDR_PLUGIN_ROOT/scripts/run-lazygit.sh\""
]
},
"12": {
"cwd": "/home/liph/dotfiles"
}
},
"zoomed": false,
"focused": 13,
"root_pane": 12
"focused": 10,
"root_pane": 7
}
],
"active_tab": 0
},
{
"id": "w4",
"custom_name": "Coding",
"identity_cwd": "/mnt/tank/code",
"public_pane_numbers": {
"9": 2,
"8": 1
},
"next_public_pane_number": 3,
"public_tab_numbers": [
1
],
"next_public_tab_number": 2,
"tabs": [
{
"custom_name": "Pi",
"layout": {
"Split": {
"direction": "Horizontal",
"ratio": 0.5,
"first": {
"Pane": 8
},
"second": {
"Pane": 9
}
}
},
"panes": {
"9": {
"cwd": "/mnt/tank/code"
},
"8": {
"cwd": "/mnt/tank/code"
}
},
"zoomed": false,
"focused": 8,
"root_pane": 8
}
],
"active_tab": 0
Submodule herdr_1/.config/herdr/plugins/.tmp-install-750065-1785311987680/checkout deleted from 5f76bc9eab.
Submodule herdr_1/.config/herdr/plugins/github/herdr-bar-96eebe452a9c deleted from 58c23e5c8d.
Submodule herdr_1/.config/herdr/plugins/github/herdr-lazygit-b11d62e75f78 deleted from a13e12c99e.
Submodule herdr_1/.config/herdr/plugins/github/herdr-spreader-f248c87aa2e2 deleted from 5f76bc9eab.
Submodule herdr_1/.config/herdr/plugins/github/herdr-zoxide-f7b96c313637 deleted from 7be842fe84.
Submodule herdr_1/.config/herdr/plugins/github/osamahbeig.pane-mover-d60fe0209b83 deleted from a9fde7a4f9.
Submodule herdr_1/.config/herdr/plugins/github/sessionizer-66e03d1ff740 deleted from d3476681fe.
+1 -1
View File
@@ -2,7 +2,7 @@ source = /home/liph/.config/hypr/mocha.conf
$accent = $mauve
$accentAlpha = $mauveAlpha
$font = Inconsolata Nerd Font
$font = JetBrainsMono Nerd Font
# GENERAL
general {
+28
View File
@@ -0,0 +1,28 @@
;; defsrc is still necessary
(defcfg
process-unmapped-keys yes
)
(defsrc
caps a s d f j k l ;
)
(defvar
tap-time 250
hold-time 250
)
(defalias
escctrl (tap-hold 250 250 esc lctrl)
a (tap-hold $tap-time $hold-time a lmet)
s (tap-hold $tap-time $hold-time s lalt)
d (tap-hold $tap-time $hold-time d lsft)
f (tap-hold $tap-time $hold-time f lctl)
j (tap-hold $tap-time $hold-time j rctl)
k (tap-hold $tap-time $hold-time k rsft)
l (tap-hold $tap-time $hold-time l ralt)
; (tap-hold $tap-time $hold-time ; rmet)
)
(deflayer base
@escctrl @a @s @d @f @j @k @l @;
)
+83
View File
@@ -0,0 +1,83 @@
;; defsrc is still necessary
(defcfg
process-unmapped-keys yes
)
(defsrc
caps a s d f h j k l ; v c u i o
)
(defvar
tap-time 250
hold-time 250
mm-interval 10 ;; ms between pointer moves
mm-accel 1000 ;; ms to ramp from slow start to full speed
mm-min 2 ;; px per move at start (precision)
mm-max 20 ;; px per move at full speed
)
(defalias
escctrl (tap-hold 250 250 esc lctrl)
a (tap-hold $tap-time $hold-time a lmet)
s (tap-hold $tap-time $hold-time s lalt)
d (tap-hold $tap-time $hold-time d lsft)
f (tap-hold $tap-time $hold-time f lctl)
j (tap-hold $tap-time $hold-time j rctl)
k (tap-hold $tap-time $hold-time k rsft)
l (tap-hold $tap-time $hold-time l ralt)
; (tap-hold $tap-time $hold-time ; rmet)
;; hold v = pointer layer, tap v = v
ptr (layer-while-held pointer)
v (tap-hold $tap-time $hold-time v @ptr)
;; hold c = scroll layer, tap c = c
scl (layer-while-held scroll)
c (tap-hold $tap-time $hold-time c @scl)
;; pointer movement (accelerating: precise at first, fast when held)
plft (movemouse-accel-left $mm-interval $mm-accel $mm-min $mm-max)
pdn (movemouse-accel-down $mm-interval $mm-accel $mm-min $mm-max)
pup (movemouse-accel-up $mm-interval $mm-accel $mm-min $mm-max)
prgt (movemouse-accel-right $mm-interval $mm-accel $mm-min $mm-max)
;; scrolling (50 = ms between scrolls · 120 = distance, one wheel notch)
sclu (mwheel-up 50 120)
scld (mwheel-down 50 120)
scll (mwheel-left 50 120)
sclr (mwheel-right 50 120)
)
(deflayer base
@escctrl @a @s @d @f h @j @k @l @; @v @c u i o
)
(deflayer pointer
_ ;; caps — transparent → stays esc/ctrl
_ ;; a
_ ;; s
_ ;; d
_ ;; f
@plft ;; h = move left
@pdn ;; j = move down
@pup ;; k = move up
@prgt ;; l = move right
_ ;; ;
_ ;; v
_ ;; c
mlft ;; u = left click (held while pressed → drag works)
mmid ;; i = middle click
mrgt ;; o = right click
)
(deflayer scroll
_ ;; caps
_ ;; a
_ ;; s
_ ;; d
_ ;; f
@scll ;; h = scroll left
@scld ;; j = scroll down
@sclu ;; k = scroll up
@sclr ;; l = scroll right
_ ;; ;
_ ;; v
_ ;; c
mlft ;; u = left click
mmid ;; i = middle click
mrgt ;; o = right click
)
+72 -5
View File
@@ -2,15 +2,17 @@
(defcfg
process-unmapped-keys yes
)
(defsrc
caps a s d f j k l ;
caps a s d f h j k l ; v c b u i o m n
)
(defvar
tap-time 250
hold-time 250
mm-interval 10 ;; ms between pointer moves
mm-accel 1000 ;; ms to ramp from slow start to full speed
mm-min 2 ;; px per move at start (precision)
mm-max 20 ;; px per move at full speed
)
(defalias
escctrl (tap-hold 250 250 esc lctrl)
a (tap-hold $tap-time $hold-time a lmet)
@@ -21,8 +23,73 @@
k (tap-hold $tap-time $hold-time k rsft)
l (tap-hold $tap-time $hold-time l ralt)
; (tap-hold $tap-time $hold-time ; rmet)
)
;; hold v = pointer layer, tap v = v
ptr (layer-while-held pointer)
v (tap-hold $tap-time $hold-time v @ptr)
;; hold c = scroll layer, tap c = c
scl (layer-while-held scroll)
c (tap-hold $tap-time $hold-time c @scl)
;; one-shot copy: taps and releases Ctrl+C (pointer layer m and ; fallback)
copy (multi lctl c)
;; cut: taps and releases Ctrl+X (pointer layer n)
cut (multi lctl x)
;; pointer movement (accelerating: precise at first, fast when held)
plft (movemouse-accel-left $mm-interval $mm-accel $mm-min $mm-max)
pdn (movemouse-accel-down $mm-interval $mm-accel $mm-min $mm-max)
pup (movemouse-accel-up $mm-interval $mm-accel $mm-min $mm-max)
prgt (movemouse-accel-right $mm-interval $mm-accel $mm-min $mm-max)
;; scrolling (50 = ms between scrolls · 120 = distance, one wheel notch)
sclu (mwheel-up 50 120)
scld (mwheel-down 50 120)
scll (mwheel-left 50 120)
sclr (mwheel-right 50 120)
)
(deflayer base
@escctrl @a @s @d @f @j @k @l @;
@escctrl @a @s @d @f h @j @k @l @; @v @c b u i o m n
)
(deflayer pointer
_ ;; caps — transparent → stays esc/ctrl
_ ;; a
_ ;; s
mlft ;; d = left click hold (mark/drag)
_ ;; f = transparent → Ctrl
@plft ;; h = move left
@pdn ;; j = move down
@pup ;; k = move up
@prgt ;; l = move right
@copy ;; ; = one-shot copy (fallback)
_ ;; v
_ ;; c
_ ;; b
mlft ;; u = left click
mmid ;; i = middle click
mrgt ;; o = right click
@copy ;; m = copy (Ctrl+C)
@cut ;; n = cut (Ctrl+X)
)
(deflayer scroll
_ ;; caps
_ ;; a
_ ;; s
_ ;; d
_ ;; f
@scll ;; h = scroll left
@scld ;; j = scroll down
@sclu ;; k = scroll up
@sclr ;; l = scroll right
_ ;; ;
_ ;; v
_ ;; c
_ ;; b
mlft ;; u = left click
mmid ;; i = middle click
mrgt ;; o = right click
_ ;; m = plain m
_ ;; n = plain n
)
+83
View File
@@ -0,0 +1,83 @@
;; defsrc is still necessary
(defcfg
process-unmapped-keys yes
)
(defsrc
caps a s d f h j k l ; v c u i o
)
(defvar
tap-time 250
hold-time 250
mm-interval 10 ;; ms between pointer moves
mm-accel 1000 ;; ms to ramp from slow start to full speed
mm-min 2 ;; px per move at start (precision)
mm-max 20 ;; px per move at full speed
)
(defalias
escctrl (tap-hold 250 250 esc lctrl)
a (tap-hold $tap-time $hold-time a lmet)
s (tap-hold $tap-time $hold-time s lalt)
d (tap-hold $tap-time $hold-time d lsft)
f (tap-hold $tap-time $hold-time f lctl)
j (tap-hold $tap-time $hold-time j rctl)
k (tap-hold $tap-time $hold-time k rsft)
l (tap-hold $tap-time $hold-time l ralt)
; (tap-hold $tap-time $hold-time ; rmet)
;; hold v = pointer layer, tap v = v
ptr (layer-while-held pointer)
v (tap-hold $tap-time $hold-time v @ptr)
;; hold c = scroll layer, tap c = c
scl (layer-while-held scroll)
c (tap-hold $tap-time $hold-time c @scl)
;; pointer movement (accelerating: precise at first, fast when held)
plft (movemouse-accel-left $mm-interval $mm-accel $mm-min $mm-max)
pdn (movemouse-accel-down $mm-interval $mm-accel $mm-min $mm-max)
pup (movemouse-accel-up $mm-interval $mm-accel $mm-min $mm-max)
prgt (movemouse-accel-right $mm-interval $mm-accel $mm-min $mm-max)
;; scrolling (50 = ms between scrolls · 120 = distance, one wheel notch)
sclu (mwheel-up 50 120)
scld (mwheel-down 50 120)
scll (mwheel-left 50 120)
sclr (mwheel-right 50 120)
)
(deflayer base
@escctrl @a @s @d @f h @j @k @l @; @v @c u i o
)
(deflayer pointer
_ ;; caps — transparent → stays esc/ctrl
_ ;; a
_ ;; s
_ ;; d
_ ;; f
@plft ;; h = move left
@pdn ;; j = move down
@pup ;; k = move up
@prgt ;; l = move right
_ ;; ;
_ ;; v
_ ;; c
mlft ;; u = left click (held while pressed → drag works)
mmid ;; i = middle click
mrgt ;; o = right click
)
(deflayer scroll
_ ;; caps
_ ;; a
_ ;; s
_ ;; d
_ ;; f
@scll ;; h = scroll left
@scld ;; j = scroll down
@sclu ;; k = scroll up
@sclr ;; l = scroll right
_ ;; ;
_ ;; v
_ ;; c
mlft ;; u = left click
mmid ;; i = middle click
mrgt ;; o = right click
)
+95
View File
@@ -0,0 +1,95 @@
;; defsrc is still necessary
(defcfg
process-unmapped-keys yes
)
(defsrc
caps a s d f h j k l ; v c b u i o m
)
(defvar
tap-time 250
hold-time 250
mm-interval 10 ;; ms between pointer moves
mm-accel 1000 ;; ms to ramp from slow start to full speed
mm-min 2 ;; px per move at start (precision)
mm-max 20 ;; px per move at full speed
)
(defalias
escctrl (tap-hold 250 250 esc lctrl)
a (tap-hold $tap-time $hold-time a lmet)
s (tap-hold $tap-time $hold-time s lalt)
d (tap-hold $tap-time $hold-time d lsft)
f (tap-hold $tap-time $hold-time f lctl)
j (tap-hold $tap-time $hold-time j rctl)
k (tap-hold $tap-time $hold-time k rsft)
l (tap-hold $tap-time $hold-time l ralt)
; (tap-hold $tap-time $hold-time ; rmet)
;; hold v = pointer layer, tap v = v
ptr (layer-while-held pointer)
v (tap-hold $tap-time $hold-time v @ptr)
;; hold c = scroll layer, tap c = c
scl (layer-while-held scroll)
c (tap-hold $tap-time $hold-time c @scl)
;; hold b = pointer layer, tap b = b
;; tap-hold-press: a second keypress (e.g. u) immediately selects HOLD →
;; chord-style b+u activates the pointer layer instead of typing "bu"
b (tap-hold-press $tap-time $hold-time b @ptr)
;; one-shot copy: taps and releases Ctrl+Shift+C
copy (multi lsft lctl c)
;; pointer movement (accelerating: precise at first, fast when held)
plft (movemouse-accel-left $mm-interval $mm-accel $mm-min $mm-max)
pdn (movemouse-accel-down $mm-interval $mm-accel $mm-min $mm-max)
pup (movemouse-accel-up $mm-interval $mm-accel $mm-min $mm-max)
prgt (movemouse-accel-right $mm-interval $mm-accel $mm-min $mm-max)
;; scrolling (50 = ms between scrolls · 120 = distance, one wheel notch)
sclu (mwheel-up 50 120)
scld (mwheel-down 50 120)
scll (mwheel-left 50 120)
sclr (mwheel-right 50 120)
)
(deflayer base
@escctrl @a @s @d @f h @j @k @l @; @v @c @b u i o m
)
(deflayer pointer
_ ;; caps — transparent → stays esc/ctrl
_ ;; a
_ ;; s
_ ;; d
mlft ;; f = left click hold (while b held)
@plft ;; h = move left
@pdn ;; j = move down
@pup ;; k = move up
@prgt ;; l = move right
_ ;; ;
_ ;; v
_ ;; c
_ ;; b
_ ;; u = plain u
@copy ;; i = one-shot copy (Ctrl+Shift+C)
_ ;; o = plain o
_ ;; m = plain m
)
(deflayer scroll
_ ;; caps
_ ;; a
_ ;; s
_ ;; d
_ ;; f
@scll ;; h = scroll left
@scld ;; j = scroll down
@sclu ;; k = scroll up
@sclr ;; l = scroll right
_ ;; ;
_ ;; v
_ ;; c
_ ;; b
_ ;; u = plain u
mmid ;; i = middle click
mrgt ;; o = right click
mlft ;; m = left click hold
)
+97
View File
@@ -0,0 +1,97 @@
;; defsrc is still necessary
(defcfg
process-unmapped-keys yes
)
(defsrc
caps a s d f h j k l ; v c b u i o m
)
(defvar
tap-time 250
hold-time 250
mm-interval 10 ;; ms between pointer moves
mm-accel 1000 ;; ms to ramp from slow start to full speed
mm-min 2 ;; px per move at start (precision)
mm-max 20 ;; px per move at full speed
)
(defvirtualkeys
;; copy virtual key: tapped on mark (d) release → Ctrl+C
copyvk (multi lctl c)
)
(defalias
escctrl (tap-hold 250 250 esc lctrl)
a (tap-hold $tap-time $hold-time a lmet)
s (tap-hold $tap-time $hold-time s lalt)
d (tap-hold $tap-time $hold-time d lsft)
f (tap-hold $tap-time $hold-time f lctl)
j (tap-hold $tap-time $hold-time j rctl)
k (tap-hold $tap-time $hold-time k rsft)
l (tap-hold $tap-time $hold-time l ralt)
; (tap-hold $tap-time $hold-time ; rmet)
;; hold v = pointer layer, tap v = v
ptr (layer-while-held pointer)
v (tap-hold $tap-time $hold-time v @ptr)
;; hold c = scroll layer, tap c = c
scl (layer-while-held scroll)
c (tap-hold $tap-time $hold-time c @scl)
;; one-shot copy: taps and releases Ctrl+C (pointer-layer ; fallback)
copy (multi lctl c)
;; mark: left button held while d held; on release, auto-copy selection
mark (multi mlft (on-release-fakekey copyvk tap))
;; pointer movement (accelerating: precise at first, fast when held)
plft (movemouse-accel-left $mm-interval $mm-accel $mm-min $mm-max)
pdn (movemouse-accel-down $mm-interval $mm-accel $mm-min $mm-max)
pup (movemouse-accel-up $mm-interval $mm-accel $mm-min $mm-max)
prgt (movemouse-accel-right $mm-interval $mm-accel $mm-min $mm-max)
;; scrolling (50 = ms between scrolls · 120 = distance, one wheel notch)
sclu (mwheel-up 50 120)
scld (mwheel-down 50 120)
scll (mwheel-left 50 120)
sclr (mwheel-right 50 120)
)
(deflayer base
@escctrl @a @s @d @f h @j @k @l @; @v @c b u i o m
)
(deflayer pointer
_ ;; caps — transparent → stays esc/ctrl
_ ;; a
_ ;; s
@mark ;; d = mark: left-click hold, auto-copy on release
_ ;; f = transparent → Ctrl
@plft ;; h = move left
@pdn ;; j = move down
@pup ;; k = move up
@prgt ;; l = move right
@copy ;; ; = one-shot copy (safety fallback)
_ ;; v
_ ;; c
_ ;; b
mlft ;; u = left click
mmid ;; i = middle click
mrgt ;; o = right click
_ ;; m = plain m
)
(deflayer scroll
_ ;; caps
_ ;; a
_ ;; s
_ ;; d
_ ;; f
@scll ;; h = scroll left
@scld ;; j = scroll down
@sclu ;; k = scroll up
@sclr ;; l = scroll right
_ ;; ;
_ ;; v
_ ;; c
_ ;; b
mlft ;; u = left click
mmid ;; i = middle click
mrgt ;; o = right click
_ ;; m = plain m
)
@@ -0,0 +1 @@
/usr/lib/systemd/user/protonmail-bridge.service
@@ -0,0 +1 @@
/home/liph/.config/systemd/user/swayidle.service
+1
View File
@@ -0,0 +1 @@
/home/liph/dotfiles/systemd/.config/systemd/user/mailsync-login.timer
+1
View File
@@ -0,0 +1 @@
/home/liph/dotfiles/systemd/.config/systemd/user/mailsync.service
+1
View File
@@ -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
+47 -37
View File
@@ -1,56 +1,66 @@
## name: Rosé Pine Moon
## author: mvllow
## license: MIT
## upstream: https://github.com/rose-pine/kitty/blob/main/dist/rose-pine-moon.conf
## blurb: All natural pine, faux fur and a bit of soho vibes for the classy minimalist
# https://draculatheme.com/kitty
#
# Installation instructions:
#
# cp dracula.conf ~/.config/kitty/
# echo "include dracula.conf" >> ~/.config/kitty/kitty.conf
#
# Then reload kitty for the config to take affect.
# Alternatively copy paste below directly into kitty.conf
foreground #e0def4
background #232136
selection_foreground #e0def4
selection_background #44415a
foreground #f8f8f2
background #282a36
selection_foreground #ffffff
selection_background #44475a
cursor #56526e
cursor_text_color #e0def4
url_color #c4a7e7
active_tab_foreground #e0def4
active_tab_background #393552
inactive_tab_foreground #6e6a86
inactive_tab_background #232136
active_border_color #3e8fb0
inactive_border_color #44415a
url_color #8be9fd
# black
color0 #393552
color8 #6e6a86
color0 #21222c
color8 #6272a4
# red
color1 #eb6f92
color9 #eb6f92
color1 #ff5555
color9 #ff6e6e
# green
color2 #3e8fb0
color10 #3e8fb0
color2 #50fa7b
color10 #69ff94
# yellow
color3 #f6c177
color11 #f6c177
color3 #f1fa8c
color11 #ffffa5
# blue
color4 #9ccfd8
color12 #9ccfd8
color4 #bd93f9
color12 #d6acff
# magenta
color5 #c4a7e7
color13 #c4a7e7
color5 #ff79c6
color13 #ff92df
# cyan
color6 #ea9a97
color14 #ea9a97
color6 #8be9fd
color14 #a4ffff
# white
color7 #e0def4
color15 #e0def4
color7 #f8f8f2
color15 #ffffff
# Cursor colors
cursor #f8f8f2
cursor_text_color background
# Tab bar colors
active_tab_foreground #282a36
active_tab_background #f8f8f2
inactive_tab_foreground #282a36
inactive_tab_background #6272a4
# Marks
mark1_foreground #282a36
mark1_background #ff5555
# Splits/Windows
active_border_color #f8f8f2
inactive_border_color #6272a4
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -1,5 +1,5 @@
# BEGIN_KITTY_THEME
# Gruvbox Material
# Rosé Pine Moon
include current-theme.conf
# END_KITTY_THEME
#
@@ -0,0 +1,5 @@
startgroup
animation_start cursor-trail-move
animation_stop cursor-trail-stop
shaders cursor-trail-blaze
endgroup
@@ -0,0 +1,134 @@
#language slang 2026
// Copyright (C) 2026 Kovid Goyal <kovid at kovidgoyal.net>
// Distributed under terms of the GPLv3 license.
//
// Blaze cursor trail — port of https://gist.github.com/chardskarth/95874c54e29da6b5a36ab7b50ae2d088
// by chardskarth. Draws a fading parallelogram trail from the previous cursor
// position to the current one, coloured with an amber fill and red-orange border.
// Ported to slang for kitty
import kitty_custom_shader_types;
static const float4 TRAIL_COLOR = float4(1.0, 0.725, 0.161, 1.0);
static const float4 TRAIL_COLOR_ACCENT = float4(1.0, 0.0, 0.0, 1.0);
// Trail lifetime in seconds.
static const float DURATION = 0.5;
// pow(1 - x, 10) via repeated squaring — branchless ease-out.
static float
ease_out10(float x) {
float y = 1.0 - x;
float y2 = y * y;
float y4 = y2 * y2;
return y4 * y4 * y2;
}
// Smooth blend curve for the progress value.
static float
blend_smooth(float t) {
float s = t * t;
return s / (2.0 * (s - t) + 1.0);
}
// SDF of an axis-aligned box. p = query point, center = box centre, hext = half-extents.
static float
sdBox(float2 p, float2 center, float2 hext) {
float2 d = abs(p - center) - hext;
return length(max(d, float2(0.0))) + min(max(d.x, d.y), 0.0);
}
// Single edge contribution for the quadrilateral SDF (signed winding accumulation).
static float
seg(float2 p, float2 a, float2 b, inout float s, float d) {
float2 e = b - a;
float2 w = p - a;
float2 proj = a + e * clamp(dot(w, e) / dot(e, e), 0.0, 1.0);
d = min(d, dot(p - proj, p - proj));
float c0 = step(0.0, p.y - a.y);
float c1 = 1.0 - step(0.0, p.y - b.y);
float c2 = 1.0 - step(0.0, e.x * w.y - e.y * w.x);
float allCond = c0 * c1 * c2;
float noneCond = (1.0 - c0) * (1.0 - c1) * (1.0 - c2);
s *= lerp(1.0, -1.0, step(0.5, allCond + noneCond));
return d;
}
// SDF of an arbitrary quadrilateral (uses winding number via four edge contributions).
static float
sdQuad(float2 p, float2 v0, float2 v1, float2 v2, float2 v3) {
float s = 1.0;
float d = dot(p - v0, p - v0);
d = seg(p, v0, v3, s, d);
d = seg(p, v1, v0, s, d);
d = seg(p, v2, v1, s, d);
d = seg(p, v3, v2, s, d);
return s * sqrt(d);
}
// Returns 0 for diagonal movement (up-left / down-right), 1 otherwise.
// Selects which corner of the parallelogram aligns with the movement direction.
static float
movementVertexFactor(float2 a, float2 b) {
float c1 = step(b.x, a.x) * step(a.y, b.y);
float c2 = step(a.x, b.x) * step(b.y, a.y);
return 1.0 - max(c1, c2);
}
public float4
fragment_main(float4 color, KittyTextures t, KittyCustomShaderData d) {
if (d.cursor_trail_color.a <= 0.0) return color;
float age = clamp((d.timestamp - d.cursor_trail_change_time) / DURATION, 0.0, 1.0);
if (age >= 1.0) return color;
float easedProgress = ease_out10(blend_smooth(age));
if (easedProgress <= 0.0) return color;
// Work in pixel space for correct aspect-ratio distance measurements.
float2 pixelDims = float2(d.viewport_size_pixels) * t.viewport.zw;
float2 px = t.pos * pixelDims;
// Current cursor rect in pixel space (edge: .x=left .y=right .z=top .w=bottom, y-up).
float curLeft = d.cursor_trail_edge.x * pixelDims.x;
float curRight = d.cursor_trail_edge.y * pixelDims.x;
float curTop = d.cursor_trail_edge.z * pixelDims.y;
float curBottom = d.cursor_trail_edge.w * pixelDims.y;
float curWidth = curRight - curLeft;
float curHeight = curTop - curBottom;
float2 curCenter = float2((curLeft + curRight) * 0.5, (curTop + curBottom) * 0.5);
float prevLeft = d.cursor_trail_prev_edge.x * pixelDims.x;
float prevTop = d.cursor_trail_prev_edge.z * pixelDims.y;
float prevBottom = d.cursor_trail_prev_edge.w * pixelDims.y;
float2 prevCenter = float2(
(d.cursor_trail_prev_edge.x + d.cursor_trail_prev_edge.y) * 0.5 * pixelDims.x,
(d.cursor_trail_prev_edge.z + d.cursor_trail_prev_edge.w) * 0.5 * pixelDims.y);
float lineLength = length(curCenter - prevCenter);
// Alpha fades to 0 at the previous-cursor end, reaching full effect at the current cursor.
float alphaModifier = min(length(px - curCenter) / (lineLength * easedProgress), 1.0);
// Build parallelogram vertices in pixel space.
float vf = movementVertexFactor(curCenter, prevCenter);
float ivf = 1.0 - vf;
float2 v0 = float2(lerp(curLeft, curRight, vf), curBottom);
float2 v1 = float2(lerp(curLeft, curRight, ivf), curTop);
float2 v2 = float2(prevLeft + curWidth * ivf, prevTop);
float2 v3 = float2(prevLeft + curWidth * vf, prevBottom);
float sdfCursor = sdBox(px, curCenter, float2(curWidth, curHeight) * 0.5);
float sdfTrail = sdQuad(px, v0, v1, v2, v3);
// ~2-pixel anti-aliasing range in pixel space.
float aaRange = 2.0;
float4 newColor = color;
// Inner border accent (red-orange inside the trail edges).
newColor = lerp(newColor, TRAIL_COLOR_ACCENT, 1.0 - smoothstep(sdfTrail, -aaRange, aaRange * 0.05));
// Main amber fill.
newColor = lerp(newColor, TRAIL_COLOR, 1.0 - smoothstep(0.0, aaRange, sdfTrail));
// Fade: effect is weakest toward the previous cursor end.
newColor = lerp(color, newColor, 1.0 - alphaModifier);
// Restore original pixels inside the cursor rectangle.
return lerp(newColor, color, step(sdfCursor, 0.0));
}
@@ -0,0 +1,19 @@
# Dracula purple with pink accent (default)
startgroup
var float4 TRAIL_COLOR = float4(0.51, 0.29, 0.95, 1.0)
var float4 TRAIL_COLOR_ACCENT = float4(1.00, 0.19, 0.56, 1.0)
animation_start cursor-trail-move
animation_stop cursor-trail-stop
shaders cursor-trail-blaze
endgroup
# Alternate combos (comment out the two lines above, uncomment these):
# ---- cyan + green ----
# var float4 TRAIL_COLOR = float4(0.26, 0.82, 0.98, 1.0) # #8be9fd
# var float4 TRAIL_COLOR_ACCENT = float4(0.08, 0.96, 0.20, 1.0) # #50fa7b
# ---- orange + pink ----
# var float4 TRAIL_COLOR = float4(1.00, 0.48, 0.15, 1.0) # #ffb86c
# var float4 TRAIL_COLOR_ACCENT = float4(1.00, 0.19, 0.56, 1.0) # #ff79c6
# ---- yellow + pink ----
# var float4 TRAIL_COLOR = float4(0.88, 0.96, 0.26, 1.0) # #f1fa8c
# var float4 TRAIL_COLOR_ACCENT = float4(1.00, 0.19, 0.56, 1.0) # #ff79c6
@@ -0,0 +1,19 @@
# Dracula purple with pink accent (default)
startgroup
var float4 TRAIL_COLOR = float4(0.51, 0.29, 0.95, 1.0)
var float4 TRAIL_COLOR_ACCENT = float4(1.00, 0.19, 0.56, 1.0)
animation_start cursor-trail-move
animation_stop cursor-trail-stop
shaders cursor-trail-blaze
endgroup
# Alternate combos (comment out the two lines above, uncomment these):
# ---- cyan + green ----
# var float4 TRAIL_COLOR = float4(0.26, 0.82, 0.98, 1.0) # #8be9fd
# var float4 TRAIL_COLOR_ACCENT = float4(0.08, 0.96, 0.20, 1.0) # #50fa7b
# ---- orange + pink ----
# var float4 TRAIL_COLOR = float4(1.00, 0.48, 0.15, 1.0) # #ffb86c
# var float4 TRAIL_COLOR_ACCENT = float4(1.00, 0.19, 0.56, 1.0) # #ff79c6
# ---- yellow + pink ----
# var float4 TRAIL_COLOR = float4(0.88, 0.96, 0.26, 1.0) # #f1fa8c
# var float4 TRAIL_COLOR_ACCENT = float4(1.00, 0.19, 0.56, 1.0) # #ff79c6
+112 -50
View File
@@ -22,6 +22,10 @@ input {
}
}
cursor {
hide-after-inactive-ms 1000 // hide after 1s of no movement
hide-when-typing // hide as soon as you start typing
}
// x11 support for wayland
xwayland-satellite {
path "xwayland-satellite"
@@ -90,17 +94,19 @@ layout {
}
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 "waybar" "-c" "/home/liph/.config/niri/waybar-niri/config.jsonc" "-s" "/home/liph/.config/niri/waybar-niri/style.css"
// spawn-at-startup "swaync" // replaced by quickshell notification layer
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 "kitty"
// spawn-at-startup "kitty"
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'"
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
gestures {
@@ -125,47 +131,82 @@ window-rule {
match app-id="Zoom Workplace"
open-floating true
}
// Wezterm window rules
////////////////////////////////////
////// Startup Window Rules ////////
////////////////////////////////////
// Wezterm
window-rule {
match at-startup=true app-id="wezterm"
match at-startup=true app-id="kitty"
open-on-workspace "1"
open-maximized true
open-floating false
// clip-to-geometry true
}
// kitty
window-rule {
match at-startup=false app-id="wezterm"
match at-startup=true app-id="kitty"
open-on-workspace "1"
open-maximized true
open-floating false
// clip-to-geometry true
}
// Obsidian window rules
// Librewolf
window-rule {
match at-startup=true app-id="librewolf"
open-on-workspace "2"
open-maximized true
}
// Obsidian
window-rule {
match at-startup=true app-id="obsidian"
open-on-workspace "3"
open-maximized true
open-floating false
}
////////////////////////////////////
/////// Normal Window Rules ////////
////////////////////////////////////
// Wezterm
window-rule {
match app-id="kitty"
open-floating false
clip-to-geometry true
default-column-width {
proportion 0.5
}
}
// Ghostty
window-rule {
match app-id="kitty"
open-floating false
clip-to-geometry true
default-column-width {
proportion 0.5
}
}
// Steam
window-rule {
match app-id="steam_app_4197610"
open-fullscreen true
}
// Obsidian
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
}
// Librewolf
window-rule {
match app-id="librewolf"
open-maximized true
clip-to-geometry true
open-floating false
}
// Slack
window-rule {
match app-id="slack"
open-maximized true
@@ -173,6 +214,7 @@ window-rule {
open-on-workspace "4"
open-floating false
}
// Tidal
window-rule {
match app-id="tidal-hifi"
open-maximized true
@@ -180,6 +222,7 @@ window-rule {
open-floating false
open-on-workspace "4"
}
// Tor
window-rule {
match app-id="Tor Browser"
open-maximized true
@@ -187,15 +230,14 @@ window-rule {
open-floating false
open-on-workspace "2"
}
// Claude
window-rule {
match app-id="Claude"
open-on-workspace "4"
default-column-width {
proportion 0.6667
}
open-maximized true
clip-to-geometry true
}
// 2. Specific rule for windows opening at startup
// Betterbird
window-rule {
match app-id="eu.betterbird.Betterbird"
open-maximized true
@@ -203,26 +245,11 @@ window-rule {
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
}
////////////////////////////////////
/////// Special Window Rules ///////
////////////////////////////////////
// Htop
window-rule {
match app-id="floating_htop"
default-column-width {
@@ -230,6 +257,23 @@ window-rule {
}
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 {
match app-id="floating_bluetui"
default-column-width {
@@ -237,6 +281,7 @@ window-rule {
}
open-floating true
}
// Pulsemixer
window-rule {
match app-id="floating_pulsemixer"
default-column-width {
@@ -244,6 +289,7 @@ window-rule {
}
open-floating true
}
// Wavemon
window-rule {
match app-id="floating_wavemon"
default-column-width {
@@ -251,6 +297,7 @@ window-rule {
}
open-floating true
}
// network-tui
window-rule {
match app-id="floating_network-tui"
default-column-width {
@@ -258,6 +305,7 @@ window-rule {
}
open-floating true
}
// Yazi
window-rule {
match app-id="floating_yazi"
default-column-width {
@@ -265,12 +313,18 @@ window-rule {
}
open-floating true
}
window-rule {
geometry-corner-radius 5
clip-to-geometry true
}
////////////////////////////////////
//////////// Keybinds///////////////
////////////////////////////////////
binds {
// Mod+Shift+Slash { show-hotkey-overlay; }
Mod+Mod5+J {
spawn "hyprlock"
}
@@ -293,34 +347,42 @@ binds {
spawn "librewolf"
}
Mod+Alt+Return hotkey-overlay-title="Open Kitty" {
spawn "wezterm"
spawn "kitty"
}
Mod+Alt+Space hotkey-overlay-title="Open Wofi" {
spawn "wofi" "--show" "drun"
Mod+Alt+Space hotkey-overlay-title="Open Launcher" {
spawn "qs" "ipc" "call" "launcher" "toggle"
}
Mod+Mod5+Q hotkey-overlay-title="Open Htop" {
spawn "wezterm" "start" "--class" "floating_htop" "-e" "htop"
// spawn "kitty" "start" "--class" "floating_htop" "-e" "htop"
spawn "kitty" "--class" "floating_htop" "-e" "htop";
}
Mod+Mod5+W hotkey-overlay-title="Open Btop" {
spawn "wezterm" "start" "--class" "floating_btop" "-e" "btop"
// spawn "kitty" "start" "--class" "floating_btop" "-e" "btop"
spawn "kitty" "--class" "floating_btop" "-e" "btop";
}
Mod+Mod5+E hotkey-overlay-title="Open Pulsemixer" {
spawn "wezterm" "start" "--class" "floating_pulsemixer" "-e" "pulsemixer"
// spawn "kitty" "start" "--class" "floating_pulsemixer" "-e" "pulsemixer"
spawn "kitty" "--class" "floating_btop" "-e" "pulsemixer";
}
Mod+Mod5+R allow-inhibiting=false hotkey-overlay-title="Open Bluetui" {
spawn "wezterm" "start" "--class" "floating_bluetui" "-e" "bluetui"
// spawn "kitty" "start" "--class" "floating_bluetui" "-e" "bluetui"
spawn "kitty" "--class" "floating_btop" "-e" "bluetui";
}
Mod+Mod5+T hotkey-overlay-title="Open Wavemon" {
spawn "wezterm" "start" "--class" "floating_wavemon" "-e" "wavemon"
// spawn "kitty" "start" "--class" "floating_wavemon" "-e" "wavemon"
spawn "kitty" "--class" "floating_btop" "-e" "wavemon";
}
Mod+Mod5+Z hotkey-overlay-title="Open network-tui" {
spawn "wezterm" "start" "--class" "floating_network-tui" "-e" "network-tui"
// spawn "kitty" "start" "--class" "floating_network-tui" "-e" "network-tui"
spawn "kitty" "--class" "floating_btop" "-e" "network-tui";
}
Mod+Mod5+U hotkey-overlay-title="Open Musikcube" {
spawn "wezterm" "start" "--class" "floating_musikcube" "-e" "musikcube"
// spawn "kitty" "start" "--class" "floating_musikcube" "-e" "musikcube"
spawn "kitty" "--class" "floating_btop" "-e" "musikcube";
}
Mod+Mod5+Y hotkey-overlay-title="Open Yazi" {
spawn "wezterm" "start" "--class" "floating_yazi" "-e" "yazi"
// spawn "kitty" "start" "--class" "floating_yazi" "-e" "yazi"
spawn "kitty" "--class" "floating_btop" "-e" "yazi";
}
// Brightness Controll
Mod+Ctrl+0 {
+708
View File
@@ -0,0 +1,708 @@
// 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 {
}
}
cursor {
hide-after-inactive-ms 1000 // hide after 1s of no movement
hide-when-typing // hide as soon as you start typing
}
// 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" // replaced by quickshell notification layer
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 "ghostty"
spawn-at-startup "obsidian"
// spawn-at-startup "kanshi"
spawn-at-startup "librewolf"
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
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
}
////////////////////////////////////
////// Startup Window Rules ////////
////////////////////////////////////
// Wezterm
window-rule {
match at-startup=true app-id="wezterm"
open-on-workspace "1"
open-maximized true
open-floating false
// clip-to-geometry true
}
// ghostty
window-rule {
match at-startup=true app-id="ghostty"
open-on-workspace "1"
open-maximized true
open-floating false
// clip-to-geometry true
}
// Librewolf
window-rule {
match at-startup=true app-id="librewolf"
open-on-workspace "2"
open-maximized true
}
// Obsidian
window-rule {
match at-startup=true app-id="obsidian"
open-on-workspace "3"
open-maximized true
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
}
}
// Ghostty
window-rule {
match app-id="ghostty"
open-floating false
clip-to-geometry true
default-column-width {
proportion 0.5
}
}
// Steam
window-rule {
match app-id="steam_app_4197610"
open-fullscreen true
}
// Obsidian
window-rule {
match at-startup=false app-id="obsidian"
open-maximized true
open-floating false
}
// Librewolf
window-rule {
match app-id="librewolf"
open-maximized true
clip-to-geometry true
open-floating false
}
// Slack
window-rule {
match app-id="slack"
open-maximized true
clip-to-geometry true
open-on-workspace "4"
open-floating false
}
// Tidal
window-rule {
match app-id="tidal-hifi"
open-maximized true
clip-to-geometry true
open-floating false
open-on-workspace "4"
}
// Tor
window-rule {
match app-id="Tor Browser"
open-maximized true
clip-to-geometry true
open-floating false
open-on-workspace "2"
}
// Claude
window-rule {
match app-id="Claude"
open-on-workspace "4"
open-maximized true
clip-to-geometry true
}
// Betterbird
window-rule {
match app-id="eu.betterbird.Betterbird"
open-maximized true
clip-to-geometry true
open-on-workspace "3"
}
////////////////////////////////////
/////// Special Window Rules ///////
////////////////////////////////////
// Htop
window-rule {
match app-id="floating_htop"
default-column-width {
proportion 0.6667
}
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 {
match app-id="floating_bluetui"
default-column-width {
proportion 0.6667
}
open-floating true
}
// Pulsemixer
window-rule {
match app-id="floating_pulsemixer"
default-column-width {
proportion 0.6667
}
open-floating true
}
// Wavemon
window-rule {
match app-id="floating_wavemon"
default-column-width {
proportion 0.6667
}
open-floating true
}
// network-tui
window-rule {
match app-id="floating_network-tui"
default-column-width {
proportion 0.6667
}
open-floating true
}
// Yazi
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
}
////////////////////////////////////
//////////// Keybinds///////////////
////////////////////////////////////
binds {
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 "ghostty"
}
Mod+Alt+Space hotkey-overlay-title="Open Launcher" {
spawn "qs" "ipc" "call" "launcher" "toggle"
}
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"
+75
View File
@@ -140,3 +140,78 @@ end
-- Keybinds
vim.keymap.set("i", "<C-f>", pick_email, { buffer = true, desc = "Pick email from abook" })
vim.keymap.set("n", "<C-f>", pick_email, { buffer = true, desc = "Pick email from abook" })
-- 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')
+20
View File
@@ -1,3 +1,23 @@
-- 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"
-- In your init.lua or after lazy setup
vim.opt.termguicolors = true
+27 -28
View File
@@ -1,8 +1,8 @@
{
"LuaSnip": { "branch": "master", "commit": "fb525166ccc30296fb3457441eb979113de46b00" },
"R.nvim": { "branch": "main", "commit": "c56ebe0f8445e251673981c40ac2d74659ecd6ed" },
"LuaSnip": { "branch": "master", "commit": "642b0c595e11608b4c18219e93b88d7637af27bc" },
"R.nvim": { "branch": "main", "commit": "fccfebab6c47a62716615559ab2aec92688cbd0e" },
"barbecue": { "branch": "main", "commit": "cd7e7da622d68136e13721865b4d919efd6325ed" },
"catppuccin": { "branch": "main", "commit": "c7c692a0ad3080710893abbae100171819a3e4be" },
"catppuccin": { "branch": "main", "commit": "edefef779ab08ce1a4a404713e3012b0d202bd35" },
"cmp-buffer": { "branch": "main", "commit": "b74fab3656eea9de20a9b8116afa3cfc4ec09657" },
"cmp-cmdline": { "branch": "main", "commit": "d126061b624e0af6c3a556428712dd4d4194ec6d" },
"cmp-nvim-lsp": { "branch": "main", "commit": "cbc7b02bb99fae35cb42f514762b89b5126651ef" },
@@ -11,65 +11,64 @@
"cmp-r": { "branch": "main", "commit": "70bfe8f4c062acc10266e24825439c009a0b1b89" },
"cmp-vimtex": { "branch": "master", "commit": "c09ca05bfa0641754516f13294d73d3799a02fc8" },
"cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" },
"conform.nvim": { "branch": "master", "commit": "619363c30309d29ffa631e67c8183f2a72caa373" },
"conform.nvim": { "branch": "master", "commit": "016802de402556da54c36bd7359b441266b01cdd" },
"dashboard-nvim": { "branch": "master", "commit": "f787e3462c2ee2b6117b17c1aa4ddf66cb6f57fe" },
"diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" },
"dracula.nvim": { "branch": "main", "commit": "ae752c13e95fb7c5f58da4b5123cb804ea7568ee" },
"dressing.nvim": { "branch": "master", "commit": "2d7c2db2507fa3c4956142ee607431ddb2828639" },
"everforest": { "branch": "master", "commit": "85a86eb62409e3ec88713bff3d1b9d7374e112e4" },
"flash.nvim": { "branch": "main", "commit": "b6346946d10d07998efee029fb0f7a593806d0cd" },
"friendly-snippets": { "branch": "main", "commit": "6cd7280adead7f586db6fccbd15d2cac7e2188b9" },
"fzf-lua": { "branch": "main", "commit": "511651f198068ef5841ee1635ade58daa2486ef7" },
"gitsigns.nvim": { "branch": "main", "commit": "31d6fb2d618bca1482b9f274751ead5f03461408" },
"flash.nvim": { "branch": "main", "commit": "5f0f270fdc7c5b0c21d903ee85b9cb06f2ac636a" },
"friendly-snippets": { "branch": "main", "commit": "a5a73e586521fe5c12d751ad81a0db67649a94ed" },
"fzf-lua": { "branch": "main", "commit": "05e44d38de0a79c11fba5f7bf8138791b1dbdd1e" },
"gitsigns.nvim": { "branch": "main", "commit": "f2421c550618d257048afa650413d9e542ddbe67" },
"grapple.nvim": { "branch": "main", "commit": "b41ddfc1c39f87f3d1799b99c2f0f1daa524c5f7" },
"gruvbox-mat": { "branch": "master", "commit": "11d779b26a9ab2b3db8c22c6ac9fb6e8ed4fea79" },
"indent-blankline.nvim": { "branch": "master", "commit": "d28a3f70721c79e3c5f6693057ae929f3d9c0a03" },
"indent-blankline.nvim": { "branch": "master", "commit": "f1e186e44d3b7f9ae918008e2c28ce37c6023d2d" },
"kanagawa.nvim": { "branch": "master", "commit": "bb85e4bfc8d89b0e62c8fa53ccdd13d12e2f77b3" },
"lazy.nvim": { "branch": "main", "commit": "306a05526ada86a7b30af95c5cc81ffba93fef97" },
"lazydev.nvim": { "branch": "main", "commit": "ff2cbcba459b637ec3fd165a2be59b7bbaeedf0d" },
"live-preview.nvim": { "branch": "main", "commit": "a30e54e51e7480d7060c8c8185f2a963ad3518b4" },
"live-preview.nvim": { "branch": "main", "commit": "a6307fa340ed7c0d96f5c567afc8c991aad94ce0" },
"lualine.nvim": { "branch": "master", "commit": "221ce6b2d999187044529f49da6554a92f740a96" },
"luvit-meta": { "branch": "main", "commit": "cc9b2d412d2fbd30b94a70cfc214c2a3be27a0a2" },
"mason-lspconfig.nvim": { "branch": "main", "commit": "7adc933dabcc7c86ae6b07aff7ee68eac398491f" },
"luvit-meta": { "branch": "main", "commit": "7edcd52ac6f2acc2f83f0cc27ac989a142408fbf" },
"mason-lspconfig.nvim": { "branch": "main", "commit": "b5576cd62899a1a478d0e67ef3d378ee55dba82d" },
"mason-tool-installer.nvim": { "branch": "main", "commit": "443f1ef8b5e6bf47045cb2217b6f748a223cf7dc" },
"mason.nvim": { "branch": "main", "commit": "2a6940af80375532e5e9e7c1f2fc6319a1b7a69d" },
"neo-tree.nvim": { "branch": "v3.x", "commit": "ebd66767191714e008ce73b769518a763ff31bdc" },
"neogit": { "branch": "master", "commit": "2043096b7ae81e8350ec8cceb3e7ab08dca1dcfe" },
"neo-tree.nvim": { "branch": "v3.x", "commit": "1a14083046d96e88e361d1da00761c40d45012f3" },
"neogit": { "branch": "master", "commit": "5adc81b26232954cd7a90f158aa7844c18fc3165" },
"nightfox.nvim": { "branch": "main", "commit": "4dacd3f0185a2227bdf3b6c0975a8f0bf87cac9a" },
"noice.nvim": { "branch": "main", "commit": "7bfd942445fb63089b59f97ca487d605e715f155" },
"nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" },
"nvim-autopairs": { "branch": "master", "commit": "7b9923abad60b903ece7c52940e1321d39eccc79" },
"nui.nvim": { "branch": "main", "commit": "10fc361835c856ba4233ef5ea135b919bf3dce97" },
"nvim-autopairs": { "branch": "master", "commit": "430522f95fe4fb7c511ec64f8c1a90cc6a66c05c" },
"nvim-cmp": { "branch": "main", "commit": "2ffe79f1f021def8dd1fcd81deb16f1bb0d989f3" },
"nvim-colorizer.lua": { "branch": "master", "commit": "a065833f35a3a7cc3ef137ac88b5381da2ba302e" },
"nvim-lint": { "branch": "master", "commit": "a219b2c9e5b4765e5c845aba119dad55806fcaf1" },
"nvim-lspconfig": { "branch": "master", "commit": "d592c1e6ad9a0a01b3d5ed3f0345d68407167181" },
"nvim-navic": { "branch": "master", "commit": "f5eba192f39b453675d115351808bd51276d9de5" },
"nvim-lint": { "branch": "master", "commit": "3d55c8f67c6ae5c15e1042571e107c7a3d5c5f4e" },
"nvim-lspconfig": { "branch": "master", "commit": "84b6b6c3f13cb34a6c8a0354b0da4c67d8ccf867" },
"nvim-navic": { "branch": "master", "commit": "455808fd0fae06e6d70fadfd61432275db8f34ce" },
"nvim-notify": { "branch": "master", "commit": "8701bece920b38ea289b457f902e2ad184131a5d" },
"nvim-spectre": { "branch": "master", "commit": "72f56f7585903cd7bf92c665351aa585e150af0f" },
"nvim-surround": { "branch": "main", "commit": "2e93e154de9ff326def6480a4358bfc149d5da2c" },
"nvim-tmux-navigation": { "branch": "main", "commit": "4898c98702954439233fdaf764c39636681e2861" },
"nvim-treesitter": { "branch": "main", "commit": "bd41519ff7901da11ba6e1c8f419f17f2d94305a" },
"nvim-treesitter-textobjects": { "branch": "main", "commit": "898ee307df58f854d11cd7edd06472574d48014e" },
"nvim-treesitter": { "branch": "main", "commit": "5cb0114e6242625db56dd6440e945ed1ece10bc7" },
"nvim-treesitter-textobjects": { "branch": "main", "commit": "5c7b0263797dfd1bd6202f2b219f3b53a80b2187" },
"nvim-ts-context-commentstring": { "branch": "main", "commit": "6141a40173c6efa98242dc951ed4b6f892c97027" },
"nvim-ufo": { "branch": "main", "commit": "ab3eb124062422d276fae49e0dd63b3ad1062cfc" },
"nvim-web-devicons": { "branch": "master", "commit": "2ae6958df7ced50baac5035cec0c15799eedfbf7" },
"nvim-web-devicons": { "branch": "master", "commit": "5f032a85be210cd1c6ac98861eb3b187ff3bd5eb" },
"obsidian.nvim": { "branch": "main", "commit": "ae1f76a75c7ce36866e1d9342a8f6f5b9c2caf9b" },
"onedark-warm": { "branch": "master", "commit": "df4792accde9db0043121f32628bcf8e645d9aea" },
"plenary.nvim": { "branch": "master", "commit": "74b06c6c75e4eeb3108ec01852001636d85a932b" },
"portal.nvim": { "branch": "main", "commit": "77d9d53fec945bfa407d5fd7120f1b4f117450ed" },
"promise-async": { "branch": "main", "commit": "119e8961014c9bfaf1487bf3c2a393d254f337e2" },
"rainbow-delimiters.nvim": { "branch": "master", "commit": "a798325b7f36acc62741d1029930a7b96d4dd4bf" },
"render-markdown.nvim": { "branch": "main", "commit": "f422cb5c6855f150e2ddcfaf44e7157b98b34f6a" },
"rainbow-delimiters.nvim": { "branch": "master", "commit": "3a0fc08dd39e8bf034a4cfef3f2845bd5f565a2e" },
"render-markdown.nvim": { "branch": "main", "commit": "4663eb3ecd538bd5062628fb6d95bbe6bdca78f6" },
"rose-pine": { "branch": "main", "commit": "ff483051a47e27d84bdef47703538df1ed9f4a47" },
"snacks.nvim": { "branch": "main", "commit": "882c996cf28183f4d63640de0b4c02ec886d01f2" },
"sonokai": { "branch": "master", "commit": "b023c5280b16fe2366f5e779d8d2756b3e5ee9c3" },
"telescope-ui-select.nvim": { "branch": "master", "commit": "6e51d7da30bd139a6950adf2a47fda6df9fa06d2" },
"telescope.nvim": { "branch": "master", "commit": "427b576c16792edad01a92b89721d923c19ad60f" },
"telescope.nvim": { "branch": "master", "commit": "40aedd8a68c78a656a10a8d62d80c54af59420fb" },
"todo-comments.nvim": { "branch": "main", "commit": "31e3c38ce9b29781e4422fc0322eb0a21f4e8668" },
"toggleterm.nvim": { "branch": "main", "commit": "50ea089fc548917cc3cc16b46a8211833b9e3c7c" },
"tokyonight": { "branch": "main", "commit": "cdc07ac78467a233fd62c493de29a17e0cf2b2b6" },
"trouble.nvim": { "branch": "main", "commit": "bd67efe408d4816e25e8491cc5ad4088e708a69a" },
"vimtex": { "branch": "master", "commit": "1d27d95258d8273d0690c7d3d4ff6e1fa2bd24af" },
"vimtex": { "branch": "master", "commit": "e355987594cbf16283bee7b37e3aa3a65d5e1c5c" },
"which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" },
"yazi.nvim": { "branch": "main", "commit": "d87cd885e06d50e1bb5607e48d96c1094d3b10e3" }
"yazi.nvim": { "branch": "main", "commit": "bf3e26d87d96c00dcf4bb4f67230bf717b7b76f6" }
}
+2 -2
View File
@@ -1,10 +1,10 @@
vim.cmd.colorscheme("rose-pine")
-- vim.cmd.colorscheme("rose-pine")
-- vim.cmd.colorscheme("sonokai")
-- vim.cmd.colorscheme("one-dark")
-- vim.cmd.colorscheme("nightfox")
-- vim.cmd.colorscheme("kanagawa")
-- vim.cmd.colorscheme("gruvbox-material")
-- vim.cmd.colorscheme("everforest")
-- vim.cmd.colorscheme("dracula")
vim.cmd.colorscheme("dracula")
-- vim.cmd.colorscheme("carbonfox")
-- vim.cmd.colorscheme("tokyonight")
@@ -0,0 +1,235 @@
-- lsp-config.lua: Configures Language Server Protocol for code analysis and diagnostics.
return {
{
"williamboman/mason.nvim",
lazy = false,
config = function()
require("mason").setup()
end,
},
{
"williamboman/mason-lspconfig.nvim",
lazy = false,
opts = {
auto_install = true,
ensure_installed = {
"lua_ls",
"pyright",
"bashls",
"ts_ls",
"solargraph",
"html",
"texlab",
"ltex",
"dockerls",
"yamlls",
"taplo",
"cssls",
},
},
},
{
"neovim/nvim-lspconfig",
lazy = false,
dependencies = {
"SmiteshP/nvim-navic",
},
config = function()
local capabilities = require("cmp_nvim_lsp").default_capabilities()
local navic = require("nvim-navic")
-- Common on_attach function
local on_attach = function(client, bufnr)
if client.server_capabilities.documentSymbolProvider then
navic.attach(client, bufnr)
end
end
-- Define server configurations
local servers = {
ts_ls = {
capabilities = capabilities,
on_attach = on_attach,
},
taplo = {
capabilities = capabilities,
on_attach = on_attach,
},
solargraph = {
capabilities = capabilities,
on_attach = on_attach,
},
textlsp = {
filetypes = { "ltx", "txt" },
capabilities = capabilities,
on_attach = on_attach,
},
texlab = {
capabilities = capabilities,
on_attach = on_attach,
settings = {
texlab = {
build = {
executable = "latexmk",
args = { "-pdf", "-interaction=nonstopmode", "-synctex=1", "%f" },
onSave = true,
},
forwardSearch = {
executable = "zathura",
args = { "--synctex-forward", "%l:1:%f", "%p" },
},
chktex = {
onOpenAndSave = true,
onEdit = false,
},
},
},
},
ltex = {
capabilities = capabilities,
on_attach = on_attach,
filetypes = { "latex", "tex", "bib", "markdown", "mail", "text" },
settings = {
ltex = {
language = "en-US",
enabled = { "latex", "tex", "bib", "markdown", "mail", "text" },
checkFrequency = "save", -- Only check when you save, not on every keystroke
diagnosticSeverity = "warning", -- Less intrusive
completionEnabled = true,
additionalRules = {
enablePickyRules = true,
motherTongue = "en-US",
},
disabledRules = {
-- Add rules you want to disable, e.g.:
-- ["en-US"] = { "MORFOLOGIK_RULE_EN_US" },
},
dictionary = {
-- Add custom words here that shouldn't be flagged
["en-US"] = {
-- "aerc",
-- "notmuch",
-- "dovecot",
},
},
java = {
path = "",
initialHeapSize = 64,
maximumHeapSize = 512,
},
},
},
},
html = {
capabilities = capabilities,
on_attach = on_attach,
},
lua_ls = {
capabilities = capabilities,
on_attach = on_attach,
settings = {
Lua = {
diagnostics = {
globals = { "vim" },
},
workspace = {
checkThirdParty = false,
},
telemetry = {
enable = false,
},
},
},
},
cssls = {
capabilities = capabilities,
on_attach = on_attach,
settings = {
css = {
validate = true,
lint = {
unknownAtRules = "ignore",
},
},
scss = {
validate = true,
lint = {
unknownAtRules = "ignore",
},
},
less = {
validate = true,
lint = {
unknownAtRules = "ignore",
},
},
},
},
pyright = {
capabilities = capabilities,
on_attach = on_attach,
},
bashls = {
filetypes = { "sh", "bash", "zsh" },
capabilities = capabilities,
on_attach = on_attach,
settings = {
bashIde = {
globPattern = "*@(.sh|.inc|.bash|.command|.zsh)",
shellcheckPath = "shellcheck",
},
},
},
dockerls = {
capabilities = capabilities,
on_attach = on_attach,
},
yamlls = {
capabilities = capabilities,
on_attach = on_attach,
settings = {
yaml = {
schemas = {
["https://json.schemastore.org/docker-compose.json"] = "docker-compose*.{yml,yaml}",
["https://json.schemastore.org/github-workflow.json"] = ".github/workflows/*",
},
},
},
},
}
-- Setup each server
for server, config in pairs(servers) do
vim.lsp.config[server] = config
vim.lsp.enable(server)
end
-- Configure diagnostics globally
vim.diagnostic.config({
virtual_text = false, -- Disable inline diagnostic text (no more popups!)
signs = true, -- Keep gutter signs
underline = true, -- Underline errors
update_in_insert = false, -- Don't update diagnostics while typing
severity_sort = true,
float = {
border = "rounded",
source = "always",
header = "",
prefix = "",
},
})
-- LSP keymaps
vim.keymap.set("n", "K", vim.lsp.buf.hover, {})
vim.keymap.set("n", "<leader>gd", vim.lsp.buf.definition, {})
vim.keymap.set("n", "<leader>gr", vim.lsp.buf.references, {})
vim.keymap.set("n", "<leader>ca", vim.lsp.buf.code_action, {})
-- Show diagnostics in floating window (optional - press this when you want to see the error)
vim.keymap.set("n", "<leader>e", vim.diagnostic.open_float, {})
vim.keymap.set("n", "[d", vim.diagnostic.goto_prev, {})
vim.keymap.set("n", "]d", vim.diagnostic.goto_next, {})
end,
},
}
@@ -0,0 +1,10 @@
-- nvim-colorizer.lua: Highlights color codes (e.g., #FFFFFF) directly in code.
return {
{
"norcalli/nvim-colorizer.lua",
config = function()
require("colorizer").setup()
end,
},
}
+45 -225
View File
@@ -1,235 +1,55 @@
-- lsp-config.lua: Configures Language Server Protocol for code analysis and diagnostics.
return {
-- Core nvim-treesitter plugin (new main-branch API)
{
"williamboman/mason.nvim",
lazy = false,
"nvim-treesitter/nvim-treesitter",
branch = "main",
build = ":TSUpdate", -- Updates parsers on install
lazy = false, -- load at startup so highlighting works on the first buffer
config = function()
require("mason").setup()
end,
},
{
"williamboman/mason-lspconfig.nvim",
lazy = false,
opts = {
auto_install = true,
ensure_installed = {
"lua_ls",
"pyright",
"bashls",
"ts_ls",
"solargraph",
require("nvim-treesitter").setup()
-- On the main branch, ensure_installed does not exist anymore;
-- install parsers explicitly instead (same list as your old config)
require("nvim-treesitter").install({
"lua",
"vim",
"vimdoc",
"markdown",
"java",
"yaml",
"latex",
"r",
"query",
"python",
"javascript",
"typescript",
"rust",
"go",
"bash",
"c",
"cpp",
"html",
"texlab",
"ltex",
"dockerls",
"yamlls",
"taplo",
"cssls",
},
},
},
{
"neovim/nvim-lspconfig",
lazy = false,
dependencies = {
"SmiteshP/nvim-navic",
},
config = function()
local capabilities = require("cmp_nvim_lsp").default_capabilities()
local navic = require("nvim-navic")
-- Common on_attach function
local on_attach = function(client, bufnr)
if client.server_capabilities.documentSymbolProvider then
navic.attach(client, bufnr)
end
end
-- Define server configurations
local servers = {
ts_ls = {
capabilities = capabilities,
on_attach = on_attach,
},
taplo = {
capabilities = capabilities,
on_attach = on_attach,
},
solargraph = {
capabilities = capabilities,
on_attach = on_attach,
},
textlsp = {
filetypes = { "ltx", "txt" },
capabilities = capabilities,
on_attach = on_attach,
},
texlab = {
capabilities = capabilities,
on_attach = on_attach,
settings = {
texlab = {
build = {
executable = "latexmk",
args = { "-pdf", "-interaction=nonstopmode", "-synctex=1", "%f" },
onSave = true,
},
forwardSearch = {
executable = "zathura",
args = { "--synctex-forward", "%l:1:%f", "%p" },
},
chktex = {
onOpenAndSave = true,
onEdit = false,
},
},
},
},
ltex = {
capabilities = capabilities,
on_attach = on_attach,
filetypes = { "latex", "tex", "bib", "markdown", "mail", "text" },
settings = {
ltex = {
language = "en-US",
enabled = { "latex", "tex", "bib", "markdown", "mail", "text" },
checkFrequency = "save", -- Only check when you save, not on every keystroke
diagnosticSeverity = "warning", -- Less intrusive
completionEnabled = true,
additionalRules = {
enablePickyRules = true,
motherTongue = "en-US",
},
disabledRules = {
-- Add rules you want to disable, e.g.:
-- ["en-US"] = { "MORFOLOGIK_RULE_EN_US" },
},
dictionary = {
-- Add custom words here that shouldn't be flagged
["en-US"] = {
-- "aerc",
-- "notmuch",
-- "dovecot",
},
},
java = {
path = "",
initialHeapSize = 64,
maximumHeapSize = 512,
},
},
},
},
html = {
capabilities = capabilities,
on_attach = on_attach,
},
lua_ls = {
capabilities = capabilities,
on_attach = on_attach,
settings = {
Lua = {
diagnostics = {
globals = { "vim" },
},
workspace = {
checkThirdParty = false,
},
telemetry = {
enable = false,
},
},
},
},
cssls = {
capabilities = capabilities,
on_attach = on_attach,
settings = {
css = {
validate = true,
lint = {
unknownAtRules = "ignore",
},
},
scss = {
validate = true,
lint = {
unknownAtRules = "ignore",
},
},
less = {
validate = true,
lint = {
unknownAtRules = "ignore",
},
},
},
},
pyright = {
capabilities = capabilities,
on_attach = on_attach,
},
bashls = {
filetypes = { "sh", "bash", "zsh" },
capabilities = capabilities,
on_attach = on_attach,
settings = {
bashIde = {
globPattern = "*@(.sh|.inc|.bash|.command|.zsh)",
shellcheckPath = "shellcheck",
},
},
},
dockerls = {
capabilities = capabilities,
on_attach = on_attach,
},
yamlls = {
capabilities = capabilities,
on_attach = on_attach,
settings = {
yaml = {
schemas = {
["https://json.schemastore.org/docker-compose.json"] = "docker-compose*.{yml,yaml}",
["https://json.schemastore.org/github-workflow.json"] = ".github/workflows/*",
},
},
},
},
}
-- Setup each server
for server, config in pairs(servers) do
vim.lsp.config[server] = config
vim.lsp.enable(server)
end
-- Configure diagnostics globally
vim.diagnostic.config({
virtual_text = false, -- Disable inline diagnostic text (no more popups!)
signs = true, -- Keep gutter signs
underline = true, -- Underline errors
update_in_insert = false, -- Don't update diagnostics while typing
severity_sort = true,
float = {
border = "rounded",
source = "always",
header = "",
prefix = "",
},
})
-- LSP keymaps
vim.keymap.set("n", "K", vim.lsp.buf.hover, {})
vim.keymap.set("n", "<leader>gd", vim.lsp.buf.definition, {})
vim.keymap.set("n", "<leader>gr", vim.lsp.buf.references, {})
vim.keymap.set("n", "<leader>ca", vim.lsp.buf.code_action, {})
-- highlight = { enable = true } also no longer exists;
-- start treesitter highlighting manually for every buffer
vim.api.nvim_create_autocmd("FileType", {
callback = function()
pcall(vim.treesitter.start)
end,
})
end,
},
-- Show diagnostics in floating window (optional - press this when you want to see the error)
vim.keymap.set("n", "<leader>e", vim.diagnostic.open_float, {})
vim.keymap.set("n", "[d", vim.diagnostic.goto_prev, {})
vim.keymap.set("n", "]d", vim.diagnostic.goto_next, {})
-- Textobjects plugin that depends on the core plugin
{
"nvim-treesitter/nvim-treesitter-textobjects",
branch = "main", -- must use the matching main branch, otherwise it breaks with the rewritten core
dependencies = { "nvim-treesitter/nvim-treesitter" },
config = function()
require("nvim-treesitter-textobjects").setup({
-- add select/move textobject keymaps here when you need them
})
end,
},
}
@@ -1,10 +1,9 @@
-- nvim-colorizer.lua: Highlights color codes (e.g., #FFFFFF) directly in code.
-- ~/.config/nvim/lua/plugins/nvim-colorizer.lua
return {
{
"norcalli/nvim-colorizer.lua",
"catgoose/nvim-colorizer.lua", -- maintained fork, same API
config = function()
require("colorizer").setup()
require("colorizer").setup({
-- your existing options from line 7 onward go here unchanged
})
end,
},
}
@@ -1,12 +0,0 @@
-- nvim-tmux-navigator.lua: Switch between Neovim and tmux panes using consistent keybindings.
return {
"alexghergh/nvim-tmux-navigation",
config = function()
require("nvim-tmux-navigation").setup({})
vim.keymap.set("n", "<C-h>", "<Cmd>NvimTmuxNavigateLeft<CR>", {})
vim.keymap.set("n", "<C-j>", "<Cmd>NvimTmuxNavigateDown<CR>", {})
vim.keymap.set("n", "<C-k>", "<Cmd>NvimTmuxNavigateUp<CR>", {})
vim.keymap.set("n", "<C-l>", "<Cmd>NvimTmuxNavigateRight<CR>", {})
end,
}
@@ -0,0 +1,55 @@
-- obsidian.lua: Integrates Obsidian note-taking workflow into Neovim.
return {
{
"epwalsh/obsidian.nvim",
version = "*",
lazy = true,
ft = "markdown",
dependencies = {
"nvim-lua/plenary.nvim",
},
opts = {
workspaces = {
{
name = "liph",
path = "/home/liph/Documents/Obsidian/liph",
},
},
completion = {
nvim_cmp = true,
min_chars = 2,
},
mappings = {
["<leader>ch"] = {
action = function()
return require("obsidian").util.toggle_checkbox()
end,
opts = { buffer = true, desc = "Toggle checkbox" },
},
["<cr>"] = {
action = function()
return require("obsidian").util.smart_action()
end,
opts = { buffer = true, expr = true },
},
["gf"] = {
action = function()
return require("obsidian").util.gf_passthrough()
end,
opts = { noremap = false, expr = true, buffer = true },
},
},
note_id_func = function(title)
return title
end,
ui = {
enable = false, -- DISABLE Obsidian UI, use markview instead
},
},
},
}
+22 -18
View File
@@ -1,12 +1,16 @@
return {
-- Core nvim-treesitter plugin
-- Core nvim-treesitter plugin (new main-branch API)
{
"nvim-treesitter/nvim-treesitter",
branch = "main",
build = ":TSUpdate", -- Updates parsers on install
priority = 1000, -- ← HIGHEST priority
config = true, -- Let lazy.nvim auto-call .setup() with opts
opts = {
ensure_installed = {
lazy = false, -- load at startup so highlighting works on the first buffer
config = function()
require("nvim-treesitter").setup()
-- Replaces the old ensure_installed/auto_install options;
-- already-installed parsers are skipped, missing ones download in the background
require("nvim-treesitter").install({
"lua",
"vim",
"vimdoc",
@@ -25,26 +29,26 @@ return {
"c",
"cpp",
"html",
},
sync_install = false,
auto_install = true,
highlight = {
enable = true,
additional_vim_regex_highlighting = false,
},
indent = {
enable = true,
},
},
})
-- Replaces the old highlight = { enable = true } option
vim.api.nvim_create_autocmd("FileType", {
callback = function()
pcall(vim.treesitter.start)
end,
})
end,
},
-- Textobjects plugin that depends on the core plugin
{
"nvim-treesitter/nvim-treesitter-textobjects",
branch = "main", -- must match the new core API
dependencies = { "nvim-treesitter/nvim-treesitter" },
config = function()
-- Configuration is integrated into the main setup
-- No need to call require() here
require("nvim-treesitter-textobjects").setup({
-- add select/move textobject keymaps here when you need them
})
end,
},
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"ollama-cloud": {
"type": "api_key",
"key": "c06adb6cc58a4c3aaa459bd75f42085b.EAGExkidZO9hklD3KWhWL2Uu"
"key": "77a13370a1a148ff8667db60252cfabb.nxL8rySeqXECFKe6ZdNSSIIS"
}
}
BIN
View File
Binary file not shown.
@@ -1,3 +1,3 @@
{
"lastChangelogVersion": "1.7.0"
"lastChangelogVersion": "1.10.0"
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+908
View File
@@ -0,0 +1,908 @@
{
"ollama-cloud": {
"models": [
{
"id": "glm-5.3",
"name": "glm-5.3",
"reasoning": true,
"thinkingLevelMap": {
"off": "none",
"minimal": null,
"low": "low",
"medium": "medium",
"high": "high",
"xhigh": "max"
},
"input": [
"text"
],
"cost": {
"input": 1.4,
"output": 4.4,
"cacheRead": 0.26,
"cacheWrite": 0
},
"contextWindow": 1048576,
"maxTokens": 524288,
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": true,
"supportsStore": false,
"maxTokensField": "max_tokens",
"supportsUsageInStreaming": true,
"requiresToolResultName": false,
"requiresAssistantAfterToolResult": false,
"requiresThinkingAsText": false,
"requiresReasoningContentOnAssistantMessages": false,
"thinkingFormat": "openai",
"supportsStrictMode": false,
"sendSessionAffinityHeaders": false,
"supportsLongCacheRetention": false,
"zaiToolStream": false,
"openRouterRouting": {},
"vercelGatewayRouting": {}
},
"provider": "ollama-cloud",
"api": "openai-completions",
"baseUrl": "https://ollama.com/v1"
},
{
"id": "kimi-k3",
"name": "kimi-k3",
"reasoning": true,
"thinkingLevelMap": {
"off": "none",
"minimal": null,
"low": "low",
"medium": "medium",
"high": "high",
"xhigh": "max"
},
"input": [
"text",
"image"
],
"cost": {
"input": 3,
"output": 15,
"cacheRead": 0.3,
"cacheWrite": 0
},
"contextWindow": 1048576,
"maxTokens": 524288,
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": true,
"supportsStore": false,
"maxTokensField": "max_tokens",
"supportsUsageInStreaming": true,
"requiresToolResultName": false,
"requiresAssistantAfterToolResult": false,
"requiresThinkingAsText": false,
"requiresReasoningContentOnAssistantMessages": false,
"thinkingFormat": "openai",
"supportsStrictMode": false,
"sendSessionAffinityHeaders": false,
"supportsLongCacheRetention": false,
"zaiToolStream": false,
"openRouterRouting": {},
"vercelGatewayRouting": {}
},
"provider": "ollama-cloud",
"api": "openai-completions",
"baseUrl": "https://ollama.com/v1"
},
{
"id": "minimax-m3",
"name": "minimax-m3",
"reasoning": true,
"thinkingLevelMap": {
"off": null,
"minimal": null,
"low": "low",
"medium": "medium",
"high": "high",
"xhigh": "max"
},
"input": [
"text",
"image"
],
"cost": {
"input": 0.6,
"output": 2.4,
"cacheRead": 0.12,
"cacheWrite": 0
},
"contextWindow": 512000,
"maxTokens": 131072,
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": true,
"supportsStore": false,
"maxTokensField": "max_tokens",
"supportsUsageInStreaming": true,
"requiresToolResultName": false,
"requiresAssistantAfterToolResult": false,
"requiresThinkingAsText": false,
"requiresReasoningContentOnAssistantMessages": false,
"thinkingFormat": "openai",
"supportsStrictMode": false,
"sendSessionAffinityHeaders": false,
"supportsLongCacheRetention": false,
"zaiToolStream": false,
"openRouterRouting": {},
"vercelGatewayRouting": {}
},
"provider": "ollama-cloud",
"api": "openai-completions",
"baseUrl": "https://ollama.com/v1"
},
{
"id": "glm-5.1",
"name": "glm-5.1",
"reasoning": true,
"thinkingLevelMap": {
"off": "none",
"minimal": null,
"low": "low",
"medium": "medium",
"high": "high",
"xhigh": "max"
},
"input": [
"text"
],
"cost": {
"input": 1,
"output": 3.2,
"cacheRead": 0.2,
"cacheWrite": 0
},
"contextWindow": 202752,
"maxTokens": 131072,
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": true,
"supportsStore": false,
"maxTokensField": "max_tokens",
"supportsUsageInStreaming": true,
"requiresToolResultName": false,
"requiresAssistantAfterToolResult": false,
"requiresThinkingAsText": false,
"requiresReasoningContentOnAssistantMessages": false,
"thinkingFormat": "openai",
"supportsStrictMode": false,
"sendSessionAffinityHeaders": false,
"supportsLongCacheRetention": false,
"zaiToolStream": false,
"openRouterRouting": {},
"vercelGatewayRouting": {}
},
"provider": "ollama-cloud",
"api": "openai-completions",
"baseUrl": "https://ollama.com/v1"
},
{
"id": "kimi-k2.6",
"name": "kimi-k2.6",
"reasoning": true,
"thinkingLevelMap": {
"off": "none",
"minimal": null,
"low": "low",
"medium": "medium",
"high": "high",
"xhigh": "max"
},
"input": [
"text",
"image"
],
"cost": {
"input": 0.95,
"output": 4,
"cacheRead": 0.16,
"cacheWrite": 0
},
"contextWindow": 262144,
"maxTokens": 262144,
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": true,
"supportsStore": false,
"maxTokensField": "max_tokens",
"supportsUsageInStreaming": true,
"requiresToolResultName": false,
"requiresAssistantAfterToolResult": false,
"requiresThinkingAsText": false,
"requiresReasoningContentOnAssistantMessages": false,
"thinkingFormat": "openai",
"supportsStrictMode": false,
"sendSessionAffinityHeaders": false,
"supportsLongCacheRetention": false,
"zaiToolStream": false,
"openRouterRouting": {},
"vercelGatewayRouting": {}
},
"provider": "ollama-cloud",
"api": "openai-completions",
"baseUrl": "https://ollama.com/v1"
},
{
"id": "nemotron-3-nano:30b",
"name": "nemotron-3-nano:30b",
"reasoning": true,
"thinkingLevelMap": {
"off": "none",
"minimal": null,
"low": "low",
"medium": "medium",
"high": "high",
"xhigh": "max"
},
"input": [
"text"
],
"cost": {
"input": 0.06,
"output": 0.24,
"cacheRead": 0.06,
"cacheWrite": 0
},
"contextWindow": 262144,
"maxTokens": 131072,
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": true,
"supportsStore": false,
"maxTokensField": "max_tokens",
"supportsUsageInStreaming": true,
"requiresToolResultName": false,
"requiresAssistantAfterToolResult": false,
"requiresThinkingAsText": false,
"requiresReasoningContentOnAssistantMessages": false,
"thinkingFormat": "openai",
"supportsStrictMode": false,
"sendSessionAffinityHeaders": false,
"supportsLongCacheRetention": false,
"zaiToolStream": false,
"openRouterRouting": {},
"vercelGatewayRouting": {}
},
"provider": "ollama-cloud",
"api": "openai-completions",
"baseUrl": "https://ollama.com/v1"
},
{
"id": "gpt-oss:20b",
"name": "gpt-oss:20b",
"reasoning": true,
"thinkingLevelMap": {
"off": null,
"minimal": null,
"low": "low",
"medium": "medium",
"high": "high",
"xhigh": null
},
"input": [
"text"
],
"cost": {
"input": 0.07,
"output": 0.3,
"cacheRead": 0.035,
"cacheWrite": 0
},
"contextWindow": 131072,
"maxTokens": 131072,
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": true,
"supportsStore": false,
"maxTokensField": "max_tokens",
"supportsUsageInStreaming": true,
"requiresToolResultName": false,
"requiresAssistantAfterToolResult": false,
"requiresThinkingAsText": false,
"requiresReasoningContentOnAssistantMessages": false,
"thinkingFormat": "openai",
"supportsStrictMode": false,
"sendSessionAffinityHeaders": false,
"supportsLongCacheRetention": false,
"zaiToolStream": false,
"openRouterRouting": {},
"vercelGatewayRouting": {}
},
"provider": "ollama-cloud",
"api": "openai-completions",
"baseUrl": "https://ollama.com/v1"
},
{
"id": "qwen3.5:397b",
"name": "qwen3.5:397b",
"reasoning": true,
"thinkingLevelMap": {
"off": "none",
"minimal": null,
"low": null,
"medium": "medium",
"high": null,
"xhigh": null
},
"input": [
"text",
"image"
],
"cost": {
"input": 0.6,
"output": 3.6,
"cacheRead": 0.6,
"cacheWrite": 0
},
"contextWindow": 262144,
"maxTokens": 65536,
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": true,
"supportsStore": false,
"maxTokensField": "max_tokens",
"supportsUsageInStreaming": true,
"requiresToolResultName": false,
"requiresAssistantAfterToolResult": false,
"requiresThinkingAsText": false,
"requiresReasoningContentOnAssistantMessages": false,
"thinkingFormat": "openai",
"supportsStrictMode": false,
"sendSessionAffinityHeaders": false,
"supportsLongCacheRetention": false,
"zaiToolStream": false,
"openRouterRouting": {},
"vercelGatewayRouting": {}
},
"provider": "ollama-cloud",
"api": "openai-completions",
"baseUrl": "https://ollama.com/v1"
},
{
"id": "deepseek-v4-pro:0813",
"name": "deepseek-v4-pro:0813",
"reasoning": true,
"thinkingLevelMap": {
"off": "none",
"minimal": null,
"low": "low",
"medium": "medium",
"high": "high",
"xhigh": "max"
},
"input": [
"text"
],
"cost": {
"input": 1.32,
"output": 3.96,
"cacheRead": 0.044,
"cacheWrite": 0
},
"contextWindow": 1048576,
"maxTokens": 65536,
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": true,
"supportsStore": false,
"maxTokensField": "max_tokens",
"supportsUsageInStreaming": true,
"requiresToolResultName": false,
"requiresAssistantAfterToolResult": false,
"requiresThinkingAsText": false,
"requiresReasoningContentOnAssistantMessages": false,
"thinkingFormat": "openai",
"supportsStrictMode": false,
"sendSessionAffinityHeaders": false,
"supportsLongCacheRetention": false,
"zaiToolStream": false,
"openRouterRouting": {},
"vercelGatewayRouting": {}
},
"provider": "ollama-cloud",
"api": "openai-completions",
"baseUrl": "https://ollama.com/v1"
},
{
"id": "nemotron-3-ultra",
"name": "nemotron-3-ultra",
"reasoning": true,
"thinkingLevelMap": {
"off": "none",
"minimal": null,
"low": "low",
"medium": "medium",
"high": "high",
"xhigh": "max"
},
"input": [
"text"
],
"cost": {
"input": 0.1,
"output": 3,
"cacheRead": 0.1,
"cacheWrite": 0
},
"contextWindow": 262144,
"maxTokens": 65536,
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": true,
"supportsStore": false,
"maxTokensField": "max_tokens",
"supportsUsageInStreaming": true,
"requiresToolResultName": false,
"requiresAssistantAfterToolResult": false,
"requiresThinkingAsText": false,
"requiresReasoningContentOnAssistantMessages": false,
"thinkingFormat": "openai",
"supportsStrictMode": false,
"sendSessionAffinityHeaders": false,
"supportsLongCacheRetention": false,
"zaiToolStream": false,
"openRouterRouting": {},
"vercelGatewayRouting": {}
},
"provider": "ollama-cloud",
"api": "openai-completions",
"baseUrl": "https://ollama.com/v1"
},
{
"id": "glm-5.3-flash",
"name": "glm-5.3-flash",
"reasoning": true,
"thinkingLevelMap": {
"off": "none",
"minimal": null,
"low": "low",
"medium": "medium",
"high": "high",
"xhigh": "max"
},
"input": [
"text",
"image"
],
"cost": {
"input": 0.15,
"output": 0.5,
"cacheRead": 0.03,
"cacheWrite": 0
},
"contextWindow": 1048576,
"maxTokens": 524288,
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": true,
"supportsStore": false,
"maxTokensField": "max_tokens",
"supportsUsageInStreaming": true,
"requiresToolResultName": false,
"requiresAssistantAfterToolResult": false,
"requiresThinkingAsText": false,
"requiresReasoningContentOnAssistantMessages": false,
"thinkingFormat": "openai",
"supportsStrictMode": false,
"sendSessionAffinityHeaders": false,
"supportsLongCacheRetention": false,
"zaiToolStream": false,
"openRouterRouting": {},
"vercelGatewayRouting": {}
},
"provider": "ollama-cloud",
"api": "openai-completions",
"baseUrl": "https://ollama.com/v1"
},
{
"id": "kimi-k2.7-code",
"name": "kimi-k2.7-code",
"reasoning": true,
"thinkingLevelMap": {
"off": "none",
"minimal": null,
"low": "low",
"medium": "medium",
"high": "high",
"xhigh": "max"
},
"input": [
"text",
"image"
],
"cost": {
"input": 0.95,
"output": 4,
"cacheRead": 0.19,
"cacheWrite": 0
},
"contextWindow": 262144,
"maxTokens": 262144,
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": true,
"supportsStore": false,
"maxTokensField": "max_tokens",
"supportsUsageInStreaming": true,
"requiresToolResultName": false,
"requiresAssistantAfterToolResult": false,
"requiresThinkingAsText": false,
"requiresReasoningContentOnAssistantMessages": false,
"thinkingFormat": "openai",
"supportsStrictMode": false,
"sendSessionAffinityHeaders": false,
"supportsLongCacheRetention": false,
"zaiToolStream": false,
"openRouterRouting": {},
"vercelGatewayRouting": {}
},
"provider": "ollama-cloud",
"api": "openai-completions",
"baseUrl": "https://ollama.com/v1"
},
{
"id": "gpt-oss:120b",
"name": "gpt-oss:120b",
"reasoning": true,
"thinkingLevelMap": {
"off": null,
"minimal": null,
"low": "low",
"medium": "medium",
"high": "high",
"xhigh": null
},
"input": [
"text"
],
"cost": {
"input": 0.15,
"output": 0.6,
"cacheRead": 0.014,
"cacheWrite": 0
},
"contextWindow": 131072,
"maxTokens": 131072,
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": true,
"supportsStore": false,
"maxTokensField": "max_tokens",
"supportsUsageInStreaming": true,
"requiresToolResultName": false,
"requiresAssistantAfterToolResult": false,
"requiresThinkingAsText": false,
"requiresReasoningContentOnAssistantMessages": false,
"thinkingFormat": "openai",
"supportsStrictMode": false,
"sendSessionAffinityHeaders": false,
"supportsLongCacheRetention": false,
"zaiToolStream": false,
"openRouterRouting": {},
"vercelGatewayRouting": {}
},
"provider": "ollama-cloud",
"api": "openai-completions",
"baseUrl": "https://ollama.com/v1"
},
{
"id": "minimax-m2.7",
"name": "minimax-m2.7",
"reasoning": true,
"thinkingLevelMap": {
"off": null,
"minimal": null,
"low": "low",
"medium": "medium",
"high": "high",
"xhigh": "max"
},
"input": [
"text"
],
"cost": {
"input": 0.3,
"output": 1.2,
"cacheRead": 0.06,
"cacheWrite": 0
},
"contextWindow": 196608,
"maxTokens": 131072,
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": true,
"supportsStore": false,
"maxTokensField": "max_tokens",
"supportsUsageInStreaming": true,
"requiresToolResultName": false,
"requiresAssistantAfterToolResult": false,
"requiresThinkingAsText": false,
"requiresReasoningContentOnAssistantMessages": false,
"thinkingFormat": "openai",
"supportsStrictMode": false,
"sendSessionAffinityHeaders": false,
"supportsLongCacheRetention": false,
"zaiToolStream": false,
"openRouterRouting": {},
"vercelGatewayRouting": {}
},
"provider": "ollama-cloud",
"api": "openai-completions",
"baseUrl": "https://ollama.com/v1"
},
{
"id": "deepseek-v4.1-flash",
"name": "deepseek-v4.1-flash",
"reasoning": true,
"thinkingLevelMap": {
"off": "none",
"minimal": null,
"low": "low",
"medium": "medium",
"high": "high",
"xhigh": "max"
},
"input": [
"text",
"image"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 1048576,
"maxTokens": 32768,
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": true,
"supportsStore": false,
"maxTokensField": "max_tokens",
"supportsUsageInStreaming": true,
"requiresToolResultName": false,
"requiresAssistantAfterToolResult": false,
"requiresThinkingAsText": false,
"requiresReasoningContentOnAssistantMessages": false,
"thinkingFormat": "openai",
"supportsStrictMode": false,
"sendSessionAffinityHeaders": false,
"supportsLongCacheRetention": false,
"zaiToolStream": false,
"openRouterRouting": {},
"vercelGatewayRouting": {}
},
"provider": "ollama-cloud",
"api": "openai-completions",
"baseUrl": "https://ollama.com/v1"
},
{
"id": "glm-5.2",
"name": "glm-5.2",
"reasoning": true,
"thinkingLevelMap": {
"off": "none",
"minimal": null,
"low": null,
"medium": null,
"high": "high",
"xhigh": "max"
},
"input": [
"text"
],
"cost": {
"input": 1.4,
"output": 4.4,
"cacheRead": 0.26,
"cacheWrite": 0
},
"contextWindow": 1048576,
"maxTokens": 131072,
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": true,
"supportsStore": false,
"maxTokensField": "max_tokens",
"supportsUsageInStreaming": true,
"requiresToolResultName": false,
"requiresAssistantAfterToolResult": false,
"requiresThinkingAsText": false,
"requiresReasoningContentOnAssistantMessages": false,
"thinkingFormat": "openai",
"supportsStrictMode": false,
"sendSessionAffinityHeaders": false,
"supportsLongCacheRetention": false,
"zaiToolStream": false,
"openRouterRouting": {},
"vercelGatewayRouting": {}
},
"provider": "ollama-cloud",
"api": "openai-completions",
"baseUrl": "https://ollama.com/v1"
},
{
"id": "deepseek-v4-flash:0731",
"name": "deepseek-v4-flash:0731",
"reasoning": true,
"thinkingLevelMap": {
"off": "none",
"minimal": null,
"low": "low",
"medium": "medium",
"high": "high",
"xhigh": "max"
},
"input": [
"text"
],
"cost": {
"input": 0.44,
"output": 1.32,
"cacheRead": 0.014,
"cacheWrite": 0
},
"contextWindow": 1048576,
"maxTokens": 65536,
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": true,
"supportsStore": false,
"maxTokensField": "max_tokens",
"supportsUsageInStreaming": true,
"requiresToolResultName": false,
"requiresAssistantAfterToolResult": false,
"requiresThinkingAsText": false,
"requiresReasoningContentOnAssistantMessages": false,
"thinkingFormat": "openai",
"supportsStrictMode": false,
"sendSessionAffinityHeaders": false,
"supportsLongCacheRetention": false,
"zaiToolStream": false,
"openRouterRouting": {},
"vercelGatewayRouting": {}
},
"provider": "ollama-cloud",
"api": "openai-completions",
"baseUrl": "https://ollama.com/v1"
},
{
"id": "mistral-large-3:675b",
"name": "mistral-large-3:675b",
"reasoning": false,
"input": [
"text",
"image"
],
"cost": {
"input": 0.5,
"output": 1.5,
"cacheRead": 0.5,
"cacheWrite": 0
},
"contextWindow": 262144,
"maxTokens": 262144,
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": true,
"supportsStore": false,
"maxTokensField": "max_tokens",
"supportsUsageInStreaming": true,
"requiresToolResultName": false,
"requiresAssistantAfterToolResult": false,
"requiresThinkingAsText": false,
"requiresReasoningContentOnAssistantMessages": false,
"thinkingFormat": "openai",
"supportsStrictMode": false,
"sendSessionAffinityHeaders": false,
"supportsLongCacheRetention": false,
"zaiToolStream": false,
"openRouterRouting": {},
"vercelGatewayRouting": {}
},
"provider": "ollama-cloud",
"api": "openai-completions",
"baseUrl": "https://ollama.com/v1"
},
{
"id": "gemma4:31b",
"name": "gemma4:31b",
"reasoning": true,
"thinkingLevelMap": {
"off": "none",
"minimal": null,
"low": "low",
"medium": "medium",
"high": "high",
"xhigh": "max"
},
"input": [
"text",
"image"
],
"cost": {
"input": 0.14,
"output": 0.4,
"cacheRead": 0.05,
"cacheWrite": 0
},
"contextWindow": 262144,
"maxTokens": 262144,
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": true,
"supportsStore": false,
"maxTokensField": "max_tokens",
"supportsUsageInStreaming": true,
"requiresToolResultName": false,
"requiresAssistantAfterToolResult": false,
"requiresThinkingAsText": false,
"requiresReasoningContentOnAssistantMessages": false,
"thinkingFormat": "openai",
"supportsStrictMode": false,
"sendSessionAffinityHeaders": false,
"supportsLongCacheRetention": false,
"zaiToolStream": false,
"openRouterRouting": {},
"vercelGatewayRouting": {}
},
"provider": "ollama-cloud",
"api": "openai-completions",
"baseUrl": "https://ollama.com/v1"
},
{
"id": "nemotron-3-super",
"name": "nemotron-3-super",
"reasoning": true,
"thinkingLevelMap": {
"off": "none",
"minimal": null,
"low": "low",
"medium": "medium",
"high": "high",
"xhigh": "max"
},
"input": [
"text"
],
"cost": {
"input": 0.015,
"output": 0.6,
"cacheRead": 0.015,
"cacheWrite": 0
},
"contextWindow": 262144,
"maxTokens": 65536,
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": true,
"supportsStore": false,
"maxTokensField": "max_tokens",
"supportsUsageInStreaming": true,
"requiresToolResultName": false,
"requiresAssistantAfterToolResult": false,
"requiresThinkingAsText": false,
"requiresReasoningContentOnAssistantMessages": false,
"thinkingFormat": "openai",
"supportsStrictMode": false,
"sendSessionAffinityHeaders": false,
"supportsLongCacheRetention": false,
"zaiToolStream": false,
"openRouterRouting": {},
"vercelGatewayRouting": {}
},
"provider": "ollama-cloud",
"api": "openai-completions",
"baseUrl": "https://ollama.com/v1"
}
],
"checkedAt": 1790147864281
}
}
+3 -3
View File
@@ -1,5 +1,5 @@
{
"lastChangelogVersion": "0.81.1",
"lastChangelogVersion": "0.84.4",
"theme": "crew-dracula/crew-dracula",
"packages": [
"npm:pi-ollama-cloud",
@@ -10,8 +10,8 @@
"npm:@ff-labs/pi-fff",
"npm:@demigodmode/pi-web-agent"
],
"defaultProvider": "ollama",
"defaultModel": "kimi-k2.6:cloud",
"defaultProvider": "ollama-cloud",
"defaultModel": "glm-5.3-flash",
"defaultThinkingLevel": "high",
"subagents": {
"agentOverrides": {
Submodule quickshell/.config/quickshell added at e5f716ed90.
+9
View File
@@ -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>'
}
+113
View File
@@ -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"
+192
View File
@@ -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
View File
@@ -23,8 +23,8 @@ Host code
IdentityFile ~/.ssh/keys/code_ed25519
Host mail
HostName 100.79.210.76
# HostName 100.69.37.217
# HostName 100.79.210.76
HostName 100.69.37.217
port 50105
User liph
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
+48
View File
@@ -0,0 +1,48 @@
[style.description]
underline = false
bold = false
italic = false
[style.command_name]
foreground = "cyan"
underline = false
bold = false
italic = false
[style.example_text]
foreground = "green"
underline = false
bold = false
italic = false
[style.example_code]
foreground = "cyan"
underline = false
bold = false
italic = false
[style.example_variable]
foreground = "cyan"
underline = true
bold = false
italic = false
[display]
compact = false
use_pager = false
show_title = false
placeholder_format = "long"
[display.indent]
base = 2
command = 6
[updates]
auto_update = true
auto_update_interval_hours = 720
archive_source = "https://github.com/tldr-pages/tldr/releases/latest/download"
tls_backend = "rustls-with-webpki-roots"
[directories]
[search]
@@ -0,0 +1,145 @@
" ============================================
" ~/.config/tridactyl/tridactylrc
" (or ~/.tridactylrc if XDG_CONFIG_HOME isn't set)
" Requires the native messenger to auto-load at startup.
" Install it from inside Tridactyl with :installnative,
" then restart LibreWolf (or run :source).
" ============================================
" ============================================
" LEADER KEY: comma (,) as prefix
" ============================================
bind ,h open https://homepage.liphlink.xyz
bind ,H tabopen https://homepage.liphlink.xyz
bind ,a open https://openwebui.liphlink.xyz
bind ,A tabopen https://openwebui.liphlink.xyz
bind ,j open https://jellyfin.liphlink.xyz
bind ,J tabopen https://jellyfin.liphlink.xyz
bind ,p pin
bind ,m mute
" ============================================
" UNDO / REDO & TAB CLOSE
" ============================================
bind x tabclose
bind X undo
bind R reloadhard
" ============================================
" SCROLL THROUGH TABS: forward / backward
" ============================================
bind J tabprev
bind K tabnext
bind gT tabprev
bind gt tabnext
bind g0 tabfirst
bind g$ tablast
bind < gtabmove -1
bind > gtabmove +1
" ============================================
" HISTORY: back / forward
" ============================================
bind H back
bind L forward
" ============================================
" SCROLLING: half-page jumps (vim Ctrl-d / Ctrl-u feel)
" ============================================
bind d scrollpage +0.5
bind u scrollpage -0.5
" ============================================
" RELOADING
" ============================================
bind r reload
" ============================================
" CLIPBOARD & YANKING
" ============================================
bind yy clipboard yank
bind yf hint -y
bind p open --clipboard
bind P tabopen --clipboard
" ============================================
" OTHER HANDY BINDS
" ============================================
bind / fillcmdline find
bind ? fillcmdline find --reverse
bind n findnext --search-from-view
bind N findnext --search-from-view --reverse
bind gn findselect
bind ,<Space> nohlsearch
bind gi focusinput
bind gs viewsource
bind gd tabdetach
bind gD composite tabduplicate; tabdetach
bind zi zoom 1.1
bind zo zoom 0.9
bind zz zoom 100
" ============================================
" SETTINGS
" ============================================
set hintfiltermode vimperator-reflow
set hintnames numeric
set hintdelay 100
set smoothscroll true
set tabsort mru
" ============================================
" PER-SITE TWEAKS
" ============================================
" Google: only hint actual search results
bindurl www.google.com f hint -Jc #search a
bindurl www.google.com F hint -Jbc #search a
" Auto-redirect Reddit to old layout
autocmd DocStart ^http(s?)://www.reddit.com js tri.excmds.urlmodify("-t", "www", "old")
" --- Comfortable scrolling & tabs ---
bind d scrollpage +0.5
bind u scrollpage -0.5
bind x tabclose
bind X undo
bind J tabprev
bind K tabnext
" Detach or duplicate tab to new window
bind gd tabdetach
bind gD composite tabduplicate; tabdetach
" --- Hinting (link selection) ---
set hintfiltermode vimperator-reflow
set hintnames numeric
set hintdelay 100
" --- General behaviour ---
set smoothscroll true
set tabsort mru
" --- Per-site tweaks ---
" Google: only hint actual search results
bindurl www.google.com f hint -Jc #search a
bindurl www.google.com F hint -Jbc #search a
" Auto-redirect reddit to old layout
autocmd DocStart ^http(s?)://www.reddit.com js tri.excmds.urlmodify("-t", "www", "old")
" --- Quickmarks: favourite pages ---
" After defining these, press:
" go<key> -> open in current tab
" gn<key> -> open in new tab
" gw<key> -> open in new window
" quickmark a https://openwebui.liphlink.xyz
" quickmark h https://homepage.liphlink.xyz
" quickmark i https://invidious.liphlink.xyz
" quickmark r https://
" quickmark n https://news.ycombinator.com
" quickmark t https://github.com
+4 -1
View File
@@ -7,7 +7,7 @@ local config = wezterm.config_builder()
config.font_size = 11
config.line_height = 1.22
config.font = wezterm.font("JetBrainsMono Nerd Font")
config.color_scheme = "rose-pine-moon"
config.color_scheme = "Dracula"
config.colors = {
cursor_bg = "#89B482",
@@ -24,6 +24,9 @@ config.window_background_opacity = 0.9
config.window_decorations = "NONE"
config.enable_tab_bar = false
-- No sound on terminal bell (e.g. Backspace over an empty prompt)
config.audible_bell = "Disabled"
-- Key bindings
config.keys = {
{
+19 -25
View File
@@ -1,34 +1,26 @@
window {
margin: 0px;
background-color: #232136;
border-radius: 10px;
border: 2px solid #c4a7e7;
color: #e0def4;
font-family: "JetBrainsMono Nerd Font";
font-size: 20px;
border: 1px solid #bd93f9;
background-color: #282a36;
}
#input {
margin: 5px;
border-radius: 10px;
border: none;
border-radius: 10px;
color: #c4a7e7;
background-color: #393552;
color: #f8f8f2;
background-color: #44475a;
}
#inner-box {
margin: 5px;
border: none;
background-color: #393552;
color: #232136;
border-radius: 5px;
background-color: #282a36;
}
#outer-box {
margin: 15px;
margin: 5px;
border: none;
background-color: #232136;
background-color: #282a36;
}
#scroll {
@@ -39,19 +31,21 @@ window {
#text {
margin: 5px;
border: none;
color: #e0def4;
color: #f8f8f2;
}
#entry.activatable #text {
color: #282a36;
}
#entry > * {
color: #f8f8f2;
}
#entry:selected {
background-color: #eba0ac;
color: #232136;
border-radius: 5px;
outline: none;
background-color: #44475a;
}
#entry:selected * {
background-color: #eba0ac;
color: #232136;
border-radius: 5px;
outline: none;
#entry:selected #text {
font-weight: bold;
}
+1 -1
View File
@@ -2,7 +2,7 @@
require("eza-preview"):setup({})
--- omp ---
require("omp"):setup({ config = "/home/liph/.config/yazi/omp/omp.toml" })
-- require("omp"):setup({ config = "/home/liph/.config/yazi/omp/omp.toml" })
--- yatlint ---
require("yaziline"):setup({
@@ -308,6 +308,7 @@ local EXTS = {
ggs = "application/geogebra.slides",
ggt = "application/geogebra.tool",
ghf = "application/groove-help",
ghostty = "text/text",
gif = "image/gif",
gim = "application/groove-identity-message",
gml = "application/gml+xml",
@@ -404,6 +405,8 @@ local EXTS = {
jxl = "image/jxl",
kar = "audio/midi",
karbon = "application/kde.karbon",
kbd = "text/kbd",
kdl = "text/kdl",
kfo = "application/kde.kformula",
kia = "application/kidspiration",
kml = "application/google-earth.kml+xml",
@@ -846,7 +849,7 @@ local EXTS = {
teacher = "application/smart.teacher",
tei = "application/tei+xml",
teicorpus = "application/tei+xml",
tex = "application/tex",
tex = "text/tex",
texi = "application/texinfo",
texinfo = "application/texinfo",
text = "text/plain",
@@ -1065,16 +1068,14 @@ local EXTS = {
zst = "application/zstd",
}
local options = ya.sync(
function(st)
local options = ya.sync(function(st)
return {
with_files = st.with_files,
with_exts = st.with_exts,
custom_only = st.custom_only,
fallback_file1 = st.fallback_file1,
}
end
)
end)
local M = {}
+1 -1
View File
@@ -90,7 +90,7 @@ rules = [
"reveal",
] },
# Code
{ mime = "application/{json,ndjson,javascript,wine-extension-ini}", use = [
{ mime = "application/{tex,json,ndjson,javascript,wine-extension-ini}", use = [
"edit",
"reveal",
] },
+11 -34
View File
@@ -5,13 +5,20 @@ alias qd='pi --provider ollama-cloud --model deepseek-v4-flash -p'
alias cl='clear'
alias cld='clear && cd'
alias neo='neofetch'
alias mc='musikcube'
alias f='fuck'
alias sma="sudo mount -a"
alias a='aerc'
alias oc='opencode'
alias bi='netbird down && netbird up --management-url https://bird.liphlink.xyz --setup-key 6652328A-1163-4D67-859E-331113224A56'
# notesmd-cli
alias ob='notesmd-cli'
alias obse='ob search -e' ## opens in editor
alias obso='ob search' ## opens in obsidian
alias obss='ob search-content' ## opens in obsidian
alias obsd='ob daily -e'
# colorscheme
alias col='kitten themes'
alias sc='~/scripts/theme-switch'
alias cc='bash -c "$(wget -qO- https://git.io/vQgMr)"'
# Store setup key outside dotfiles (e.g. pass / bitwarden / 1Password).
@@ -39,10 +46,7 @@ alias nv='nvim'
alias soz='source ~/.zshrc'
alias rmm='sudo rm -R'
alias rr='sudo rm -rf'
alias mc='musikcube'
alias mat='tldr'
alias kbu='kbdlight up 50'
alias kbd='kbdlight down 50'
alias tg='~/scripts/bluelight.sh'
# niri brightness config
@@ -55,10 +59,6 @@ alias rebo='sudo grub-mkconfig -o /boot/grub/grub.cfg; reboot'
alias shut='sudo grub-mkconfig -o /boot/grub/grub.cfg; shutdown now'
alias grubb='sudo grub-mkconfig -o /boot/grub/grub.cfg'
# called from ~/scrtipts/
alias nlof="~/scripts/fzf_listoldfiles.sh"
# alias fman="compgen -c | fzf | xargs man"
## herdr
alias hh="herdr"
alias hsa="hh session attach"
@@ -68,13 +68,6 @@ alias hsd="hh session delete"
# alias heh="herdr && herdr-spreader apply [--file ~/.config/herdr/plugins/config/herdr-spreader/home.yml]"
# alias hec="herdr-spreader apply [--file ~/.config/herdr/plugins/config/herdr-spreader/code.yml]"
## tmux
alias ta='tmux attach'
# alias tn='tmux new'
alias tnh='tmuxp load ~/dotfiles/tmux/.tmuxp/home.yaml'
alias tnc='tmuxp load ~/dotfiles/tmux/.tmuxp/coding.yaml'
alias tns='~/scripts/tmux-sessionizer.sh'
# eza
alias lt='eza --tree --level=1 --long --icons --git'
alias ltt='eza --tree --level=2 --long --icons --git'
@@ -127,10 +120,6 @@ alias lsd='sudo mkdir /mount/'
alias lsm='sudo mount /dev/'
alias lsu='sudo umount /mount/'
# streamrip
alias ripp='rip search tidal album'
alias ripc='nvim ~/.config/streamrip/config.toml'
# paru
alias ys='paru -S' # install packoz
alias yr='paru -Rn' # remove package
@@ -168,17 +157,11 @@ alias yd='yt-dlp' # copy link from videodownload helper and add the URL i
alias photodetect='gphoto2 --auto-detect'
alias photoget='gphoto2 --get-all-files'
# borg backup
alias boinit='borg init --encryption repokey' # add folder like /folder/ initiates the backupfunction
alias bolist='borg list' # /backup/ creates a list of al the backups which are contained in this folder
alias boc='borg create --stats --progress --compression lz4' # /backup::backup1 dotfiles creates the backup. The ::backup1 will be name of the backup
# create placeholder sudo borg create --stats --compression lz4 ::{user}-{now} file or folder
alias bomo='borg mount /home/liph/backup /tmp/borg' # which repo to mount and where to mount it. make sure the folder already exists
alias boumo='borg umount /tmp/borg' # unmount the mount folder
# systemctl
alias sysen='sudo systemctl enable'
alias sysst='sudo systemctl start'
alias syss='sudo systemctl status'
alias sysrs='sudo systemctl restart'
# podmand
alias pops='sudo podman ps'
@@ -216,9 +199,3 @@ alias rmc='rm -rf ~/.cache/*' # clear user cache
alias ipa='sudo ip addr add '
alias ipl='sudo ip link set '
alias ipf='sudo ip addr flush '
# wireguard vpn
alias wgu='sudo wg-quick up' # start the connection you like to establish (f.E open)
alias wgd='sudo wg-quick down' # end the connection you like to end (f.E open)
alias wgc='sudo wg showconf' # show the config for a connection (f.E open)
alias wgs='sudo wg show' # show informations about the connection
+2
View File
@@ -52,3 +52,5 @@ export PATH="$HOME/.local/share/nvim/mason/bin:$PATH"
export GTK_FILE_CHOOSER_BACKEND="yazi"
export OPENCODE_CONFIG_DIR=/mnt/flash1/opencode_data/
export TERMINAL=wezterm