Initial import: chezmoi source for CachyOS + Umbriel + Noctalia

Imported from prdlk/dotfiles master (efdd827). Drops the niri, Hyprland/Omarchy,
macOS, and Blume docs-site layers; docs/ is plain Markdown.
This commit is contained in:
Prad Nukala committed 2026-11-02 09:14:11 -05:00
commit ee355bcfd5
152 files changed
+11564

No files matched your search

+414
View File
@@ -0,0 +1,414 @@
filter_mode_shell_up_key_binding = "directory" # or global, host, directory, etc
[dotfiles]
enabled = true
## Base directory for Atuin data files (databases, keys, session, etc.)
## All data file paths default to being relative to this directory.
## linux/mac: ~/.local/share/atuin (or XDG_DATA_HOME/atuin)
## windows: %USERPROFILE%/.local/share/atuin
# data_dir = "~/.local/share/atuin"
## where to store your database, default is your system data directory
## linux/mac: ~/.local/share/atuin/history.db
## windows: %USERPROFILE%/.local/share/atuin/history.db
# db_path = "~/.history.db"
## where to store your encryption key, default is your system data directory
## linux/mac: ~/.local/share/atuin/key
## windows: %USERPROFILE%/.local/share/atuin/key
# key_path = "~/.key"
## where to store your auth session token, default is your system data directory
## linux/mac: ~/.local/share/atuin/session
## windows: %USERPROFILE%/.local/share/atuin/session
# session_path = "~/.session"
## date format used, either "us" or "uk"
# dialect = "us"
## default timezone to use when displaying time
## either "l", "local" to use the system's current local timezone, or an offset
## from UTC in the format of "<+|->H[H][:M[M][:S[S]]]"
## for example: "+9", "-05", "+03:30", "-01:23:45", etc.
# timezone = "local"
## enable or disable automatic sync
auto_sync = true
## enable or disable automatic update checks
update_check = true
## which release channel to follow with `atuin update` and update checks
## "stable" for stable releases only, "nightly" to also receive prereleases
# update_channel = "stable"
## address of the sync server
# sync_address = "https://api.atuin.sh"
## how often to sync history. note that this is only triggered when a command
## is ran, so sync intervals may well be longer
## set it to 0 to sync after every command
# sync_frequency = "5m"
## which search mode to use for interactive search
## possible values: prefix, fulltext, fuzzy, daemon-fuzzy
# search_mode = "fuzzy"
## which search mode to use when atuin is invoked from a shell up-key binding
## the accepted values are identical to those of "search_mode"
## leave unspecified to use same mode set in "search_mode"
# search_mode_shell_up_key_binding = "fuzzy"
## which filter mode to use for interactive search
## possible values: "global", "host", "session", "session-preload", "directory", "workspace"
## consider using search.filters to customize the enablement and order of filter modes
# filter_mode = "global"
## which filter mode to use when atuin is invoked from a shell up-key binding
## the accepted values are identical to those of "filter_mode"
## leave unspecified to use same mode set in "filter_mode"
# filter_mode_shell_up_key_binding = "global"
## With workspace filtering enabled, Atuin will filter for commands executed
## in any directory within a git repository tree (default: false).
##
## To use workspace mode by default when available, set this to true and
## set filter_mode to "workspace" or leave it unspecified and
## set search.filters to include "workspace" before other filter modes.
workspaces = true
## which display style to use
## possible values: auto, full, compact
style = "auto"
## the maximum number of lines the interface should take up
## set it to 0 to always go full screen
# inline_height = 30
## the maximum number of lines the interface should take up
## when atuin is invoked from a shell up-key binding
## the accepted values are identical to those of "inline_height"
inline_height_shell_up_key_binding = 20
## Invert the UI - put the search bar at the top , Default to `false`
# invert = true
## enable or disable showing a preview of the selected command
## useful when the command is longer than the terminal width and is cut off
# show_preview = true
## what to do when the escape key is pressed when searching
## possible values: return-original, return-query
# exit_mode = "return-original"
## possible values: emacs, subl
# word_jump_mode = "emacs"
## characters that count as a part of a word
# word_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
## number of context lines to show when scrolling by pages
# scroll_context_lines = 1
## use ctrl instead of alt as the shortcut modifier key for numerical UI shortcuts
## alt-0 .. alt-9
# ctrl_n_shortcuts = false
## Show numeric shortcuts (1..9) beside list items in the TUI
## set to false to hide the moving numbers if you find them distracting
# show_numeric_shortcuts = true
## default history list format - can also be specified with the --format arg
# history_format = "{time}\t{command}\t{duration}"
## Defaults to true. If enabled, strip trailing spaces and tabs from commands
## before saving them to history.
## Escaped trailing spaces (for example `printf foo\\ `) are preserved.
# strip_trailing_whitespace = true
## prevent commands matching any of these regexes from being written to history.
## Note that these regular expressions are unanchored, i.e. if they don't start
## with ^ or end with $, they'll match anywhere in the command.
## For details on the supported regular expression syntax, see
## https://docs.rs/regex/latest/regex/#syntax
# history_filter = [
# "^secret-cmd",
# "^innocuous-cmd .*--secret=.+",
# ]
## prevent commands run with cwd matching any of these regexes from being written
## to history. Note that these regular expressions are unanchored, i.e. if they don't
## start with ^ or end with $, they'll match anywhere in CWD.
## For details on the supported regular expression syntax, see
## https://docs.rs/regex/latest/regex/#syntax
# cwd_filter = [
# "^/very/secret/area",
# ]
## Configure the maximum height of the preview to show.
## Useful when you have long scripts in your history that you want to distinguish
## by more than the first few lines.
# max_preview_height = 4
## Configure whether or not to show the help row, which includes the current Atuin
## version (and whether an update is available), a keymap hint, and the total
## amount of commands in your history.
# show_help = true
## Configure whether or not to show tabs for search and inspect
# show_tabs = true
## Configure whether or not the tabs row may be auto-hidden, which includes the current Atuin
## tab, such as Search or Inspector, and other tabs you may wish to see. This will
## only be hidden if there are fewer than this count of lines available, and does not affect the use
## of keyboard shortcuts to switch tab. 0 to never auto-hide, default is 8 (lines).
## This is ignored except in `compact` mode.
# auto_hide_height = 8
## Defaults to true. This matches history against a set of default regex, and will not save it if we get a match. Defaults include
## 1. AWS key id
## 2. Github pat (old and new)
## 3. Slack oauth tokens (bot, user)
## 4. Slack webhooks
## 5. Stripe live/test keys
# secrets_filter = true
## Defaults to true. If enabled, upon hitting enter Atuin will immediately execute the command,
## whereas tab will put the command in the prompt for editing.
## If set to false, both enter and tab will place the command in the prompt for editing.
## This applies for new installs. Old installs will keep the old behaviour unless configured otherwise.
enter_accept = true
search_mode = "daemon-fuzzy"
## Defaults to false. If enabled, when triggered after &&, || or |, Atuin will complete commands to chain rather than replace the current line.
# command_chaining = false
## This specifies the keymap on the startup of `atuin search`. If this is set
## to "auto", the startup keymap mode in the Atuin search is automatically
## selected based on the shell's keymap where the keybinding is defined. If
## this is set to "emacs", "vim-insert", or "vim-normal", the startup keymap
## mode in the Atuin search is forced to be the specified one.
# keymap_mode = "emacs"
## Cursor style in each keymap mode. If specified, the cursor style is changed
## in entering the cursor shape. Available values are "default" and
## "{blink,steady}-{block,underline,bar}".
# keymap_cursor = { emacs = "blink-block", vim_insert = "blink-block", vim_normal = "steady-block" }
# network_connect_timeout = 5
# network_timeout = 30
## Extra HTTP headers to send on every request to the sync server. Useful when
## a self-hosted server sits behind a proxy that requires its own auth header,
## e.g. Cloudflare Access. Headers that Atuin sets itself (e.g. Authorization)
## cannot be overridden. When set, cross-origin redirects are refused so these
## headers are never sent to a different origin.
# extra_headers = { "CF-Access-Client-Id" = "...", "CF-Access-Client-Secret" = "..." }
## Timeout (in seconds) for acquiring a local database connection (sqlite)
# local_timeout = 5
## Set this to true and Atuin will minimize motion in the UI - timers will not update live, etc.
## Alternatively, set env NO_MOTION=true
# prefers_reduced_motion = false
## Defaults to true. Configures whether to store commands that failed (those with non-zero exit status) or not.
# store_failed = true
[stats]
## Set commands where we should consider the subcommand for statistics. Eg, kubectl get vs just kubectl
# common_subcommands = [
# "apt",
# "cargo",
# "composer",
# "dnf",
# "docker",
# "dotnet",
# "git",
# "go",
# "ip",
# "jj",
# "kubectl",
# "nix",
# "nmcli",
# "npm",
# "pecl",
# "pnpm",
# "podman",
# "port",
# "systemctl",
# "tmux",
# "yarn",
# ]
## Set commands that should be totally stripped and ignored from stats
# common_prefix = ["sudo"]
## Set commands that will be completely ignored from stats
# ignored_commands = [
# "cd",
# "ls",
# "vi"
# ]
[keys]
# Defaults to true. If disabled, using the up/down key won't exit the TUI when scrolled past the first/last entry.
# scroll_exits = true
# Defaults to true. The left arrow key will exit the TUI when scrolling before the first character
# exit_past_line_start = true
# Defaults to true. The right arrow key performs the same functionality as Tab and copies the selected line to the command line to be modified.
# accept_past_line_end = true
# Defaults to false. The left arrow key performs the same functionality as Tab and copies the selected line to the command line to be modified.
# accept_past_line_start = false
# Defaults to false. The backspace key performs the same functionality as Tab and copies the selected line to the command line to be modified when at the start of the line.
# accept_with_backspace = false
[preview]
## which preview strategy to use to calculate the preview height (respects max_preview_height).
## possible values: auto, static
## auto: length of the selected command.
## static: length of the longest command stored in the history.
## fixed: use max_preview_height as fixed height.
# strategy = "auto"
[daemon]
enabled = true
autostart = true
## Enables using the daemon to sync.
# enabled = false
## Automatically start and manage the daemon when needed.
## Not compatible with `systemd_socket = true`.
# autostart = false
## How often the daemon should sync in seconds
# sync_frequency = 300
## The path to the unix socket used by the daemon (on unix systems)
## linux/mac: ~/.local/share/atuin/atuin.sock
## windows: Not Supported
# socket_path = "~/.local/share/atuin/atuin.sock"
## The daemon pidfile used for lifecycle management.
## Defaults to the Atuin data directory.
# pidfile_path = "~/.local/share/atuin/atuin-daemon.pid"
## Use systemd socket activation rather than opening the given path (the path must still be correct for the client)
## linux: false
## mac/windows: Not Supported
# systemd_socket = false
## The port that should be used for TCP on non unix systems
# tcp_port = 8889
[pty_proxy]
## If enabled, `atuin init` will first re-exec your shell inside `atuin pty-proxy`,
## so you don't need a separate `eval "$(atuin pty-proxy init)"` line in your shell
## config. Supported for bash, zsh, fish and nu on unix platforms.
## For the fastest startup, keep your `atuin init` line near the top of your shell
## config: everything sourced before it runs again inside the proxy.
## Safe to combine with an existing `atuin pty-proxy init` line — the proxy only
## starts once.
enabled = false
[theme]
## Color theme to use for rendering in the terminal.
## There are some built-in themes, including the base theme ("default"),
## "autumn" and "marine". You can add your own themes to the "./themes" subdirectory of your
## Atuin config (or ATUIN_THEME_DIR, if provided) as TOML files whose keys should be one or
## more of AlertInfo, AlertWarn, AlertError, Annotation, Base, Guidance, Important, and
## the string values as lowercase entries from this list:
## https://ogeon.github.io/docs/palette/master/palette/named/index.html
## If you provide a custom theme file, it should be called "NAME.toml" and the theme below
## should be the stem, i.e. `theme = "NAME"` for your chosen NAME.
name = "cherry-blossom"
## Whether the theme manager should output normal or extra information to help fix themes.
## Boolean, true or false. If unset, left up to the theme manager.
# debug = true
[search]
## The list of enabled filter modes, in order of priority.
## The "workspace" mode is skipped when not in a workspace or workspaces = false.
## Default filter mode can be overridden with the filter_mode setting.
# filters = ["global", "host", "session", "workspace", "directory", "session-preload"]
## Filter interactive search results by the shell used to run the command:
##
## - "all": show all commands
##
## - "auto": show commands run by the current type of shell, or commands that
## have no shell recorded (for example, from before Atuin started tracking it)
##
## - array of strings: show commands run by any shell in the array; "" includes
## commands that have no recorded shell
# shells = "auto"
[tmux]
## Enable using atuin with tmux popup (requires tmux >= 3.2)
## When enabled and running inside tmux, Atuin will use a popup window for interactive search.
## Set to false to disable the popup.
## This can also be controlled with the ATUIN_TMUX_POPUP environment variable.
## Note: The tmux popup is currently supported in zsh, bash, and fish shells. This currently doesn't work with iTerm native tmux integration.
enabled = true
## Width of the tmux popup window
## Can be a percentage, or integer (e.g. "100" means 100 characters wide)
width = "80%"
## Height of the tmux popup window
## Can be a percentage, or integer (e.g. "100" means 100 lines tall)
height = "60%"
[ui]
[ai]
enabled = true
## Columns to display in the interactive search, from left to right.
## The selection indicator (" > ") is always shown first implicitly.
##
## Each column can be specified as a simple string (uses default width)
## or as an object with type, width, and expand:
## { type = "directory", width = 30, expand = true }
##
## Available column types (with default widths):
## duration (5) - Command execution duration (e.g., "123ms")
## time (8) - Relative time since execution (e.g., "59m ago")
## datetime (16) - Absolute timestamp (e.g., "2025-01-22 14:35")
## directory (20) - Working directory (truncated if too long)
## host (15) - Hostname where command was run
## user (10) - Username
## exit (3) - Exit code (colored by success/failure)
## command (*) - The command itself (expands by default)
##
## The "expand" option (default: true for command, false for others) makes a
## column fill remaining space. Only one column should have expand = true.
##
## Default:
# columns = ["duration", "time", "command"]
##
## Examples:
##
## Minimal - more space for commands:
# columns = ["duration", "command"]
##
## With wider directory column:
# columns = ["duration", { type = "directory", width = 30 }, "command"]
##
## Show host for multi-machine sync users:
# columns = ["duration", "time", "host", "command"]
##
## Show exit codes prominently:
# columns = ["exit", "duration", "command"]
##
## Make directory expand instead of command:
# columns = ["duration", "time", { type = "directory", expand = true }, { type = "command", expand = false }]
## Syntax highlight commands in the search results, using the theme's colors.
## Not available on all platforms (e.g. Windows).
syntax_highlight = true
@@ -0,0 +1,18 @@
[theme]
name = "cherry-blossom"
[colors]
AlertInfo = "#a78266"
AlertWarn = "#ae825f"
AlertError = "#bf615d"
Annotation = "#a6958f"
Guidance = "#8f9aa0"
Important = "#cf716f"
Title = "#cf716f"
Muted = "#a6958f"
SyntaxCommand = "#cf716f"
SyntaxFlag = "#a78266"
SyntaxString = "#a6b084"
SyntaxVariable = "#c17e4a"
SyntaxOperator = "#ad6756"
SyntaxComment = "#a6958f"
+18
View File
@@ -0,0 +1,18 @@
[theme]
name = "cyberdream"
[colors]
AlertInfo = "#5ef1ff"
AlertWarn = "#f1ff5e"
AlertError = "#ff6e5e"
Annotation = "#7b8496"
Guidance = "#5ea1ff"
Important = "#ff5ef1"
Title = "#5ef1ff"
Muted = "#7b8496"
SyntaxCommand = "#5ea1ff"
SyntaxFlag = "#5ef1ff"
SyntaxString = "#5eff6c"
SyntaxVariable = "#ff5ef1"
SyntaxOperator = "#ff5ea0"
SyntaxComment = "#7b8496"
+8
View File
@@ -0,0 +1,8 @@
# c: clear with no args, cd with one.
c() {
if [ -z "${1-}" ]; then
clear
else
cd "$1"
fi
}
+23
View File
@@ -0,0 +1,23 @@
# cd with zoxide fallback, else builtin cd.
cd() {
local rc target
if [ $# -eq 0 ]; then
builtin cd "$HOME"
elif [ "$1" = - ]; then
builtin cd -
elif builtin cd "$1" 2>/dev/null; then
: # exact path resolved, nothing else to do
elif command -v zoxide >/dev/null 2>&1; then
target=$(zoxide query -- "$1" 2>/dev/null)
if [ -n "$target" ]; then
builtin cd "$target"
else
builtin cd "$1" # let builtin cd surface the real error
fi
else
builtin cd "$1"
fi
rc=$?
command -v zoxide >/dev/null 2>&1 && zoxide add "$PWD" 2>/dev/null
return $rc
}
+27
View File
@@ -0,0 +1,27 @@
# Re-run last command, copy output to clipboard.
# History-offset handling: some line editors add the current command to
# history before execution, some after — detect instead of assuming.
clip-last() {
local last copy
last=$(fc -ln -1 -1 2>/dev/null)
last=${last#"${last%%[![:space:]]*}"} # trim leading whitespace
case $last in
clip-last*)
last=$(fc -ln -2 -2 2>/dev/null)
last=${last#"${last%%[![:space:]]*}"}
;;
esac
if [ -z "$last" ]; then
echo "clip-last: no previous command in history" >&2
return 1
fi
if command -v wl-copy >/dev/null 2>&1; then
copy=wl-copy
else
echo "clip-last: no clipboard tool (wl-copy) found" >&2
return 1
fi
eval "$last" | "$copy"
command -v notify-send >/dev/null 2>&1 \
&& notify-send -a shell "Clipboard" "Command output copied to clipboard"
}
+8
View File
@@ -0,0 +1,8 @@
# ghq get + cd; clone/path logic lives in ~/.local/bin/ghg-clone.
# (helper is not named ghg: an unrelated cargo binary owns that name)
ghg() {
local dir
dir=$(ghg-clone "$@") || return
cd "$dir" || return
clear && onefetch
}
+6
View File
@@ -0,0 +1,6 @@
# Create a repo (prad.codes/github.com) + cd; logic lives in ~/.local/bin/ghn.
ghn() {
local dir
dir=$(command ghn "$@") || return
cd "$dir" || return
}
+11
View File
@@ -0,0 +1,11 @@
# Pick a ghq repo / Obsidian vault with tv (ghq-repos cable) + cd.
gho() {
local dir
dir=$(tv ghq-repos --inline) || return
[ -n "$dir" ] || return 1
cd "$dir" || return
clear
if [ -d .git ]; then
onefetch
fi
}
+11
View File
@@ -0,0 +1,11 @@
# yazi wrapper: cd to the directory yazi was left in on exit.
yy() {
local tmp cwd
tmp=$(mktemp -t "yazi-cwd.XXXXXX")
command yazi "$@" --cwd-file="$tmp"
cwd=$(cat -- "$tmp" 2>/dev/null)
if [ -n "$cwd" ] && [ "$cwd" != "$PWD" ] && [ -d "$cwd" ]; then
builtin cd -- "$cwd"
fi
rm -f -- "$tmp"
}
+96
View File
@@ -0,0 +1,96 @@
# ~/.config/bash/keybinds.bash — readline ports of the television keys in
# fish_user_key_bindings.fish / zsh keybinds.zsh:
# ctrl-o → gho (ghq-repos cable, cd) ctrl-e → tv git-files (nvim)
# ctrl-p → pj (pj cable) down → pj on an empty prompt
# ctrl-t → tv smart autocomplete (tv init bash ships no ctrl-t)
# Keys owned by kitty.conf never reach the shell: ctrl-h/j/k/l (pass_keys.py).
#
# Every picker runs tv --inline: it opens on the line below the prompt and
# leaves the cursor on that line when it exits. When nothing was printed
# below, the binding steps back up (_kb_up) so readline redraws the prompt in
# place after bind -x; output that must stay (a pj task) is left alone.
_kb_up() { printf '\033[A' >/dev/tty; }
# ctrl-e: enter opens nvim, which restores the cursor to tv's line.
_kb_git_files() {
tv git-files --inline </dev/tty
_kb_up
}
bind -x '"\C-e": _kb_git_files'
# ctrl-p, and down on an empty prompt. pj reports through $PJ_STATE: `open`
# = cancelled, `ran` = a task printed output, empty = no task sources.
_kb_pj() {
local state
state=$(mktemp) || return
PJ_STATE=$state pj "$@" </dev/tty
[ "$(<"$state")" = open ] && _kb_up
rm -f "$state"
}
bind -x '"\C-p": _kb_pj'
# ctrl-o: gho, split so the prompt is right. bind -x runs in the shell
# process, so the cd persists — but readline keeps drawing the prompt it
# started with. The macro runs \C-x1 (pick with tv, cd), then \C-x2 and \C-x3,
# which _kb_gho rebinds: after a cd, \C-x2 accepts the stashed-empty line
# (bash prints a fresh prompt for the new cwd; nothing reaches history) and
# \C-x3 does gho's clear + onefetch, after which readline redraws that fresh
# prompt below the output; when cancelled both just redraw. \C-x0 restores
# the typed text.
_kb_gho() {
local dir
_kb_line=$READLINE_LINE _kb_point=$READLINE_POINT
dir=$(tv ghq-repos --inline </dev/tty)
_kb_up
if [ -n "$dir" ] && cd "$dir"; then
READLINE_LINE='' READLINE_POINT=0
bind '"\C-x2": accept-line'
bind -x '"\C-x3": _kb_gho_show'
else
bind '"\C-x2": redraw-current-line'
bind '"\C-x3": redraw-current-line'
fi
}
_kb_gho_show() {
clear
if [ -d .git ]; then
onefetch
fi
}
_kb_restore() {
READLINE_LINE=${_kb_line-} READLINE_POINT=${_kb_point-0}
unset _kb_line _kb_point
}
bind -x '"\C-x1": _kb_gho'
bind -x '"\C-x0": _kb_restore'
bind '"\C-o": "\C-x1\C-x2\C-x3\C-x0"'
# down: the pj cable on an idle, empty prompt, otherwise history search
# (fish's _pj_bind_down). bind -x can't call readline functions, so _kb_down
# rebinds \C-x5, which the macro sends right after it.
_kb_down() {
if [ -n "$READLINE_LINE" ]; then
bind '"\C-x5": history-search-forward'
return
fi
PJ_QUIET=1 _kb_pj
bind '"\C-x5": redraw-current-line'
}
bind -x '"\C-x4": _kb_down'
bind '"\e[B": "\C-x4\C-x5"'
bind '"\eOB": "\C-x4\C-x5"'
# ctrl-t: pick with the channel tv guesses from the text left of the cursor
# (shell_integration.channel_triggers) and insert the picks there, quoted.
_kb_tv_autocomplete() {
local pre=${READLINE_LINE:0:READLINE_POINT} out item ins=''
out=$(tv --autocomplete-prompt "$pre" --inline </dev/tty)
_kb_up
while IFS= read -r item; do
[ -n "$item" ] && ins+="$(printf '%q' "$item") "
done <<<"$out"
READLINE_LINE=$pre$ins${READLINE_LINE:READLINE_POINT}
READLINE_POINT=$((${#pre} + ${#ins}))
}
bind -x '"\C-t": _kb_tv_autocomplete'
+25
View File
@@ -0,0 +1,25 @@
# This is `bat`s configuration file. Each line either contains a comment or
# a command-line option that you want to pass to `bat` by default. You can
# run `bat --help` to get a list of all possible configuration options.
# Specify desired highlighting theme (e.g. "TwoDark"). Run `bat --list-themes`
# for a list of all available themes
--theme="cyberdream"
# Enable this to use italic text on the terminal. This is not supported on all
# terminal emulators (like tmux, by default):
#--italic-text=always
# Uncomment the following line to disable automatic paging:
#--paging=never
# Uncomment the following line if you are using less version >= 551 and want to
# enable mouse scrolling support in `bat` when running inside tmux. This might
# disable text selection, unless you press shift.
#--pager="less --RAW-CONTROL-CHARS --quit-if-one-screen --mouse"
# Syntax mappings: map a certain filename pattern to a language.
# Example 1: use the C++ syntax for Arduino .ino files
# Example 2: Use ".gitignore"-style highlighting for ".ignore" files
#--map-syntax "*.ino:C++"
#--map-syntax ".ignore:Git Ignore"
+937
View File
@@ -0,0 +1,937 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>name</key>
<string>Cyberdream</string>
<key>settings</key>
<array>
<dict>
<key>settings</key>
<dict>
<key>background</key>
<string>#16181a</string>
<key>caret</key>
<string>#ffffff</string>
<key>block_caret</key>
<string>#7b8496</string>
<key>foreground</key>
<string>#ffffff</string>
<key>invisibles</key>
<string>#16181a</string>
<key>lineHighlight</key>
<string>#3c4048</string>
<key>selection</key>
<string>#3c4048</string>
<key>findHighlight</key>
<string>#5ef1ff</string>
<key>findHighlightForeground</key>
<string>#1e2124</string>
<key>selectionBorder</key>
<string>#16181a</string>
<key>activeGuide</key>
<string>#ffbd5e</string>
<key>bracketsForeground</key>
<string>#ff5ea0</string>
<key>bracketsOptions</key>
<string>underline</string>
<key>bracketContentsForeground</key>
<string>#ffffff</string>
<key>bracketContentsOptions</key>
<string>underline</string>
<key>tagsOptions</key>
<string>stippled_underline</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Comment</string>
<key>scope</key>
<string>comment</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#7b8496</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>String</string>
<key>scope</key>
<string>string</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#5eff6c</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Number</string>
<key>scope</key>
<string>constant.numeric</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ffffff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Built-in constant</string>
<key>scope</key>
<string>constant.language</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ffffff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>User-defined constant</string>
<key>scope</key>
<string>constant.character, constant.other</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ffffff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable</string>
<key>scope</key>
<string>variable</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Ruby's @variable</string>
<key>scope</key>
<string>variable.other.readwrite.instance</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#ffbd5e</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>String interpolation</string>
<key>scope</key>
<string>constant.character.escaped, constant.character.escape, string source, string source.ruby</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#ff5ef1</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Ruby Regexp</string>
<key>scope</key>
<string>source.ruby string.regexp.classic.ruby,source.ruby string.regexp.mod-r.ruby</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#ff6e5e</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Keyword</string>
<key>scope</key>
<string>keyword</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ffbd5e</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Keyword Operator</string>
<key>scope</key>
<string>keyword.operator</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#bd5eff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage</string>
<key>scope</key>
<string>storage</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#ff5ea0</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage type</string>
<key>scope</key>
<string>storage.type</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#5ef1ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage Type Namespace</string>
<key>scope</key>
<string>storage.type.namespace</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#bd5eff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage Type Class</string>
<key>scope</key>
<string>storage.type.class</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#bd5eff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Class name</string>
<key>scope</key>
<string>entity.name.class</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>underline</string>
<key>foreground</key>
<string>#bd5eff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Meta Path</string>
<key>scope</key>
<string>meta.path</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>underline</string>
<key>foreground</key>
<string>#5ef1ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Inherited class</string>
<key>scope</key>
<string>entity.other.inherited-class</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic underline</string>
<key>foreground</key>
<string>#bd5eff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function name</string>
<key>scope</key>
<string>entity.name.function</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#5ea1ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function argument</string>
<key>scope</key>
<string>variable.parameter</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#bd5eff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag name</string>
<key>scope</key>
<string>entity.name.tag</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#5ef1ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag attribute</string>
<key>scope</key>
<string>entity.other.attribute-name</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#5ef1ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library function</string>
<key>scope</key>
<string>support.function</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#5ea1ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library constant</string>
<key>scope</key>
<string>support.constant</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#ffffff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library class&#x2f;type</string>
<key>scope</key>
<string>support.type, support.class</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#bd5eff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library variable</string>
<key>scope</key>
<string>support.other.variable</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Support Other Namespace</string>
<key>scope</key>
<string>support.other.namespace</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#bd5eff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Invalid</string>
<key>scope</key>
<string>invalid</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#ff5ea0</string>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#ffffff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Invalid deprecated</string>
<key>scope</key>
<string>invalid.deprecated</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#bd5eff</string>
<key>foreground</key>
<string>#ffffff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>JSON String</string>
<key>scope</key>
<string>meta.structure.dictionary.json string.quoted.double.json</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ffffff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>diff.header</string>
<key>scope</key>
<string>meta.diff, meta.diff.header</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#7b8496</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>diff.deleted</string>
<key>scope</key>
<string>markup.deleted</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ff6e5e</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>diff.inserted</string>
<key>scope</key>
<string>markup.inserted</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#5eff6c</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>diff.changed</string>
<key>scope</key>
<string>markup.changed</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#5ef1ff</string>
</dict>
</dict>
<dict>
<key>scope</key>
<string>constant.numeric.line-number.find-in-files - match</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ff5ef1</string>
</dict>
</dict>
<dict>
<key>scope</key>
<string>entity.name.filename</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#5eff6c</string>
</dict>
</dict>
<dict>
<key>scope</key>
<string>message.error</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ff6e5e</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>JSON Punctuation</string>
<key>scope</key>
<string>punctuation.definition.string.begin.json - meta.structure.dictionary.value.json, punctuation.definition.string.end.json - meta.structure.dictionary.value.json</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ffffff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>JSON Structure</string>
<key>scope</key>
<string>meta.structure.dictionary.json string.quoted.double.json</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ffffff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>JSON String</string>
<key>scope</key>
<string>meta.structure.dictionary.value.json string.quoted.double.json</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ffffff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>JSON: 6 deep</string>
<key>scope</key>
<string>meta meta meta meta meta meta meta.structure.dictionary.value string</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ff5ea0</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>JSON: 5 deep</string>
<key>scope</key>
<string>meta meta meta meta meta meta.structure.dictionary.value string</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ff5ef1</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>JSON: 4 deep</string>
<key>scope</key>
<string>meta meta meta meta meta.structure.dictionary.value string</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#bd5eff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>JSON: 3 deep</string>
<key>scope</key>
<string>meta meta meta meta.structure.dictionary.value string</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#5ea1ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>JSON: 2 deep</string>
<key>scope</key>
<string>meta meta meta.structure.dictionary.value string</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#5ef1ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>JSON: 1 deep</string>
<key>scope</key>
<string>meta meta.structure.dictionary.value string</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ffbd5e</string>
</dict>
</dict>
<!-- Markdown Tweaks -->
<dict>
<key>name</key>
<string>Markup: strike</string>
<key>scope</key>
<string>markup.strike</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#ffbd5e</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markup: bold</string>
<key>scope</key>
<string>markup.bold</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>bold</string>
<key>foreground</key>
<string>#ffbd5e</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markup: italic</string>
<key>scope</key>
<string>markup.italic</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#ffbd5e</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown: heading</string>
<key>scope</key>
<string>markup.heading</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ffbd5e</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown: List Items Punctuation</string>
<key>scope</key>
<string>punctuation.definition.list_item.markdown</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ff5ea0</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown: Blockquote</string>
<key>scope</key>
<string>markup.quote</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#ffffff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown: Blockquote Punctuation</string>
<key>scope</key>
<string>punctuation.definition.blockquote.markdown</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#ffffff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown: Separator</string>
<key>scope</key>
<string>meta.separator</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#7b8496</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markup: raw inline</string>
<key>scope</key>
<string>text.html.markdown markup.raw.inline</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#5eff6c</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markup: underline</string>
<key>scope</key>
<string>markup.underline</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>underline</string>
<key>foreground</key>
<string>#bd5eff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markup: Raw block</string>
<key>scope</key>
<string>markup.raw.block</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ffffff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown: Raw Block fenced source</string>
<key>scope</key>
<string>markup.raw.block.fenced.markdown source</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ffffff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown: Fenced Bode Block</string>
<key>scope</key>
<string>punctuation.definition.fenced.markdown, variable.language.fenced.markdown</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#7b8496</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown: Fenced Language</string>
<key>scope</key>
<string>variable.language.fenced.markdown</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#7b8496</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation Accessor</string>
<key>scope</key>
<string>punctuation.accessor</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ff5ea0</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Meta Function Return Type</string>
<key>scope</key>
<string>meta.function.return-type</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#bd5eff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation Section Block Begin</string>
<key>scope</key>
<string>punctuation.section.block.begin</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ffffff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation Section Block End</string>
<key>scope</key>
<string>punctuation.section.block.end</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ffffff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation Section Embedded Begin</string>
<key>scope</key>
<string>punctuation.section.embedded.begin</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ff5ea0</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation Section Embedded End</string>
<key>scope</key>
<string>punctuation.section.embedded.end</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ff5ea0</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation Separator Namespace</string>
<key>scope</key>
<string>punctuation.separator.namespace</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ff5ea0</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable Function</string>
<key>scope</key>
<string>variable.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#5ea1ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable Other</string>
<key>scope</key>
<string>variable.other</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ffffff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable Language</string>
<key>scope</key>
<string>variable.language</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#bd5eff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Entity Name Module Ruby</string>
<key>scope</key>
<string>entity.name.module.ruby</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#5ef1ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Entity Name Constant Ruby</string>
<key>scope</key>
<string>entity.name.constant.ruby</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#5ea1ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Support Function Builtin Ruby</string>
<key>scope</key>
<string>support.function.builtin.ruby</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ffffff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage Type Namespace CS</string>
<key>scope</key>
<string>storage.type.namespace.cs</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ff5ea0</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Entity Name Namespace CS</string>
<key>scope</key>
<string>entity.name.namespace.cs</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#5ef1ff</string>
</dict>
</dict>
</array>
<key>uuid</key>
<string>68394a4e-1404-4971-bdfc-81dd7f9d29f6</string>
<key>colorSpaceName</key>
<string>sRGB</string>
<key>semanticClass</key>
<string>theme.cyberdream</string>
<key>author</key>
<string>Scott McKendry</string>
</dict>
</plist>
+4
View File
@@ -0,0 +1,4 @@
# drydock: scan the ghq root (~/Code/<host>/<owner>/<repo>, depth 3) directly,
# not the ~/Projects symlink farm. Everything else stays at drydock's defaults
# (`drydock config show` prints them).
roots = ["~/Code"]
+1
Submodule dot_config/fish added at 87d8aa0e9c.
+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<match target="pattern">
<test name="family" qual="any">
<string>monospace</string>
</test>
<edit name="family" mode="prepend_first" binding="strong">
<string>VictorMono Nerd Font</string>
</edit>
</match>
</fontconfig>
+95
View File
@@ -0,0 +1,95 @@
prSections:
- title: My Pull Requests
filters: is:open author:@me
- title: Needs My Review
filters: is:open review-requested:@me
- title: Involved
filters: is:open involves:@me -author:@me
issuesSections:
- title: My Issues
filters: is:open author:@me
- title: Assigned
filters: is:open assignee:@me
- title: Involved
filters: is:open involves:@me -author:@me
notificationsSections:
- title: All
filters: ""
- title: Created
filters: reason:author
- title: Participating
filters: reason:participating
- title: Mentioned
filters: reason:mention
- title: Review Requested
filters: reason:review-requested
- title: Assigned
filters: reason:assign
- title: Subscribed
filters: reason:subscribed
- title: Team Mentioned
filters: reason:team-mention
repo:
branchesRefetchIntervalSeconds: 30
prsRefetchIntervalSeconds: 60
defaults:
preview:
open: true
width: 0.45
prsLimit: 20
prApproveComment: LGTM
issuesLimit: 20
notificationsLimit: 20
view: prs
layout:
prs:
updatedAt:
width: 5
createdAt:
width: 5
repo:
width: 20
author:
width: 15
authorIcon:
hidden: false
assignees:
width: 20
hidden: true
base:
width: 15
hidden: true
lines:
width: 15
issues:
updatedAt:
width: 5
createdAt:
width: 5
repo:
width: 15
creator:
width: 10
creatorIcon:
hidden: false
assignees:
width: 20
hidden: true
refetchIntervalMinutes: 30
keybindings:
prs:
- key: T
command: gh enhance -R {{.RepoName}} {{.PrNumber}}
repoPaths: {}
theme:
ui:
sectionsShowCount: true
table:
showSeparator: true
compact: false
pager:
diff: "hunk pager"
confirmQuit: false
showAuthorIcons: true
smartFilteringAtLaunch: true
includeReadNotifications: true
+27
View File
@@ -0,0 +1,27 @@
# The current version of the config schema
version: 1
# What protocol to use when performing git operations. Supported values: ssh, https
git_protocol: https
# What editor gh should run when creating issues, pull requests, etc. If blank, will refer to environment.
editor:
# When to interactively prompt. This is a global config that cannot be overridden by hostname. Supported values: enabled, disabled
prompt: enabled
# Preference for editor-based interactive prompting. This is a global config that cannot be overridden by hostname. Supported values: enabled, disabled
prefer_editor_prompt: disabled
# A pager program to send command output to, e.g. "less". If blank, will refer to environment. Set the value to "cat" to disable the pager.
pager:
# Aliases allow you to create nicknames for gh commands
aliases:
co: pr checkout
# The path to a unix socket through which to send HTTP connections. If blank, HTTP traffic will be handled by net/http.DefaultTransport.
http_unix_socket:
# What web browser gh should use when opening URLs. If blank, will refer to environment.
browser:
# Whether to display labels using their RGB hex color codes in terminals that support truecolor. Supported values: enabled, disabled
color_labels: disabled
# Whether customizable, 4-bit accessible colors should be used. Supported values: enabled, disabled
accessible_colors: disabled
# Whether an accessible prompter should be used. Supported values: enabled, disabled
accessible_prompter: disabled
# Whether to use a animated spinner as a progress indicator. If disabled, a textual progress indicator is used instead. Supported values: enabled, disabled
spinner: enabled
+2
View File
@@ -0,0 +1,2 @@
GOPATH={{ .chezmoi.homeDir }}/.local/share/go
GOBIN={{ .chezmoi.homeDir }}/.local/share/go/bin
+10
View File
@@ -0,0 +1,10 @@
# ── herdr-nvim (chmarax.herdr-nvim) ──
# Read by the plugin binary from $XDG_CONFIG_HOME/herdr-nvim/config.toml.
# Bound to ctrl+shift+e in kitty/ghostty → prefix+e (\x02e) → herdr-nvim.toggle.
[sidebar]
# The nvim pane opens to the LEFT of the existing panes. The plugin collapses
# the tab's current layout into one anchor group, splits the editor off it, and
# for "left" round-trips the anchor through a temporary tab so nvim ends up on
# the left edge and the previous panes sit to its right. Default is "right".
position = "left"
+12
View File
@@ -0,0 +1,12 @@
theme = "auto" # any built-in theme id, auto, or custom
mode = "auto" # auto, split, stack
vcs = "git" # git, jj, sl
watch = false
exclude_untracked = true
line_numbers = true
tab_width = 4 # tab stops, 1-16
wrap_lines = false
menu_bar = true
agent_notes = true
prompt_save_view_preferences = false
transparent_background = true
+4
View File
@@ -0,0 +1,4 @@
{
"version": 1,
"lastSeenCliVersion": "0.18.2"
}
+11
View File
@@ -0,0 +1,11 @@
gui:
border: rounded
theme:
activeBorderColor:
- "#cf716f"
inactiveBorderColor:
- "#a6958f"
selectedLineBgColor:
- "#453130"
optionsTextColor:
- "#a6958f"
+498
View File
@@ -0,0 +1,498 @@
gui:
border: rounded
theme:
activeBorderColor:
- "#cf716f"
inactiveBorderColor:
- "#a6958f"
searchingActiveBorderColor:
- "#c17e4a"
optionsTextColor:
- "#a6958f"
selectedLineBgColor:
- "#453130"
cherryPickedCommitBgColor:
- "#453130"
cherryPickedCommitFgColor:
- "#ad6756"
unstagedChangesColor:
- "#ae825f"
defaultFgColor:
- "#dcc1b7"
authorColors:
"*": "#dcc1b7" # The number of lines you scroll by when scrolling the main window
scrollHeight: 2
# If true, allow scrolling past the bottom of the content in the main window
scrollPastBottom: true
# See https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md#scroll-off-margin
scrollOffMargin: 2
# One of: 'margin' (default) | 'jump'
scrollOffBehavior: margin
# If true, capture mouse events.
# When mouse events are captured, it's a little harder to select text: e.g. requiring you to hold the shift key.
mouseEvents: true
# If true, do not show a warning when discarding changes in the staging view.
skipDiscardChangeWarning: true
# If true, do not show warning when applying/popping the stash
skipStashWarning: true
# If true, do not show a warning when attempting to commit without any staged files; instead stage all unstaged files.
skipNoStagedFilesWarning: false
# If true, do not show a warning when rewording a commit via an external editor
skipRewordInEditorWarning: false
# Fraction of the total screen width to use for the left side section. You may want to pick a small number (e.g. 0.2) if you're using a narrow screen, so that you can see more of the main section.
# Number from 0 to 1.0.
sidePanelWidth: 0.4
# If true, increase the height of the focused side window; creating an accordion effect.
expandFocusedSidePanel: true
# The weight of the expanded side panel, relative to the other panels. 2 means
# twice as tall as the other panels. Only relevant if `expandFocusedSidePanel` is true.
expandedSidePanelWeight: 2
# Sometimes the main window is split in two (e.g. when the selected file has both staged and unstaged changes). This setting controls how the two sections are split.
# Options are:
# - 'horizontal': split the window horizontally
# - 'vertical': split the window vertically
# - 'flexible': (default) split the window horizontally if the window is wide enough, otherwise split vertically
mainPanelSplitMode: horizontal
# How the window is split when in half screen mode (i.e. after hitting '+' once).
# Possible values:
# - 'left': split the window horizontally (side panel on the left, main view on the right)
# - 'top': split the window vertically (side panel on top, main view below)
enlargedSideViewLocation: left
# One of 'auto' (default) | 'en' | 'zh-CN' | 'zh-TW' | 'pl' | 'nl' | 'ja' | 'ko' | 'ru'
language: auto
# Format used when displaying time e.g. commit time.
# Uses Go's time format syntax: https://pkg.go.dev/time#Time.Format
timeFormat: 02 Jan 06
# Format used when displaying time if the time is less than 24 hours ago.
# Uses Go's time format syntax: https://pkg.go.dev/time#Time.Format
shortTimeFormat: 3:04PM
# Config relating to colors and styles.
# See https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md#color-attributes
# Config relating to the commit length indicator
commitLength:
# If true, show an indicator of commit message length
show: true
# If true, show the '5 of 20' footer at the bottom of list views
showListFooter: true
# If true, display the files in the file views as a tree. If false, display the files as a flat list.
# This can be toggled from within Lazygit with the '~' key, but that will not change the default.
showFileTree: true
# If true, show a random tip in the command log when Lazygit starts
showRandomTip: false
# If true, show the command log
showCommandLog: true
# If true, show the bottom line that contains keybinding info and useful buttons. If false, this line will be hidden except to display a loader for an in-progress action.
showBottomLine: false
# If true, show jump-to-window keybindings in window titles.
showPanelJumps: false
# Deprecated: use nerdFontsVersion instead
showIcons: true
# Nerd fonts version to use.
# One of: '2' | '3' | empty string (default)
# If empty, do not show icons.
nerdFontsVersion: "3"
# If true (default), file icons are shown in the file views. Only relevant if NerdFontsVersion is not empty.
showFileIcons: true
# Length of author name in (non-expanded) commits view. 2 means show initials only.
commitAuthorShortLength: 2
# Length of author name in expanded commits view. 2 means show initials only.
commitAuthorLongLength: 17
# Length of commit hash in commits view. 0 shows '*' if NF icons aren't on.
commitHashLength: 8
# If true, show commit hashes alongside branch names in the branches view.
showBranchCommitHash: true
# Whether to show the divergence from the base branch in the branches view.
# One of: 'none' | 'onlyArrow' | 'arrowAndNumber'
showDivergenceFromBaseBranch: arrowAndNumber
# Height of the command log view
commandLogSize: 4
# Whether to split the main window when viewing file changes.
# One of: 'auto' | 'always'
# If 'auto', only split the main window when a file has both staged and unstaged changes
splitDiff: auto
# Default size for focused window. Window size can be changed from within Lazygit with '+' and '_' (but this won't change the default).
# One of: 'normal' (default) | 'half' | 'full'
screenMode: normal
# If true, show a seriously epic explosion animation when nuking the working tree.
animateExplosion: true
# Whether to stack UI components on top of each other.
# One of 'auto' (default) | 'always' | 'never'
portraitMode: auto
# How things are filtered when typing '/'.
# One of 'substring' (default) | 'fuzzy'
filterMode: fuzzy
# Config relating to the spinner.
spinner:
# The frames of the spinner animation.
frames:
- "|"
- /
- "-"
- \
# The "speed" of the spinner in milliseconds.
rate: 50
# Status panel view.
# One of 'dashboard' (default) | 'allBranchesLog'
statusPanelView: allBranchesLog
# Config relating to git
git:
# See https://github.com/jesseduffield/lazygit/blob/master/docs/Custom_Pagers.md
diffRenderers:
# - pager: critique --stdin
- # Value of the --color arg in the git diff command. Some pagers want this to be set to 'always' and some want it set to 'never'
colorArg: always
command: delta --dark --paging=never
# e.g.
# diff-so-fancy
# delta --dark --paging=never
# ydiff -p cat -s --wrap --width={{columnWidth}}
# - pager: "git diff | git-split-diffs --color | less -RFX"
# If true, Lazygit will use whatever pager is specified in `$GIT_PAGER`, `$PAGER`, or your *git config*. If the pager ends with something like ` | less` we will strip that part out, because less doesn't play nice with our rendering approach. If the custom pager uses less under the hood, that will also break rendering (hence the `--paging=never` flag for the `delta` pager).
# Config relating to committing
commit:
# If true, pass '--signoff' flag when committing
signOff: false
# Automatic WYSIWYG wrapping of the commit message as you type
autoWrapCommitMessage: true
# If autoWrapCommitMessage is true, the width to wrap to
autoWrapWidth: 72
# Config relating to merging
merging:
# If true, run merges in a subprocess so that if a commit message is required, Lazygit will not hang
# Only applicable to unix users.
manualCommit: false
# Extra args passed to `git merge`, e.g. --no-ff
args: ""
# The commit message to use for a squash merge commit. Can contain "{{selectedRef}}" and "{{currentBranch}}" placeholders.
squashMergeMessage: Squash merge {{selectedRef}} into {{currentBranch}}
# list of branches that are considered 'main' branches, used when displaying commits
mainBranches:
- develop # git flow
# Prefix to use when skipping hooks. E.g. if set to 'WIP', then pre-commit hooks will be skipped when the commit message starts with 'WIP'
skipHookPrefix: WIP
# If true, periodically fetch from remote
autoFetch: true
# If true, periodically refresh files and submodules
autoRefresh: true
# If true, pass the --all arg to git fetch
fetchAll: true
# Command used when displaying the current branch git log in the main window
branchLogCmd: git log --graph --color=always --abbrev-commit --decorate --date=relative --pretty=medium {{branchName}} --
# If true, do not spawn a separate process when using GPG
overrideGpg: false
# If true, do not allow force pushes
disableForcePushing: false
# See https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md#predefined-commit-message-prefix
commitPrefix:
- # pattern to match on. E.g. for 'feature/AB-123' to match on the AB-123 use "^\\w+\\/(\\w+-\\w+).*"
pattern: ""
# Replace directive. E.g. for 'feature/AB-123' to start the commit message with 'AB-123 ' use "[$1] "
replace: ""
# See https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md#predefined-branch-name-prefix
branchPrefix: ""
# If true, parse emoji strings in commit messages e.g. render :rocket: as 🚀
# (This should really be under 'gui', not 'git')
parseEmoji: true
# Config for showing the log in the commits view
log:
# One of: 'date-order' | 'author-date-order' | 'topo-order' | 'default'
# 'topo-order' makes it easier to read the git log graph, but commits may not
# appear chronologically. See https://git-scm.com/docs/
#
# Deprecated: Configure this with `Log menu -> Commit sort order` (<c-l> in the commits window by default).
order: topo-order
# This determines whether the git graph is rendered in the commits panel
# One of 'always' | 'never' | 'when-maximised'
#
# Deprecated: Configure this with `Log menu -> Show git graph` (<c-l> in the commits window by default).
showGraph: always
# displays the whole git graph by default in the commits view (equivalent to passing the `--all` argument to `git log`)
showWholeGraph: true
# When copying commit hashes to the clipboard, truncate them to this
# length. Set to 40 to disable truncation.
truncateCopiedCommitHashesTo: 8
allBranchesLogCmds:
- git log --graph --all --color=always --abbrev-commit --decorate --date=relative --pretty=medium
# Periodic update checks
update:
# One of: 'prompt' (default) | 'background' | 'never'
method: background
# Period in days between update checks
days: 14
# Background refreshes
refresher:
# File/submodule refresh interval in seconds.
# Auto-refresh can be disabled via option 'git.autoRefresh'.
refreshInterval: 10
# Re-fetch interval in seconds.
# Auto-fetch can be disabled via option 'git.autoFetch'.
fetchInterval: 60
# If true, show a confirmation popup before quitting Lazygit
confirmOnQuit: false
# If true, exit Lazygit when the user presses escape in a context where there is nothing to cancel/close
quitOnTopLevelReturn: true
# Config relating to things outside of Lazygit like how files are opened, copying to clipboard, etc
os:
# Command for editing a file. Should contain "{{filename}}".
edit: ""
# Command for editing a file at a given line number. Should contain
# "{{filename}}", and may optionally contain "{{line}}".
editAtLine: ""
# Same as EditAtLine, except that the command needs to wait until the
# window is closed.
editAtLineAndWait: ""
# For opening a directory in an editor
openDirInEditor: ""
# A built-in preset that sets all of the above settings. Supported presets
# are defined in the getPreset function in editor_presets.go.
editPreset: ""
# Command for opening a file, as if the file is double-clicked. Should
# contain "{{filename}}", but doesn't support "{{line}}".
open: ""
# Command for opening a link. Should contain "{{link}}".
openLink: "xdg-open {{link}}"
# EditCommand is the command for editing a file.
# Deprecated: use Edit instead. Note that semantics are different:
# EditCommand is just the command itself, whereas Edit contains a
# "{{filename}}" variable.
# EditCommandTemplate is the command template for editing a file
# Deprecated: use EditAtLine instead.
# OpenCommand is the command for opening a file
# Deprecated: use Open instead.
# OpenLinkCommand is the command for opening a link
# Deprecated: use OpenLink instead.
# CopyToClipboardCmd is the command for copying to clipboard.
# See https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md#custom-command-for-copying-to-and-pasting-from-clipboard
copyToClipboardCmd: "wl-copy"
# ReadFromClipboardCmd is the command for reading the clipboard.
# See https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md#custom-command-for-copying-to-and-pasting-from-clipboard
readFromClipboardCmd: "wl-paste"
# If true, don't display introductory popups upon opening Lazygit.
disableStartupPopups: true
# What to do when opening Lazygit outside of a git repo.
# - 'prompt': (default) ask whether to initialize a new repo or open in the most recent repo
# - 'create': initialize a new repo
# - 'skip': open most recent repo
# - 'quit': exit Lazygit
notARepository: skip
# If true, display a confirmation when subprocess terminates. This allows you to view the output of the subprocess before returning to Lazygit.
promptToReturnFromSubprocess: false
# Keybindings
keybinding:
universal:
quit: q
quit-alt1: <c-q>
return: <esc>
quitWithoutChangingDirectory: Q
togglePanel: <tab>
prevItem: <up>
nextItem: <down>
prevItem-alt: k
nextItem-alt: j
prevPage: ","
nextPage: .
scrollLeft: H
scrollRight: L
gotoTop: <
gotoBottom: ">"
toggleRangeSelect: v
rangeSelectDown: <s-down>
rangeSelectUp: <s-up>
prevBlock: <left>
nextBlock: <right>
prevBlock-alt: h
nextBlock-alt: l
nextBlock-alt2: <tab>
prevBlock-alt2: <backtab>
jumpToBlock:
- "1"
- "2"
- "3"
- "4"
- "5"
nextMatch: "n"
prevMatch: "N"
startSearch: /
optionMenu: "?"
select: <space>
goInto: <enter>
confirm: <enter>
confirmInEditor: <a-enter>
remove: d
new: "n"
edit: e
openFile: o
scrollUpMain: <pgup>
scrollDownMain: <pgdown>
scrollUpMain-alt1: K
scrollDownMain-alt1: J
scrollUpMain-alt2: <c-u>
scrollDownMain-alt2: <c-d>
createRebaseOptionsMenu: m
# 'Files' appended for legacy reasons
pushFiles: P
# 'Files' appended for legacy reasons
pullFiles: p
refresh: R
createPatchOptionsMenu: <c-p>
nextTab: "]"
prevTab: "["
nextScreenMode: +
prevScreenMode: _
undo: z
redo: <c-z>
filteringMenu: <c-s>
diffingMenu: W
diffingMenu-alt: <c-e>
copyToClipboard: <c-o>
openRecentRepos: <c-r>
submitEditorText: <enter>
extrasMenu: "@"
toggleWhitespaceInDiffView: <c-w>
increaseContextInDiffView: "}"
decreaseContextInDiffView: "{"
increaseRenameSimilarityThreshold: )
decreaseRenameSimilarityThreshold: (
openDiffTool: <c-t>
newWorktree: w
status:
checkForUpdate: u
recentRepos: <enter>
allBranchesLogGraph: a
files:
commitChanges: c
commitChangesWithoutHook: w
amendLastCommit: E
commitChangesWithEditor: C
findBaseCommitForFixup: <c-f>
confirmDiscard: x
ignoreFile: i
refreshFiles: r
stashAllChanges: s
viewStashOptions: S
toggleStagedAll: a
viewResetOptions: D
fetch: f
toggleTreeView: "`"
openMergeOptions: M
openStatusFilter: <c-b>
copyFileInfoToClipboard: "y"
branches:
createPullRequest: "1"
viewPullRequestOptions: O
copyPullRequestURL: <c-y>
checkoutBranchByName: c
forceCheckoutBranch: F
rebaseBranch: r
renameBranch: R
mergeIntoCurrentBranch: M
viewGitFlowOptions: i
fastForward: f
createTag: T
pushTag: P
setUpstream: u
fetchRemote: f
sortOrder: s
commits:
squashDown: s
renameCommit: r
renameCommitWithEditor: R
viewResetOptions: g
markCommitAsFixup: f
createFixupCommit: F
squashAboveCommits: S
moveDownCommit: <c-j>
moveUpCommit: <c-k>
resetCommitAuthor: a
pickCommit: p
revertCommit: t
cherryPickCopy: C
pasteCommits: V
markCommitAsBaseForRebase: B
tagCommit: T
checkoutCommit: <space>
resetCherryPick: <c-c>
copyCommitAttributeToClipboard: "y"
openLogMenu: <c-l>
openInBrowser: o
viewBisectOptions: b
startInteractiveRebase: i
amendAttribute:
resetAuthor: a
setAuthor: A
addCoAuthor: c
stash:
popStash: g
renameStash: r
commitFiles:
checkoutCommitFile: c
main:
toggleSelectHunk: a
pickBothHunks: b
editSelectHunk: E
submodules:
init: i
update: u
bulkMenu: b
commitMessage:
commitMenu: <c-o>
customCommands:
- key: "<c-i>"
command: "gitv {{.Repository.Owner}}/{{.Repository.Name}}"
context: "global"
output: terminal
- key: "<c-w>"
command: "gwm"
context: "global"
output: terminal
- key: "<c-a>"
command: "wrkflw"
context: "global"
output: terminal
- key: "<c-p>"
command: "github prs"
context: "global"
output: terminal
- key: "F"
command: "gh repo sync && gh clean-branches --force"
context: "files"
output: log
description: "Sync repo and clean branches, update DuckDB cache"
- key: "A"
description: "Smart commit with AI"
context: "files"
command: "gh commit"
output: terminal
- key: "C"
description: "Smart commit with AI"
context: "files"
command: "gh commit"
output: terminal
- key: "o"
description: "start ai pull request"
command: "gh pr create --fill -w"
context: "localBranches"
- key: "O"
context: "commits"
command: 'hub browse -- "commit/{{.SelectedLocalCommit.Hash}}"'
- key: "C"
command: "gh repo sync && gh clean-branches --force"
context: "localBranches"
output: log
description: "Sync repo, clean branches, update cache"
- key: "a"
context: "files"
command: "git {{if .SelectedFile.HasUnstagedChanges}} add {{else}} reset {{end}} {{.SelectedFile.Name | quote}}"
description: "Toggle file staged"
- key: "L"
context: "files"
command: "livediff"
output: terminal
- key: "<c-d>"
context: "files"
command: "gh dash"
output: terminal
- key: "<c-o>"
context: "files"
command: "gh browse"
+28
View File
@@ -0,0 +1,28 @@
# Auto-generated by ii wallpaper theming system
# This is the theme section for lazygit config.yml
gui:
theme:
activeBorderColor:
- "#FFFFFF"
- bold
inactiveBorderColor:
- "#8F9192"
optionsTextColor:
- "#FFFFFF"
selectedLineBgColor:
- "#1F1F1F"
selectedRangeBgColor:
- "#1F1F1F"
cherryPickedCommitFgColor:
- "#FFFFFF"
cherryPickedCommitBgColor:
- "#1F1F1F"
markedBaseCommitFgColor:
- "#FFF17B"
markedBaseCommitBgColor:
- "#1F1F1F"
unstagedChangesColor:
- "#FF9BAD"
defaultFgColor:
- "#DFE3E3"
+64
View File
@@ -0,0 +1,64 @@
[Default Applications]
text/plain=vim.desktop
text/x-shellscript=vim.desktop
text/x-python=vim.desktop
text/x-script.python=vim.desktop
text/markdown=obsidian.desktop
application/x-obsidian-canvas=obsidian.desktop
application/x-obsidian-base=obsidian.desktop
x-scheme-handler/obsidian=obsidian.desktop
text/html=brave-origin.desktop
x-scheme-handler/http=brave-origin.desktop
x-scheme-handler/https=brave-origin.desktop
x-scheme-handler/about=chromium.desktop
x-scheme-handler/unknown=chromium.desktop
x-scheme-handler/chrome=brave-origin.desktop
application/x-extension-htm=brave-origin.desktop
application/x-extension-html=brave-origin.desktop
application/x-extension-shtml=brave-origin.desktop
application/xhtml+xml=brave-origin.desktop
application/x-extension-xhtml=brave-origin.desktop
application/x-extension-xht=brave-origin.desktop
x-scheme-handler/figma=figma-linux.desktop
x-scheme-handler/claude=com.anthropic.Claude.desktop
x-scheme-handler/claude-cli=claude-code-url-handler.desktop
x-scheme-handler/com.todoist=todoist.desktop
x-scheme-handler/todoist=todoist.desktop
x-scheme-handler/openhuman=OpenHuman-handler.desktop
application/vnd.microsoft.portable-executable=wine.desktop
x-scheme-handler/slack=slack.desktop
x-scheme-handler/mailto=com.fastmail.Fastmail.desktop
x-scheme-handler/anytype=anytype.desktop
x-scheme-handler/piebald=piebald-handler.desktop
x-scheme-handler/discord-647066573147996160=discord-647066573147996161.desktop
x-scheme-handler/tolaria=tolaria-handler.desktop
x-scheme-handler/antigravity=antigravity.desktop
application/pdf=brave-origin.desktop
x-scheme-handler/opencode=ai.opencode.desktop.desktop
x-scheme-handler/follow=folo.desktop
x-scheme-handler/folo=folo.desktop
x-scheme-handler/tldraw-offline=tldraw-offline.desktop
x-scheme-handler/notion=notion.desktop
inode/directory=io.github.lgse.Strata.desktop
x-scheme-handler/fastmail=com.fastmail.Fastmail.desktop
x-scheme-handler/grokbot=grok-bot.desktop
x-scheme-handler/sand=grok-bot.desktop
x-scheme-handler/tern=so.stencil.tern.url.desktop
x-scheme-handler/openknowledge=openknowledge.desktop
[Added Associations]
x-scheme-handler/http=brave-origin.desktop;userapp-Floorp-8MTFP3.desktop;
x-scheme-handler/https=brave-origin.desktop;userapp-Floorp-8MTFP3.desktop;
x-scheme-handler/chrome=brave-origin.desktop;userapp-Floorp-8MTFP3.desktop;
text/html=brave-origin.desktop;userapp-Floorp-8MTFP3.desktop;
application/x-extension-htm=brave-origin.desktop;userapp-Floorp-8MTFP3.desktop;
application/x-extension-html=brave-origin.desktop;userapp-Floorp-8MTFP3.desktop;
application/x-extension-shtml=brave-origin.desktop;userapp-Floorp-8MTFP3.desktop;
application/xhtml+xml=brave-origin.desktop;userapp-Floorp-8MTFP3.desktop;
application/x-extension-xhtml=brave-origin.desktop;userapp-Floorp-8MTFP3.desktop;
application/x-extension-xht=brave-origin.desktop;userapp-Floorp-8MTFP3.desktop;
application/vnd.microsoft.portable-executable=wine.desktop;
x-scheme-handler/mailto=userapp-Evolution-PCEYQ4.desktop;
application/pdf=brave-origin.desktop;
x-scheme-handler/opencode=ai.opencode.desktop.desktop;
x-scheme-handler/openknowledge=openknowledge.desktop;
+33
View File
@@ -0,0 +1,33 @@
# Shared aliases for bash and zsh — generated from .chezmoidata/aliases.yaml.
# fish renders the same data via fish/conf.d/20-aliases.fish. Edit the YAML,
# not this file. Sourced from ~/.bashrc and ~/.zshrc (interactive shells only).
{{- range .aliases }}
# {{ .section }}
{{- range .items }}
alias {{ .name }}='{{ .cmd }}'
{{- end }}
{{- end }}
# Clipboard
if command -v wl-copy >/dev/null 2>&1; then
alias cpy='wl-copy'
alias pst='wl-paste'
fi
# q exits the shell; if this shell was spawned from yazi's own `q` bind
# (`shell "$SHELL" --block`), also tell that yazi to quit so exiting
# doesn't bounce back into the file manager.
q() {
if [ -n "$YAZI_ID" ] && command -v ya >/dev/null 2>&1; then
ya emit quit 2>/dev/null
fi
exit
}
# Typo guards + eza (this file is only sourced by interactive shells)
alias celar='clear'
alias claer='clear'
if command -v eza >/dev/null 2>&1; then
alias ls='eza --icons'
fi
+141
View File
@@ -0,0 +1,141 @@
"$schema" = 'https://starship.rs/config-schema.json'
palette = "noctalia"
format = """
$username\
$hostname\
$directory\
$git_branch\
$git_state\
$git_status\
$cmd_duration\
$python\
$character"""
add_newline = true
right_format = """$time"""
# zsh transient prompt (~/.zshrc). `starship prompt --profile` emits
# zsh-escaped output; `starship module` doesn't, which breaks RPROMPT width.
[profiles]
transient = "$character"
transient_right = "$time"
[directory]
style = "blue"
[character]
success_symbol = "[❯](purple)"
error_symbol = "[❯](red)"
vimcmd_symbol = "[❮](green)"
[git_branch]
format = "[$branch]($style)"
style = "bright-black"
[git_status]
format = "[[(*$conflicted$untracked$modified$staged$renamed$deleted)](218) ($ahead_behind$stashed)]($style)"
style = "cyan"
conflicted = "​"
untracked = "​"
modified = "​"
staged = "​"
renamed = "​"
deleted = "​"
stashed = "≡"
[git_state]
format = '\([$state( $progress_current/$progress_total)]($style)\) '
style = "bright-black"
[cmd_duration]
format = "[$duration]($style) "
style = "yellow"
[python]
format = "[$virtualenv]($style) "
style = "bright-black"
detect_extensions = []
detect_files = []
[time]
disabled = false
format = '[$time]($style)'
time_format = '%-I:%M %p'
style = "bright-black"
[palettes.cyberdream]
# https://github.com/scottmckendry/cyberdream.nvim
black = "#1e2124"
red = "#ff6e5e"
green = "#5eff6c"
yellow = "#f1ff5e"
blue = "#5ea1ff"
purple = "#bd5eff"
cyan = "#5ef1ff"
white = "#ffffff"
bright-black = "#4a4d4f"
bright-red = "#ff8b7e"
bright-green = "#7eff89"
bright-yellow = "#f3ff7e"
bright-blue = "#7eb3ff"
bright-purple = "#ff7ef3"
bright-cyan = "#7ef3ff"
bright-white = "#ffffff"
# Dim variants (usable as named colors in styles)
dim-black = "#1c1f22"
dim-red = "#d05c50"
dim-green = "#4fd05b"
dim-yellow = "#c5d050"
dim-blue = "#4f85d1"
dim-purple = "#d050c6"
dim-cyan = "#4fc5d1"
dim-white = "#d0d0d1"
# >>> NOCTALIA STARSHIP PALETTE >>>
# Noctalia Starship Palette
# Generated by Noctalia - do not edit manually
[palettes.noctalia]
# Standard colors
blue = "#7a858b"
red = "#bf615d"
green = "#8a9a6b"
yellow = "#c17e4a"
cyan = "#a78266"
magenta = "#ad6756"
white = "#dcc1b7"
black = "#201d1c"
# Extended palette (Catppuccin-compatible names)
rosewater = "#ae825f"
flamingo = "#cf716f"
pink = "#c6745f"
mauve = "#ad6756"
maroon = "#cf716f"
peach = "#ae825f"
teal = "#a78266"
sky = "#baa59d"
sapphire = "#8f9aa0"
lavender = "#c6745f"
# Text shades
text = "#dcc1b7"
subtext1 = "#dcc1b7"
subtext0 = "#5b5450"
# Surface shades
overlay2 = "#5b5450"
overlay1 = "#5b5450"
overlay0 = "#201d1c"
surface2 = "#201d1c"
surface1 = "#201d1c"
surface0 = "#222120"
base = "#222120"
mantle = "#222120"
crust = "#222120"
# <<< NOCTALIA STARSHIP PALETTE <<<
@@ -0,0 +1,13 @@
[Unit]
Description=Save kitty daily sessions before shutdown/reboot
PartOf=graphical-session.target
After=graphical-session.target
[Service]
ExecStart=%h/.local/bin/kitty-day-save
# Re-arm after a flush, in case the shutdown is cancelled.
Restart=always
RestartSec=10
[Install]
WantedBy=graphical-session.target
@@ -0,0 +1,6 @@
[Unit]
Description=Symlink ~/Code repos into ~/Projects
[Service]
Type=oneshot
ExecStart=%h/.local/bin/projects-sync
@@ -0,0 +1,11 @@
[Unit]
Description=Keep ~/Projects in sync with ~/Code
# ponytail: polls every 5 min; ghq clones land two levels below ~/Code, out
# of reach of a non-recursive .path unit. Switch to inotify if 5 min is slow.
[Timer]
OnStartupSec=30s
OnUnitActiveSec=5min
[Install]
WantedBy=timers.target
+99
View File
@@ -0,0 +1,99 @@
# ~/.config/topgrade.toml — tailored for CachyOS (Arch · shelly · fish)
# Only the keys that matter for this box are uncommented; everything else
# keeps topgrade's sane defaults.
[misc]
# shelly escalates privileges mid-run; cache sudo creds up front so an
# unattended run doesn't block on a password prompt halfway through.
pre_sudo = true
# topgrade on this box is cargo-installed (~/.cargo/bin/topgrade), and the
# [cargo] step below (cargo-update) already owns updating it. Self-update
# stays off so two updaters don't fight over the same binary.
no_self_update = true
# Run distro cleanup after upgrading (paccache / shelly cache clean).
# Needs `pacman-contrib` for paccache; harmlessly skipped if absent.
cleanup = true
# Surface *.pacnew / *.pacsave you need to merge — critical on a rolling
# Arch base. (default true; pinned here as a reminder.)
show_distribution_summary = true
# Globally skipped steps:
# containers → topgrade pulls :latest for every local image on every run,
# which is noisy and can drag in breaking tags. Drop this entry
# if you actually want your dev images auto-refreshed.
disable = ["containers", "config_update"]
ignore_failures = ["uv", "containers"]
# NOTE: the [python] pip/conda steps are off by default and left that way —
# that's what protects your pinned torch 2.10.0+rocm7.2.4 from a blind upgrade.
# Optional: update topgrade on goliath in the same pass. Requires topgrade
# installed there + tmux locally; rides your existing SSH ControlMaster.
# remote_topgrades = ["goliath"]
[linux]
# shelly is the CachyOS default package manager CLI now. Pin it so topgrade
# never silently falls back to bare `pacman` (which would skip the AUR *and*
# CachyOS's precompiled-AUR repo), and never picks up the still-installed
# paru via autodetect.
# Valid values: autodetect, aura, garuda_update, pacman, pamac, paru, pikaur,
# shelly, trizen, yay
arch_package_manager = "paru"
# Pull archlinux.org news before the upgrade. CachyOS tracks Arch, so
# manual-intervention advisories (keyring, library bumps) still apply to you.
show_arch_news = true
# Extra flags for shelly, if ever needed (e.g. ignoring a pinned package):
# shelly_arguments = "upgrade-all -n"
[cargo]
# Also update git-sourced installs (your smartcommit / skillforge CLIs),
# not just crates.io ones. This step is also what keeps topgrade itself fresh.
git = true
# Requires the updater binary: shelly install cargo-update
[firmware]
# Check + display only — review fwupd updates before flashing the Z13 rather
# than auto-applying firmware in an unattended run.
upgrade = false
[git]
# Predefined repos still get pulled by default. Add your own globs if you want
# config repos fetched in the same pass; left commented so topgrade doesn't trip
# over a dirty working tree mid-run.
# repos = ["~/.config/umbriel", "~/Code/prad.codes/env/cachyos"]
# arguments = "--rebase --autostash"
[flatpak]
# User-scope flatpaks update without sudo. Only set this if you keep
# system-wide installs.
# use_sudo = true
[pre_commands]
# "Emacs Snapshot" = "rm -rf ~/.emacs.d/elpa.bak && cp -rl ~/.emacs.d/elpa ~/.emacs.d/elpa.bak"
# Capture local drift in managed configs back into the chezmoi source repo
# before anything upgrades. Note: only re-adds *managed* files; brand-new
# configs still need a manual `chezmoi add`. Review/commit in
# ~/.local/share/chezmoi afterwards.
"Chezmoi Re-Add" = "chezmoi re-add"
"GHQ Update" = "ghq list | ghq get -u -s"
# Commands to run after anything
[post_commands]
# "Emacs Snapshot" = "rm -rf ~/.emacs.d/elpa.bak && cp -rl ~/.emacs.d/elpa ~/.emacs.d/elpa.bak"
"Hermes Update" = "hermes update --backup --yes"
"Herdr Update" = "herdr update"
"Shelly Update" = "shelly upgrade-all -n"
"Cachy Update" = "cachy-update"
+180
View File
@@ -0,0 +1,180 @@
# Keybinds. Defining [keybinds] replaces Umbriel's built-in set.
# Mod = Super. Actions: `umbriel msg --help`; `umbriel submap` shows the layer.
#
# Merged from niri (70-binds.kdl) and Hyprland (bindings.lua). Where both bind a
# key differently, niri's scrolling-layout bind wins, except the scratchpad keys:
# Hyprland's toggles carry over. Launchers and panels are Noctalia's, not
# vicinae's. Apps with one window cycle through umbriel-launch (focus or start).
[keybinds]
# ------------------------------------------------------------------------------
# Shell (Noctalia) and session
"Mod+Space" = { action = "spawn:noctalia msg panel-toggle launcher", repeat = false }
"Mod+Shift+Space" = { action = "spawn:noctalia msg panel-toggle launcher /emo", repeat = false }
"Super+Ctrl+Shift+BackSpace" = { action = "spawn:noctalia msg panel-toggle launcher /session", repeat = false }
"Mod+P" = { action = "spawn:noctalia msg panel-toggle clipboard", repeat = false }
"Mod+Period" = { action = "spawn:noctalia msg panel-toggle control-center", repeat = false }
"Mod+Comma" = { action = "spawn:noctalia msg settings-toggle", repeat = false }
"Super+Alt+Ctrl+N" = { action = "spawn:noctalia msg panel-open noctalia/notes:panel", repeat = false }
"Mod+Shift+B" = { action = "spawn:noctalia msg panel-toggle dunarand/bookmarks:panel", repeat = false }
"Mod+Ctrl+R" = { action = "spawn:noctalia msg plugin prdlk/ostt:recorder focused toggle", repeat = false }
"Mod+Shift+Q" = { action = "spawn:noctalia msg panel-toggle session", repeat = false }
"Mod+Shift+E" = "session-quit"
"Mod+Escape" = { action = "shortcuts-inhibit-toggle", allow_when_inhibited = true, repeat = false }
"Mod+Tab" = { action = "overview-toggle", repeat = false }
# Screenshots (Noctalia; no per-window capture)
"Mod+S" = { action = "spawn:noctalia msg screenshot-region", repeat = false }
"Mod+Ctrl+S" = { action = "spawn:noctalia msg screenshot-fullscreen", repeat = false }
"Mod+Ctrl+Shift+S" = { action = "spawn:noctalia msg screenshot-fullscreen all", repeat = false }
"Print" = { action = "spawn:noctalia msg screenshot-region", repeat = false }
"Ctrl+Print" = { action = "spawn:noctalia msg screenshot-fullscreen", repeat = false }
"Mod+F24" = { action = "spawn:voxtype record toggle --profile hermes", repeat = false }
# ------------------------------------------------------------------------------
# Scratchpads (Hyprland special workspaces; rules.toml)
"Mod+A" = "scratchpad-toggle:tern"
"Super+Alt+Ctrl+H" = "scratchpad-toggle:tern"
"Super+Alt+Ctrl+L" = "scratchpad-toggle:claude"
"Super+Ctrl+A" = "scratchpad-toggle:claude"
"Super+Alt+Ctrl+E" = "scratchpad-toggle:fastmail"
"Super+Alt+Ctrl+M" = "scratchpad-toggle:beeper"
"Super+Alt+Ctrl+B" = "scratchpad-toggle:beeper"
"Super+Ctrl+H" = "scratchpad-toggle:home"
"Super+Ctrl+L" = "scratchpad-toggle:lmstudio"
# ------------------------------------------------------------------------------
# Apps: focus or launch. Spawns run through /bin/sh with the session PATH,
# which lacks ~/.local/bin, hence the explicit path.
"Super+Alt+Ctrl+J" = { action = "spawn:~/.local/bin/umbriel-launch '^(com[.]mitchellh[.]ghostty|kitty|alacritty)' ghostty", repeat = false }
"Super+Alt+Ctrl+K" = { action = "spawn:~/.local/bin/umbriel-launch '^(brave-origin|chromium|firefox)$' brave-origin", repeat = false }
"Super+Alt+Ctrl+G" = { action = "spawn:~/.local/bin/umbriel-launch ghostty ghostty", repeat = false }
"Super+Alt+Ctrl+O" = { action = "spawn:~/.local/bin/umbriel-launch '^obsidian$' obsidian", repeat = false }
"Super+Alt+Ctrl+F" = { action = "spawn:~/.local/bin/umbriel-launch '^io[.]github[.]lgse[.]Strata$' gtk-launch io.github.lgse.Strata", repeat = false }
"Super+Alt+Ctrl+W" = { action = "spawn:~/.local/bin/umbriel-launch '^tldraw-offline$' gtk-launch tldraw-offline", repeat = false }
"Super+Alt+Ctrl+T" = { action = "spawn:~/.local/bin/umbriel-launch '^todoist' gtk-launch todoist", repeat = false }
"Super+Alt+Ctrl+Y" = { action = "spawn:~/.local/bin/umbriel-launch '^(webapp-|chrome-|brave-.+__)' gtk-launch YouTube", repeat = false }
"Super+Alt+Ctrl+Space" = { action = "spawn:~/.local/bin/umbriel-launch '^sticky-notest-canvas$' gtk-launch io.github.faridjaff.StickyNotesCanvas", repeat = false }
"Super+Ctrl+G" = { action = "spawn:~/.local/bin/umbriel-launch '^gemini-desktop$' gemini-desktop", repeat = false }
"Mod+Shift+G" = { action = "spawn:kitty --class=kitty-goliath --title=goliath --config ~/.config/kitty/goliath.conf", repeat = false }
# ------------------------------------------------------------------------------
# Focus
# At the strip's edge, H/L continue onto the output on that side.
"Mod+H" = "window-focus-or-output-left"
"Mod+L" = "window-focus-or-output-right"
"Mod+J" = "window-focus-or-workspace-down"
"Mod+K" = "window-focus-or-workspace-up"
"Mod+BackSpace" = "window-focus-last"
"Mod+WheelUp" = { action = "window-focus-left", cooldown_ms = 80 }
"Mod+WheelDown" = { action = "window-focus-right", cooldown_ms = 80 }
# Outputs
"Mod+Left" = "output-focus-left"
"Mod+Right" = "output-focus-right"
"Mod+Up" = "output-focus-up"
"Mod+O" = "output-focus-next"
"Super+Ctrl+J" = "output-focus-next"
"Super+Ctrl+K" = "output-focus-previous"
# ------------------------------------------------------------------------------
# Move
# niri's consume-or-expel, then on to the next output at the strip's end
# (umbriel-smart-move).
"Mod+Shift+H" = "spawn:~/.local/bin/umbriel-smart-move left"
"Mod+Shift+L" = "spawn:~/.local/bin/umbriel-smart-move right"
"Super+Ctrl+Shift+H" = "column-move-to-first"
"Super+Ctrl+Shift+L" = "column-move-to-last"
"Mod+Shift+J" = "column-move-to-workspace-next"
"Mod+Shift+K" = "column-move-to-workspace-previous"
"Mod+Shift+Down" = "column-move-to-output-right"
"Mod+Shift+Up" = "column-move-to-output-left"
"Mod+Shift+O" = "window-move-to-output-next"
"Mod+Ctrl+Shift+J" = "window-move-to-output-next"
"Mod+Ctrl+Shift+K" = "window-move-to-output-previous"
# ------------------------------------------------------------------------------
# Size and state
"Mod+R" = "window-cycle-primary-extent"
"Mod+Shift+R" = "window-cycle-secondary-extent"
"Alt+Shift+H" = "window-modify-primary-extent:-0.1"
"Alt+Shift+L" = "window-modify-primary-extent:0.1"
"Alt+Shift+J" = "window-modify-secondary-extent:-0.1"
"Alt+Shift+K" = "window-modify-secondary-extent:0.1"
# Nudge the focused floating window 50 logical px, vim directions (held keys
# repeat). window-move-by needs umbriel-git; the [cachyos] build lacks it.
"Alt+H" = "window-move-by:-50/0"
"Alt+J" = "window-move-by:0/50"
"Alt+K" = "window-move-by:0/-50"
"Alt+L" = "window-move-by:50/0"
"Mod+F" = { action = "window-toggle-maximize", repeat = false }
"Mod+Shift+F" = { action = "window-toggle-maximize-to-edges", repeat = false }
"Mod+Ctrl+F" = { action = "window-toggle-fullscreen", repeat = false }
"Mod+C" = { action = "spawn:~/.local/bin/umbriel-float-square", repeat = false }
"Mod+T" = { action = "window-toggle-floating", repeat = false }
# Super+W flips the active workspace between scrolling and dwindle (Hyprland's
# omarchy-toggle-layout). Super+G tabs the focused window with the windows
# stacked beside it, or stacks a tab group again (Hyprland's group key).
"Mod+W" = { action = "workspace-set-layout:toggle:scrolling,dwindle", repeat = false }
"Mod+G" = { action = "column-toggle-tabbed", repeat = false }
"Mod+Q" = { action = "window-close", repeat = false }
# ------------------------------------------------------------------------------
# Workspaces: Super+1–9 (Omarchy), Alt+Q…O → 1–8 (Hyprland)
"Mod+1" = "workspace-switch:1"
"Mod+2" = "workspace-switch:2"
"Mod+3" = "workspace-switch:3"
"Mod+4" = "workspace-switch:4"
"Mod+5" = "workspace-switch:5"
"Mod+6" = "workspace-switch:6"
"Mod+7" = "workspace-switch:7"
"Mod+8" = "workspace-switch:8"
"Mod+9" = "workspace-switch:9"
"Mod+Shift+1" = "window-move-to-workspace:1"
"Mod+Shift+2" = "window-move-to-workspace:2"
"Mod+Shift+3" = "window-move-to-workspace:3"
"Mod+Shift+4" = "window-move-to-workspace:4"
"Mod+Shift+5" = "window-move-to-workspace:5"
"Mod+Shift+6" = "window-move-to-workspace:6"
"Mod+Shift+7" = "window-move-to-workspace:7"
"Mod+Shift+8" = "window-move-to-workspace:8"
"Mod+Shift+9" = "window-move-to-workspace:9"
"Alt+Q" = "workspace-switch:1"
"Alt+W" = "workspace-switch:2"
"Alt+E" = "workspace-switch:3"
"Alt+R" = "workspace-switch:4"
"Alt+Y" = "workspace-switch:5"
"Alt+U" = "workspace-switch:6"
"Alt+I" = "workspace-switch:7"
"Alt+O" = "workspace-switch:8"
"Alt+Shift+Q" = "window-move-to-workspace:1"
"Alt+Shift+W" = "window-move-to-workspace:2"
"Alt+Shift+E" = "window-move-to-workspace:3"
"Alt+Shift+R" = "window-move-to-workspace:4"
"Alt+Shift+Y" = "window-move-to-workspace:5"
"Alt+Shift+U" = "window-move-to-workspace:6"
"Alt+Shift+I" = "window-move-to-workspace:7"
"Alt+Shift+O" = "window-move-to-workspace:8"
# ------------------------------------------------------------------------------
# Hardware keys (Noctalia OSD)
"XF86AudioRaiseVolume" = { action = "spawn:noctalia msg volume-up", allow_when_locked = true }
"XF86AudioLowerVolume" = { action = "spawn:noctalia msg volume-down", allow_when_locked = true }
"XF86AudioMute" = { action = "spawn:noctalia msg volume-mute", allow_when_locked = true, repeat = false }
"XF86AudioMicMute" = { action = "spawn:noctalia msg mic-mute", allow_when_locked = true, repeat = false }
"XF86AudioNext" = { action = "spawn:noctalia msg media next", allow_when_locked = true, repeat = false }
"XF86AudioPrev" = { action = "spawn:noctalia msg media previous", allow_when_locked = true, repeat = false }
"XF86AudioPlay" = { action = "spawn:noctalia msg media toggle", allow_when_locked = true, repeat = false }
"XF86AudioPause" = { action = "spawn:noctalia msg media toggle", allow_when_locked = true, repeat = false }
"XF86MonBrightnessUp" = { action = "spawn:noctalia msg brightness-up", allow_when_locked = true }
"XF86MonBrightnessDown" = { action = "spawn:noctalia msg brightness-down", allow_when_locked = true }
+122
View File
@@ -0,0 +1,122 @@
# Umbriel — scrolling compositor paired with the Noctalia shell.
# Reference: https://docs.noctalia.dev/umbriel/ · check: `umbriel config validate`
#
# Ported from the niri config (layout, rules, binds) plus Hyprland's named
# scratch workspaces, which map onto Umbriel scratchpads (rules.toml). Noctalia
# replaces vicinae, cliphist, and polkit-gnome: its launcher, clipboard history,
# and polkit agent run inside the one shell process.
#
# Included files apply in list order, this file last. Paths resolve against the
# symlink in ~/.config/umbriel, not the chezmoi source.
[include]
files = ["outputs.toml", "rules.toml", "binds.toml"]
# Theme colors, written by Noctalia's umbriel template on every theme change
# (not managed by chezmoi). Its post-hook keeps this entry last in the list.
[include.optional]
files = ["noctalia.toml"]
[general]
# Noctalia brings bar, launcher, notifications, clipboard history, and the
# polkit agent; nothing else is started.
autostart = ["noctalia"]
show_cheatsheet = false
# niri's honor-xdg-activation-with-invalid-serial: Noctalia notification
# actions and apps that hand off to another window (links, file pickers) can
# focus and reveal their target.
focus_on_activate = true
# Umbriel owns XDG_CURRENT_DESKTOP and the session variables.
[environment]
# Default terminal: Noctalia runs Terminal=true launcher entries through
# $TERMINAL before its own fallback list.
TERMINAL = "ghostty"
ELECTRON_OZONE_PLATFORM_HINT = "auto"
QT_QPA_PLATFORM = "wayland"
QT_QPA_PLATFORMTHEME = "kde"
QT_STYLE_OVERRIDE = "Darkly"
[input.keyboard]
layout = "us"
repeat_delay = 400
repeat_rate = 50
numlock_toggle = true
[input.touchpad]
natural_scroll = true
tap = true
tap_button_map = "left_right_middle"
sensitivity = 1.0
[input.tablet]
map_to_output = "eDP-1"
[input.touch]
map_to_output = "eDP-1"
# follows_focus: keyboard focus moves (Mod+H/L across outputs, umbriel-launch)
# take the pointer along, so scratchpads — shown on the pointer's output —
# open where focus is.
[input.cursor]
# Bibata Ghost: dark translucent Bibata (AUR bibata-cursor-translucent). Umbriel
# exports it as XCURSOR_THEME and announces it to X11 apps over XSETTINGS.
theme = "Bibata_Ghost"
size = 28
hide_when_typing = true
follows_focus = true
[layout]
gap = 8
extent_presets = [0.333, 0.5, 0.667]
# New columns take a third of the output; Mod+R cycles 1/3 → 1/2 → 2/3.
[layout.scrolling]
default_extent_fraction = 0.333
center_focused = "never"
center_underfull_strip = true
[appearance]
corner_radius = 10
# niri ran without shadows; also one less pass per window.
[appearance.shadow]
enabled = false
# Optimized blur samples only the wallpaper: cheaper than blurring the windows
# behind each translucent surface. Strong enough that the wallpaper reads as
# color, not shapes: Brave Origin paints its own translucent background, so
# window opacity alone cannot hide what is behind it.
[appearance.blur]
radius = 10
passes = 4
[appearance.tab_bar]
hide_when_single = true
[overview]
zoom = 0.4
# niri's springs: under-damped, high stiffness — short settle, slight overshoot.
[animation.windows_in]
curve = "spring:0.82,1125"
[animation.windows_out]
curve = "spring:0.88,2025"
[animation.windows_move]
curve = "spring:0.85,1463"
[animation.workspaces]
curve = "spring:0.78,1350"
[animation.overview]
curve = "spring:0.85,1463"
workspace_curve = "spring:0.78,1350"
# Scratchpad residents float as a centered square (rules.toml, the last
# window rule) above a dimmed desktop, so maximize stays off here.
[animation.scratchpad]
curve = "spring:0.85,1463"
dim = 0.6
maximize = false
+103
View File
@@ -0,0 +1,103 @@
# Outputs by monitor identity (`umbriel outputs` → "Config name"), so the
# settings follow a display across ports. Unlisted displays use their preferred
# mode at scale 1.
#
# Scale: the externals land near 110 logical px per inch (the ultrawide's
# native density), so a window keeps its size moving between them. The laptop
# panel runs denser (112) at 2: 1280x800 logical.
#
# display physical ppi scale logical logical ppi
# laptop panel 2560x1600 224 2 1280x800 112
# Studio Display 5120x2880 218 2 2560x1440 109
# ultrawide 3440x1440 110 1 3440x1440 110
# portables 1920x1080 141 1.25 1536x864 113
#
# Layout: the laptop panel sits at the origin and each external display sits
# directly to its left (negative x), bottoms aligned. The externals are used
# one at a time, so they share that slot. Positions are logical, so a
# display's offset is its scaled size.
#
# niri needed `output "DP-5" { off }` for the Studio Display's phantom 640x480
# connector; Umbriel leaves connectors without a preferred mode or identity off.
# Laptop panel, eDP-1 (niri 91-internal-display).
[output."Tianma Microelectronics Ltd. TL134ADXP03 Unknown"]
position = [0, 0]
scale = 2.0
vrr = "fullscreen"
focus_at_startup = true
# New scrolling columns take 80% of the narrow panel (global default is 1/3).
[output."Tianma Microelectronics Ltd. TL134ADXP03 Unknown".layout.scrolling]
default_extent_fraction = 0.8
# Apple Studio Display (niri 93-apple-display): 2560x1440 logical.
[output."Apple Computer Inc StudioDisplay 0x984262A7"]
position = [-2560, -640]
scale = 2.0
# Samsung ultrawide (niri 92-ultrawide, Hyprland monitors.lua): 3440x1440.
[output."Samsung Electric Company S34CG50 HNTY501103"]
mode = "3440x1440@100"
position = [-3440, -640]
scale = 1.0
vrr = "fullscreen"
# Ultrawide workspaces start in dwindle. Umbriel has no per-output layout mode;
# workspace rules need a name or an index, so positions 1–9 (Mod+1…9) each get
# one. Mod+W still flips a workspace back to scrolling.
[[workspace]]
index = 1
output = "Samsung Electric Company S34CG50 HNTY501103"
layout.mode = "dwindle"
[[workspace]]
index = 2
output = "Samsung Electric Company S34CG50 HNTY501103"
layout.mode = "dwindle"
[[workspace]]
index = 3
output = "Samsung Electric Company S34CG50 HNTY501103"
layout.mode = "dwindle"
[[workspace]]
index = 4
output = "Samsung Electric Company S34CG50 HNTY501103"
layout.mode = "dwindle"
[[workspace]]
index = 5
output = "Samsung Electric Company S34CG50 HNTY501103"
layout.mode = "dwindle"
[[workspace]]
index = 6
output = "Samsung Electric Company S34CG50 HNTY501103"
layout.mode = "dwindle"
[[workspace]]
index = 7
output = "Samsung Electric Company S34CG50 HNTY501103"
layout.mode = "dwindle"
[[workspace]]
index = 8
output = "Samsung Electric Company S34CG50 HNTY501103"
layout.mode = "dwindle"
[[workspace]]
index = 9
output = "Samsung Electric Company S34CG50 HNTY501103"
layout.mode = "dwindle"
# Portable HDMI panel, mounted portrait (niri 94-portable-hdmi): 864x1536.
[output."PNP(AOP) 16PM1QB 14490001D3X00"]
transform = "90"
position = [-864, -736]
scale = 1.25
# Portable USB-C panel (niri 95-portable-usbc): 1536x864.
[output."ASUSTek COMPUTER INC ASUS MB16AC M8LMTF195749"]
position = [-1536, -64]
scale = 1.25
+177
View File
@@ -0,0 +1,177 @@
# Window rules, layer rules, and scratchpads. Every matching rule applies; the
# later one wins a conflicting key. `umbriel windows` lists app ids and titles.
# ==============================================================================
# Scratchpads — Hyprland's special workspaces (omarchy-toggle-scratch). Each
# app opens hidden in its scratchpad; toggling an empty one launches it.
[[scratchpad]]
name = "tern"
spawn_when_empty = "tern"
[[scratchpad]]
name = "claude"
spawn_when_empty = "claude-desktop"
[[scratchpad]]
name = "fastmail"
spawn_when_empty = "gtk-launch com.fastmail.Fastmail"
[[scratchpad]]
name = "beeper"
spawn_when_empty = "gtk-launch beeper"
[[scratchpad]]
name = "home"
spawn_when_empty = "gtk-launch 'Google Home'"
[[scratchpad]]
name = "lmstudio"
spawn_when_empty = "gtk-launch ai.elementlabs.lmstudio"
# ==============================================================================
# Every window
[[window_rule]]
blur = true
# ==============================================================================
# Translucent apps (niri: opacity 0.9, blur, open focused)
[[window_rule]]
match.app_id = [
"^Folo$", "^Spotify$", "^zen$", "^brave-origin$", "^gemini-desktop$",
"^claude-desktop$", "^kitty", "^zed$", "^obsidian$", "^Beeper$",
"^chromium$", "^com[.]mitchellh[.]ghostty$",
]
opacity = 0.9
default_floating = false
default_focused = true
# Browsers: web pages are mostly light backgrounds and text, so 0.9 lets too
# much wallpaper through. Nearly opaque; after the rule above, so it wins.
[[window_rule]]
match.app_id = ["^brave-origin$", "^zen$", "^chromium$"]
opacity = 0.97
# ==============================================================================
# Floating utilities
[[window_rule]]
match.app_id = "^dev[.]noctalia[.]Noctalia$"
default_floating = true
default_floating_size_px = { width = 1080, height = 920 }
[[window_rule]]
match.app_id = "^dev[.]noctalia[.]UmbrielSharePicker$"
default_floating = true
default_floating_size_px = { width = 800, height = 600 }
[[window_rule]]
match.app_id = ["^io[.]github[.]lgse[.]Strata$", "^org[.]gnome[.]Nautilus$", "^com[.]gabm[.]satty$"]
default_floating = true
default_focused = true
default_floating_size = { width = 0.5 }
# Hyprland: YouTube web app floats pinned in the bottom-left corner.
[[window_rule]]
match.app_id = "^brave-(www[.])?youtube[.]com__"
default_floating = true
default_pinned = true
default_floating_size = { width = 0.3, height = 0.3 }
default_position = { x = 10, y = 10, anchor = "bottom_left" }
# Picture-in-picture: top-right corner of the laptop panel (after the YouTube
# rule, so its own PiP window lands here too).
[[window_rule]]
match.title = "^(Picture-in-Picture|Picture in picture)$"
default_floating = true
default_maximize = false
default_focused = false
opacity = 1.0
default_output = "eDP-1"
default_position = { x = 24, y = 24, anchor = "top_right" }
[[window_rule]]
match.title = "^notificationtoasts_.+_desktop"
default_position = { x = 0, y = 0, anchor = "bottom_right" }
default_focused = false
default_pinned = true
# ==============================================================================
# Placement (niri 91-internal-display / 93-apple-display)
# Chat, mail, and dashboards open maximized on the laptop's first workspace.
[[window_rule]]
match.app_id = [
"^chrome-youtube[.]com__-Default$", "^chromium$", "^org[.]gnome[.]Calendar$",
"^discord$", "^slack$", "^gemini-desktop$", "^Hermes$", "^todoist$",
"^WebApp-Cloudflare",
]
default_output = "eDP-1"
default_workspace = 1
default_maximize = true
default_focused = true
# Editors and terminals open on the Studio Display when it is connected.
[[window_rule]]
match.app_id = [
"^zed$", "^obsidian$", "^sticky-notest-canvas$", "^vacuumtube$", "^Fladder$",
"^kitty$", "^kitty-herdr$", "^kitty-tmux$",
]
default_output = "Apple Computer Inc StudioDisplay 0x984262A7"
[[window_rule]]
match.title = "^Sticky Notes$"
default_output = "Apple Computer Inc StudioDisplay 0x984262A7"
# Scratchpad residents, last so they win over the placement rules above.
[[window_rule]]
match.app_id = "^so[.]stencil[.]tern$"
default_scratchpad = "tern"
[[window_rule]]
match.app_id = "^com[.]anthropic[.]Claude$"
default_scratchpad = "claude"
[[window_rule]]
match.app_id = "^com[.-]fastmail[.-][Ff]astmail$"
default_scratchpad = "fastmail"
[[window_rule]]
match.app_id = "^Beeper$"
default_scratchpad = "beeper"
[[window_rule]]
match.app_id = "^brave-home[.]google[.]com__"
default_scratchpad = "home"
[[window_rule]]
match.app_id = "^ai[.]elementlabs[.]lmstudio$"
default_scratchpad = "lmstudio"
# Presentation shared by every scratchpad resident: floating, centered on the
# output, 48% × 77% of its usable area (1638×1109 on the ultrawide, the size
# Fastmail was resized to; 614×594 on the laptop panel; 1229×1109 on the Studio
# Display). Fractions rather than px so it fits the laptop's 772px height.
# Last, so it overrides default_floating = false from the translucent-apps
# rule for Claude and Beeper.
[[window_rule]]
match.app_id = [
"^so[.]stencil[.]tern$", "^com[.]anthropic[.]Claude$",
"^com[.-]fastmail[.-][Ff]astmail$", "^Beeper$",
"^brave-home[.]google[.]com__", "^ai[.]elementlabs[.]lmstudio$",
]
default_floating = true
default_maximize = false
default_floating_size = { width = 0.48, height = 0.77 }
default_position = { x = 0, y = 0, anchor = "center" }
# ==============================================================================
# Layer rules
[[layer_rule]]
match.namespace = "^noctalia-(bar-[^\"]+|notification|dock|panel|attached-panel|osd|desktop-widget-[^\"]*)$"
blur = true
blur_ignore_alpha = 0.5
blur_popups = true
+4
View File
@@ -0,0 +1,4 @@
# Default terminal for xdg-terminal-exec (GLib's Terminal=true launches and
# other apps that open a terminal): first entry wins.
com.mitchellh.ghostty.desktop
kitty.desktop
+30
View File
@@ -0,0 +1,30 @@
[mgr]
ratio = [0, 2, 6]
[opener]
play = [
{ run = "mpv %s", orphan = true, for = "unix" },
]
edit = [
# routes into the host nvim when run inside its terminal ($NVIM set);
# plain blocking nvim otherwise. Lives in ~/.local/bin (yazi doesn't
# expand $HOME here). %s = selected/hovered paths (yazi interpolation).
{ run = 'yazi-nvim-open %s', block = true, for = "unix" },
]
open = [
{ run = "xdg-open %s1", desc = "Open" },
]
[open]
prepend_rules = [
{ url = "*.{md,markdown}", use = [ "fry", "edit", "open" ] },
]
# Preview pane: bat for text-like files (md included, since mdfried is TTY-only)
[[plugin.prepend_previewers]]
mime = "text/*"
run = 'piper -- bat -p --color=always --terminal-width=$w "$1"'
[[plugin.prepend_previewers]]
mime = "application/{mbox,javascript,wine-extension-ini}"
run = 'piper -- bat -p --color=always --terminal-width=$w "$1"'
+8
View File
@@ -0,0 +1,8 @@
# c: clear with no args, cd with one.
c() {
if [ -z "${1-}" ]; then
clear
else
cd "$1"
fi
}
+23
View File
@@ -0,0 +1,23 @@
# cd with zoxide fallback, else builtin cd.
cd() {
local rc target
if [ $# -eq 0 ]; then
builtin cd "$HOME"
elif [ "$1" = - ]; then
builtin cd -
elif builtin cd "$1" 2>/dev/null; then
: # exact path resolved, nothing else to do
elif command -v zoxide >/dev/null 2>&1; then
target=$(zoxide query -- "$1" 2>/dev/null)
if [ -n "$target" ]; then
builtin cd "$target"
else
builtin cd "$1" # let builtin cd surface the real error
fi
else
builtin cd "$1"
fi
rc=$?
command -v zoxide >/dev/null 2>&1 && zoxide add "$PWD" 2>/dev/null
return $rc
}
+27
View File
@@ -0,0 +1,27 @@
# Re-run last command, copy output to clipboard.
# History-offset handling: some line editors add the current command to
# history before execution, some after — detect instead of assuming.
clip-last() {
local last copy
last=$(fc -ln -1 -1 2>/dev/null)
last=${last#"${last%%[![:space:]]*}"} # trim leading whitespace
case $last in
clip-last*)
last=$(fc -ln -2 -2 2>/dev/null)
last=${last#"${last%%[![:space:]]*}"}
;;
esac
if [ -z "$last" ]; then
echo "clip-last: no previous command in history" >&2
return 1
fi
if command -v wl-copy >/dev/null 2>&1; then
copy=wl-copy
else
echo "clip-last: no clipboard tool (wl-copy) found" >&2
return 1
fi
eval "$last" | "$copy"
command -v notify-send >/dev/null 2>&1 \
&& notify-send -a shell "Clipboard" "Command output copied to clipboard"
}
+8
View File
@@ -0,0 +1,8 @@
# ghq get + cd; clone/path logic lives in ~/.local/bin/ghg-clone.
# (helper is not named ghg: an unrelated cargo binary owns that name)
ghg() {
local dir
dir=$(ghg-clone "$@") || return
cd "$dir" || return
clear && onefetch
}
+6
View File
@@ -0,0 +1,6 @@
# Create a repo (prad.codes/github.com) + cd; logic lives in ~/.local/bin/ghn.
ghn() {
local dir
dir=$(command ghn "$@") || return
cd "$dir" || return
}
+11
View File
@@ -0,0 +1,11 @@
# Pick a ghq repo / Obsidian vault with tv (ghq-repos cable) + cd.
gho() {
local dir
dir=$(tv ghq-repos --inline) || return
[ -n "$dir" ] || return 1
cd "$dir" || return
clear
if [ -d .git ]; then
onefetch
fi
}
+11
View File
@@ -0,0 +1,11 @@
# yazi wrapper: cd to the directory yazi was left in on exit.
yy() {
local tmp cwd
tmp=$(mktemp -t "yazi-cwd.XXXXXX")
command yazi "$@" --cwd-file="$tmp"
cwd=$(cat -- "$tmp" 2>/dev/null)
if [ -n "$cwd" ] && [ "$cwd" != "$PWD" ] && [ -d "$cwd" ]; then
builtin cd -- "$cwd"
fi
rm -f -- "$tmp"
}
+114
View File
@@ -0,0 +1,114 @@
# ~/.config/zsh/keybinds.zsh — zle ports of fish_user_key_bindings.fish.
# Keys owned by kitty.conf never reach the shell and are NOT bound here:
# ctrl-h/j/k/l → vim-aware split nav (pass_keys.py).
bindkey -e # pin emacs keymap ($EDITOR containing "vi" would pick viins)
unsetopt flow_control # free ^Q/^S in zle so the ctrl-q exit bind fires
# Generic runner: widget `run-<cmd>` executes <cmd> (function or binary) with
# the tty as stdin, then repaints — fish's `commandline -f repaint`.
# cwd changes from gho/yy persist: widgets run in the shell process.
# gho, pj and `tv git-files` (below) open television cables (~/.config/
# television/cable) — the same keys do the same in fish and bash.
_zle-run() {
local cmd=${WIDGET#run-}
zle -I
$cmd </dev/tty
zle reset-prompt
}
for _cmd in purple clip-last omp-session omp yy lazygit; do
zle -N "run-$_cmd" _zle-run
done
unset _cmd
# tv pickers run --inline below the prompt. zle -I + reset-prompt redraws the
# prompt where zle last drew it, wiping anything printed below; zle -I alone
# redraws a fresh prompt under the output. So: a cancelled picker (cursor
# left on the line below the prompt) steps back up and resets in place, and
# output that must stay (onefetch after gho's cd, a pj task) gets zle -I only.
# ctrl-e: tv git-files (bat preview, enter opens nvim, which restores the
# cursor to tv's line).
_zle-tv-git-files() {
zle -I
tv git-files --inline </dev/tty
printf '\033[A' >/dev/tty
zle reset-prompt
}
zle -N tv-git-files _zle-tv-git-files
# ctrl-o: gho (ghq-repos cable); cd + clear + onefetch when something was
# picked.
_zle-gho() {
local before=$PWD
zle -I
gho </dev/tty
if [[ $PWD == "$before" ]]; then
printf '\033[A' >/dev/tty
zle reset-prompt
fi
}
zle -N gho-inline _zle-gho
# ctrl-p, and down on an idle empty prompt (fish's _pj_bind_down; otherwise
# normal history / multiline movement). pj reports through $PJ_STATE: `open`
# = cancelled, `ran` = a task printed output, empty = no task sources
# (PJ_QUIET keeps down silent outside projects).
_zle-pj() {
if [[ $WIDGET == pj-down && -n $BUFFER ]]; then
zle down-line-or-history
return
fi
local state
state=$(mktemp) || return
zle -I
if [[ $WIDGET == pj-down ]]; then
PJ_STATE=$state PJ_QUIET=1 pj </dev/tty
else
PJ_STATE=$state pj </dev/tty
fi
case $(<$state) in
open) printf '\033[A' >/dev/tty; zle reset-prompt ;;
ran) ;;
*) zle reset-prompt ;;
esac
rm -f $state
}
zle -N pj-inline _zle-pj
zle -N pj-down _zle-pj
bindkey '^E' tv-git-files
bindkey '^B' run-purple
bindkey '^Y' run-clip-last
bindkey '^O' gho-inline
bindkey '^P' pj-inline
# ctrl-a: omp-session resumes or starts omp for the repo; after a cancelled
# omp-sessions picker it moves the cursor back up itself.
bindkey '^A' run-omp-session
# ctrl-n: always a new omp session.
bindkey '^N' run-omp
# ctrl-f: yazi; yy cd's to yazi's exit dir on quit.
bindkey '^F' run-yy
bindkey '^G' run-lazygit
bindkey '^[[B' pj-down
bindkey '^[OB' pj-down
# ctrl-q mirrors ctrl-d's preset (`exit`) — quit the shell.
_zle-exit() { exit }
zle -N _zle-exit
bindkey '^Q' _zle-exit
# ctrl-c at the prompt: wipe any typed text AND clear screen + kitty
# scrollback (2J/3J drops it, like the fish `clear` wrapper). ^C is the tty
# INTR char, so this lives in TRAPINT — bindkey '^C' would never fire.
# Mid-command SIGINT behaves normally (128+SIGINT). BUFFER is read-only in
# trap context, so builtin widgets are invoked via `zle .name` instead.
TRAPINT() {
if zle; then
zle .kill-buffer
printf '\033[2J\033[3J\033[1;1H'
zle .reset-prompt
return 0
fi
return $(( 128 + $1 ))
}