feat: more config

This commit is contained in:
Ray Andrew 2025-12-02 23:00:51 -06:00
parent a88fde31cb
commit 4f39c80e25
Signed by: rayandrew
SSH key fingerprint: SHA256:XYrYrxF0Z3A72n8P/p6mqPRNQZT22F88XcLsG+kX4xw
28 changed files with 674 additions and 667 deletions

9
.editorconfig Normal file
View file

@ -0,0 +1,9 @@
root = true
[*.sh]
indent_style = space
indent_size = 4
[bin/*]
indent_style = space
indent_size = 4

View file

@ -3,6 +3,12 @@ keys:
- &lemur age1pdk6dmyxqhdaja5d0nf8f9qjd43hmfahmkure5yrf8al9jyfmd8qfdxwl6 - &lemur age1pdk6dmyxqhdaja5d0nf8f9qjd43hmfahmkure5yrf8al9jyfmd8qfdxwl6
- &dango age15vscvpe79l287h8f3hssrj2r45xy0l3ns94zfue2fxlq43cqdsxq58vq3c - &dango age15vscvpe79l287h8f3hssrj2r45xy0l3ns94zfue2fxlq43cqdsxq58vq3c
creation_rules: creation_rules:
- path_regex: secrets/wb\.txt$
key_groups:
- age:
- *pickwick
- *lemur
- *dango
- path_regex: home/email/secrets.yaml$ - path_regex: home/email/secrets.yaml$
key_groups: key_groups:
- age: - age:

5
bin/b
View file

@ -10,9 +10,8 @@ title=${2:-}
global="$HOME/Personal/bookmarks.txt" global="$HOME/Personal/bookmarks.txt"
if [ -n "$url" ] if [ -n "$url" ]; then
then echo "$url $title" >>$global
echo "$url $title" >> $global
else else
local="$PWD/bookmarks.txt" local="$PWD/bookmarks.txt"

22
bin/cb
View file

@ -19,19 +19,17 @@ WSL_paste() {
} }
CYGWIN_copy() { CYGWIN_copy() {
cat > /dev/clipboard cat >/dev/clipboard
} }
CYGWIN_paste() { CYGWIN_paste() {
cat /dev/clipboard cat /dev/clipboard
} }
MAC_copy() { MAC_copy() {
cat | pbcopy cat | pbcopy
} }
MAC_paste() { MAC_paste() {
pbpaste pbpaste
} }
@ -85,20 +83,20 @@ detect_os() {
printf WSL printf WSL
else else
case "$(uname -s)" in case "$(uname -s)" in
Linux*) printf LINUX;; Linux*) printf LINUX ;;
Darwin*) printf MAC;; Darwin*) printf MAC ;;
CYGWIN*) printf CYGWIN;; CYGWIN*) printf CYGWIN ;;
esac esac
fi fi
} }
function debug() { function debug() {
stdin_is_a_pipe && echo "stdin_is_a_pipe: 1" >> /tmp/ono || echo "stdin_is_a_pipe: 0" >> /tmp/ono stdin_is_a_pipe && echo "stdin_is_a_pipe: 1" >>/tmp/ono || echo "stdin_is_a_pipe: 0" >>/tmp/ono
stdin_is_a_tty && echo "stdin_is_a_tty: 1" >> /tmp/ono || echo "stdin_is_a_tty: 0" >> /tmp/ono stdin_is_a_tty && echo "stdin_is_a_tty: 1" >>/tmp/ono || echo "stdin_is_a_tty: 0" >>/tmp/ono
stdin_is_pipe_like && echo "stdin_is_pipe_like: 1" >> /tmp/ono || echo "stdin_is_pipe_like: 0" >> /tmp/ono stdin_is_pipe_like && echo "stdin_is_pipe_like: 1" >>/tmp/ono || echo "stdin_is_pipe_like: 0" >>/tmp/ono
stdout_is_pipe_like && echo "stdout_is_pipe_like: 1" >> /tmp/ono || echo "stdout_is_pipe_like: 0" >> /tmp/ono stdout_is_pipe_like && echo "stdout_is_pipe_like: 1" >>/tmp/ono || echo "stdout_is_pipe_like: 0" >>/tmp/ono
stdout_is_a_tty && echo "stdout_is_a_tty: 1" >> /tmp/ono || echo "stdout_is_a_tty: 0" >> /tmp/ono stdout_is_a_tty && echo "stdout_is_a_tty: 1" >>/tmp/ono || echo "stdout_is_a_tty: 0" >>/tmp/ono
echo >> /tmp/ono echo >>/tmp/ono
} }
main() { main() {

View file

@ -6,7 +6,5 @@ if [ $# == 1 ]; then
sleepsec=$1 sleepsec=$1
fi fi
sleep $sleepsec sleep $sleepsec
pbcopy < /dev/null pbcopy </dev/null

31
bin/git-apply-patch Executable file
View file

@ -0,0 +1,31 @@
#!/usr/bin/env bash
# Interactive git patch applier - finds git repos and applies patch from stdin
# Save stdin (the patch) to a temp file
patch_file=$(mktemp /tmp/patch.XXXXXX)
cat >"$patch_file"
# Find git repos and select with fzf
repo=$(find ~/projects ~/code ~/dotfiles ~ -maxdepth 3 -type d -name ".git" 2>/dev/null |
sed 's/\/.git$//' |
sort -u |
fzf --prompt="Select repo to apply patch: " --height=40% --reverse)
if [ -z "$repo" ]; then
echo "No repo selected, patch saved to: $patch_file"
exit 1
fi
cd "$repo" || exit 1
echo "Applying patch to: $repo"
git apply "$patch_file"
status=$?
if [ $status -eq 0 ]; then
echo "Patch applied successfully!"
rm "$patch_file"
else
echo "Failed to apply patch. Patch saved to: $patch_file"
fi
exit $status

View file

@ -12,7 +12,7 @@ presentation_right_gaps=80
if [ "$1" == "on" ]; then if [ "$1" == "on" ]; then
# Save original lines with line numbers # Save original lines with line numbers
grep -n 'outer\.top\|outer\.bottom\|outer\.left\|outer\.right' "$CONFIG_FILE" > "$BACKUP_FILE" grep -n 'outer\.top\|outer\.bottom\|outer\.left\|outer\.right' "$CONFIG_FILE" >"$BACKUP_FILE"
# Replace with presentation values # Replace with presentation values
sed -i'' -e "s/^\([[:space:]]*outer\.top[[:space:]]*=\).*/\1 ${presentation_top_gaps}/" "$CONFIG_FILE" sed -i'' -e "s/^\([[:space:]]*outer\.top[[:space:]]*=\).*/\1 ${presentation_top_gaps}/" "$CONFIG_FILE"
@ -21,7 +21,7 @@ if [ "$1" == "on" ]; then
sed -i'' -e "s/^\([[:space:]]*outer\.right[[:space:]]*=\).*/\1 ${presentation_right_gaps}/" "$CONFIG_FILE" sed -i'' -e "s/^\([[:space:]]*outer\.right[[:space:]]*=\).*/\1 ${presentation_right_gaps}/" "$CONFIG_FILE"
# Set dark wallpaper for presentation # Set dark wallpaper for presentation
osascript -e 'tell application "System Events" to set picture of every desktop to "/Users/rayandrew/Pictures/Wallpapers/black-gray.jpg"' > /dev/null 2>&1 osascript -e 'tell application "System Events" to set picture of every desktop to "/Users/rayandrew/Pictures/Wallpapers/black-gray.jpg"' >/dev/null 2>&1
aerospace reload-config aerospace reload-config
echo -n "Presentation mode ON" echo -n "Presentation mode ON"
@ -37,10 +37,10 @@ elif [ "$1" == "off" ]; then
# Escape special characters for sed # Escape special characters for sed
escaped_content=$(printf '%s\n' "$content" | sed 's/[&/\]/\\&/g') escaped_content=$(printf '%s\n' "$content" | sed 's/[&/\]/\\&/g')
sed -i'' -e "${line_num}s/.*/${escaped_content}/" "$CONFIG_FILE" sed -i'' -e "${line_num}s/.*/${escaped_content}/" "$CONFIG_FILE"
done < "$BACKUP_FILE" done <"$BACKUP_FILE"
# Restore original wallpaper # Restore original wallpaper
osascript -e 'tell application "System Events" to set picture of every desktop to "/Users/rayandrew/Pictures/Wallpapers/bluering.png"' > /dev/null 2>&1 osascript -e 'tell application "System Events" to set picture of every desktop to "/Users/rayandrew/Pictures/Wallpapers/bluering.png"' >/dev/null 2>&1
rm "$BACKUP_FILE" rm "$BACKUP_FILE"
aerospace reload-config aerospace reload-config

336
bin/wb Executable file
View file

@ -0,0 +1,336 @@
#!/usr/bin/env bash
thisFile=$(realpath "$0")
DOTFILES="${DOTFILES:-$HOME/dotfiles}"
BOOKMARKS_FILE="${DOTFILES}/secrets/wb.txt"
# Decrypt bookmarks from sops
getBookmarks() {
if [[ -f "${BOOKMARKS_FILE}" ]]; then
# Unencrypted file (for development/testing)
cat "${BOOKMARKS_FILE}"
elif [[ -f "${BOOKMARKS_FILE%.txt}.enc" ]]; then
# Encrypted file
sops --decrypt --input-type binary "${BOOKMARKS_FILE%.txt}.enc" 2>/dev/null
else
echo "Error: No bookmarks file found" >&2
exit 1
fi
}
# Defaults
isCopy=0
editMode=0
q=""
noFuzzy=0
queryMode=0
if ! type fzf >/dev/null 2>&1; then
noFuzzy=1
fi
cleanup() {
rm -f /tmp/.wb
clear-pbcopy 60 &
}
trap cleanup EXIT
bks() {
getBookmarks | awk '!/^[[:space:]]*#/ && !/^[[:space:]]*$/ {print $1}'
}
execute() {
# --------------------------------------------------------------------
# If key == $q, then it's a match, then we do the following:
# a. Copy the "url" to the clipboard (with "pbcopy" in Mac or
# "clip" in Linux). How do we know it's a Mac, we just simply
# check if there's a ~/Music folder in your homedir. If
# there is, it's likely a Mac, else it's Linux.
# b. I have a "clear-pbcopy" script that basically clears the
# clipboard after 20 seconds (for security reason) because
# you don't want to accidentally copy-paste your personal
# links in your email or your chat applications. It is as simple as
# a oneline command:
# "sleep 20; echo "nothing-here" | pbcopy"
# c. If the first argument is "-c" then we mean we just want to
# copy the string to the clipboard, so we just continue
# d. Then we see if the "url" contains "http" or "www", if so
# we open it with ~/bin/browser. You must have your own
# "browser" script that opens your favorite web browser, e.g.
# in Mac, my "~/bin/browser" contains:
# open -a /Applications/Firefox.app $*
# However, if the "url" does not contain http/www,
# e.g. the key and url line is like this:
# mytodofile ~/Documents/mytodofile.txt
# then I open it "open" command line provided by Mac
# d. We are done (exiting)
# --------------------------------------------------------------------
echo ""
# ---------------------- a
echo " copying $url"
echo "$url" | cb
# ---------------------- b
if type clear-pbcopy >/dev/null 2>&1; then
clear-pbcopy 60 &
fi
# ---------------------- c
if [ $isCopy == 1 ]; then
echo " Copied to clipboard"
echo ""
exit
fi
# ---------------------- d
echo " open $url"
x-open $url
# ---------------------- d
echo ""
exit
}
fuzzy() {
# Use awk to parse bookmarks in a single pass (much faster than bash loop)
formatted=$(getBookmarks | awk '
# Skip decorative headers and section dividers
/^#[-=~# ]*$/ || /^# *--/ || /^##+/ { next }
# Accumulate description and extract tags from comments
/^#[^#]/ {
sub(/^# */, "")
desc = desc (desc ? " " : "") $0
# Extract @tags
n = split($0, words, " ")
for (i = 1; i <= n; i++) {
if (words[i] ~ /^@/) {
tags = tags (tags ? " " : "") words[i]
}
}
next
}
# Handle bookmark lines (non-comment, non-empty)
/^[^#[:space:]]/ {
key = $1
# Skip @-prefixed keys
if (key ~ /^@/) { desc = ""; tags = ""; next }
# Get URL (everything after first field)
url = $0
sub(/^[^ \t]+[ \t]+/, "", url)
# Clean description
gsub(/\n/, " ", desc)
if (desc == "") desc = "-"
if (tags == "") tags = "-"
print key "\t" url "\t" desc "\t" tags
desc = ""
tags = ""
}
')
selected_line=$(echo "$formatted" |
fzf -i --with-nth=1 \
--delimiter=$'\t' \
--query="$q" \
--prompt="🔍 Select bookmark: " \
--preview='bash -c "url=\$(echo {} | cut -f2); desc=\$(echo {} | cut -f3); tags=\$(echo {} | cut -f4); echo -e \"\$url\n\nDesc: \$desc\n\nTags: \$tags\""' \
--preview-window=down:12:wrap)
if [[ -n "$selected_line" ]]; then
IFS=$'\t' read -r key url _ <<<"$selected_line"
execute "$url"
else
echo " No selection made"
echo ""
fi
}
help() {
echo ""
echo "Usage: wb [-c] [-e] <key> [key2] [key3] ..."
echo ""
echo "Options:"
echo " -c Copy to clipboard without opening"
echo " -e Edit the bookmarks file"
echo " -nf No Fuzzy Match"
echo " -h Show help"
echo ""
echo "Examples:"
echo " wb cnn # Open the cnn bookmark"
echo " wb -c gmail # Copy Gmail URL without opening"
echo " wb 230 zoom # Open bookmark matching '230.*zoom'"
echo " wb ai sci zoom # Open bookmark matching 'ai.*sci.*zoom'"
echo ""
}
# --------------------------------------------------------------------
# [ 70-char wide ]
# 34567890123456789012345678901234567890123456789012345678901234567890
# 1 2 3 4 5 6 7
# --------------------------------------------------------------------
# --------------------------------------------------------------------
# 0. Setup $thisFile and
# if "wb" is called with no arguments, then
# just open this "wb" file with "e" --> emacs
# You can change "e" to "vi" or other text editor
# --------------------------------------------------------------------
# Parse arguments
args=()
while [ $# -gt 0 ]; do
case "$1" in
-c)
isCopy=1
;;
-e)
editMode=1
;;
-h | --help)
help
exit 0
;;
-nf)
noFuzzy=1
;;
-q)
queryMode=1
;;
-*)
echo "Unknown option: $1"
exit 1
;;
*)
args+=("$1")
;;
esac
shift
done
# Build pattern from multiple arguments (e.g., "wb 230 si te" -> "230.*si.*te")
if [ ${#args[@]} -gt 0 ]; then
q="${args[0]}"
for ((i = 1; i < ${#args[@]}; i++)); do
q="$q.*${args[$i]}"
done
fi
if [[ $editMode == 1 ]]; then
encFile="${BOOKMARKS_FILE%.txt}.enc"
if [[ -f "$encFile" ]]; then
echo "Editing encrypted bookmarks file"
# Decrypt to the .txt file (matches .sops.yaml path_regex), edit, re-encrypt
trap "rm -f '${BOOKMARKS_FILE}'" EXIT
sops --decrypt --input-type binary --output-type binary "$encFile" >"${BOOKMARKS_FILE}"
${EDITOR:-vim} "${BOOKMARKS_FILE}"
sops --encrypt --input-type binary --output-type binary "${BOOKMARKS_FILE}" >"$encFile"
rm -f "${BOOKMARKS_FILE}"
echo "Saved and re-encrypted"
elif [[ -f "${BOOKMARKS_FILE}" ]]; then
echo "Editing ${BOOKMARKS_FILE}"
${EDITOR:-vim} "${BOOKMARKS_FILE}"
else
echo "Error: No bookmarks file found"
exit 1
fi
exit
fi
if [[ $queryMode == 1 ]]; then
if [[ -z "$q" ]]; then
bs=$(bks)
else
bs=$(bks | grep -i "$q")
fi
num=$(echo "$bs" | wc -l | tr -d ' ')
bs=$(echo "$bs" | tr '\n' ',' | sed 's/,$//' | sed 's/,/, /g')
echo "$num bookmarks: ($bs)"
exit
fi
if [[ $q == "" ]]; then
if [[ $noFuzzy == 1 ]]; then
help
else
fuzzy
fi
exit
fi
## --------------------------------------------------------------------
## 1. Find all bookmarks matching the pattern using regex
## Store matches in /tmp/.wb (using awk for speed)
## --------------------------------------------------------------------
tempFile=/tmp/.wb
getBookmarks | awk -v pattern="$q" '
!/^[[:space:]]*#/ && !/^[[:space:]]*$/ && $1 ~ pattern {print}
' >"$tempFile"
hitCount=$(wc -l <"$tempFile" | tr -d ' ')
## --------------------------------------------------------------------
## 2. Handle results based on hit count
## --------------------------------------------------------------------
# No hits found
if [ $hitCount -eq 0 ]; then
echo ""
if [[ $noFuzzy == 1 ]]; then
echo " '$q' not found"
echo " Available bookmarks matching pattern:"
bks | grep -iE "$q" | cat -n
else
fuzzy
fi
echo ""
exit
fi
# Multiple hits - check for exact match first
if [ $hitCount -gt 1 ]; then
exactHit=0
while read -r key url misc; do
if [[ "$key" == "$q" ]]; then
exactHit=1
echo "$key $url" >"$tempFile"
break
fi
done <"$tempFile"
if [ $exactHit -eq 1 ]; then
hitCount=1
fi
fi
# Still multiple hits - show options or use fuzzy
if [ $hitCount -gt 1 ]; then
if [[ $noFuzzy == 1 ]]; then
echo ""
echo " Multiple matches for '$q':"
sort "$tempFile" | while read -r key url misc; do
echo " $key"
done
echo ""
else
fuzzy
fi
exit
fi
# Single hit - execute
if [ $hitCount -eq 1 ]; then
read -r key url _ <"$tempFile"
execute "$url"
fi
## --------------------------------------------------------------------
## 5. Bookmarks are now stored in secrets/wb.txt (or secrets/wb.enc when encrypted)
## To encrypt: sops --encrypt --input-type binary --output-type binary secrets/wb.txt > secrets/wb.enc
## Then remove secrets/wb.txt
## --------------------------------------------------------------------

View file

@ -0,0 +1,2 @@
[global]
log_format = "\u001B[2mdirenv: %s\u001B[0m"

View file

@ -1,5 +1,11 @@
set fish_greeting set fish_greeting
# Bootstrap Fisher (reads plugins from fish_plugins)
if not functions -q fisher
curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source
fisher update
end
function sesh-sessions function sesh-sessions
set -l session (sesh list -t -c | fzf --height 40% --reverse --border-label ' sesh ' --border --prompt '⚡ ') set -l session (sesh list -t -c | fzf --height 40% --reverse --border-label ' sesh ' --border --prompt '⚡ ')
commandline -f repaint commandline -f repaint

2
config/fish/fish_plugins Normal file
View file

@ -0,0 +1,2 @@
jorgebucaran/fisher
IlanCosman/tide@v6

View file

@ -6,6 +6,8 @@ quit-after-last-window-closed = true
gtk-adwaita = false gtk-adwaita = false
# font-family = ${system-font} # font-family = ${system-font}
font-family = Consolas font-family = Consolas
font-family = Symbols Nerd Font Mono
font-family = DejaVuSansM Nerd Font Mono
font-size = 14 font-size = 14
app-notifications = no-clipboard-copy app-notifications = no-clipboard-copy

47
config/home/.mailcap Normal file
View file

@ -0,0 +1,47 @@
# Mailcap - MIME type handlers for neomutt and other mail clients
# HTML - terminal inline view (for auto_view)
text/html; w3m -dump -T text/html %s; copiousoutput
# HTML - open in browser
text/html; open %s; nametemplate=%s.html
# Plain text
text/plain; TERM=xterm-256color less %s
text/*; TERM=xterm-256color less %s
# PDF
application/pdf; zathura %s
application/pdf; open %s
# Images - terminal (kitty protocol works in ghostty)
image/*; kitten icat --clear %s
image/*; open %s
# Video
video/*; iina %s
video/*; open %s
# Audio
audio/*; mpv --no-video %s
audio/*; open %s
# Microsoft Office - Word
application/msword; open %s
application/vnd.openxmlformats-officedocument.wordprocessingml.document; open %s
# Microsoft Office - Excel
application/vnd.ms-excel; open %s
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; open %s
# Microsoft Office - PowerPoint
application/vnd.ms-powerpoint; open %s
application/vnd.openxmlformats-officedocument.presentationml.presentation; open %s
# Archives - show contents
application/zip; unzip -l %s; copiousoutput
application/x-tar; tar -tvf %s; copiousoutput
application/gzip; tar -tzvf %s; copiousoutput
application/x-bzip2; tar -tjvf %s; copiousoutput
# Fallback - open with default macOS app
application/*; open %s

30
config/msmtp/config Normal file
View file

@ -0,0 +1,30 @@
# msmtp configuration
# Default settings for all accounts
defaults
auth on
tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile ~/.local/state/msmtp.log
# Personal Gmail account
account personal
host smtp.gmail.com
from raydreww@gmail.com
user raydreww@gmail.com
passwordeval "sops -d --extract '[\"personal\"]' ~/dotfiles/home/email/secrets.yaml"
tls_starttls off
# UChicago account (via DavMail)
account uchicago
host 127.0.0.1
port 1025
from rayandrew@uchicago.edu
user rayandrew@uchicago.edu
passwordeval "sops -d --extract '[\"uchicago\"]' ~/dotfiles/home/email/secrets.yaml"
auth plain
tls off
tls_starttls off
# Default account
account default : uchicago

View file

@ -1,10 +1,6 @@
# NeoMutt color scheme # NeoMutt color scheme - Noctis Azureus
# Based on noctis_azureus_ghostty.lua palette
# Header colors # Requires: set color_directcolor = yes
color header blue default ".*"
color header brightmagenta default "^(From)"
color header brightcyan default "^(Subject)"
color header brightwhite default "^(CC|BCC)"
# Mono settings # Mono settings
mono bold bold mono bold bold
@ -12,61 +8,86 @@ mono underline underline
mono indicator reverse mono indicator reverse
mono error bold mono error bold
# General colors # General colors - using exact hex from palette
color normal default default color normal '#becfda' default
color indicator brightyellow default color error '#e66533' default
color sidebar_highlight red default color tilde '#051b29' default
color sidebar_divider brightblack black color message '#49d6e9' default
color sidebar_flagged red black color markers '#e66533' '#ffffff'
color sidebar_new green black color attachment '#becfda' default
color normal brightyellow default color search '#051b29' '#49e9a6'
color error red default color status '#e4b781' '#041520'
color tilde black default color indicator '#051b29' '#49d6e9'
color message cyan default color tree '#49d6e9' default
color markers red white
color attachment white default # Sidebar
color search brightmagenta default color sidebar_indicator '#051b29' '#49d6e9'
color status brightyellow black color sidebar_highlight '#e4b781' '#0c3f5f'
color hdrdefault brightgreen default color sidebar_divider '#475e6c' default
color quoted green default color sidebar_flagged '#e66533' default
color quoted1 blue default color sidebar_new '#49e9a6' default
color quoted2 cyan default color sidebar_ordinary '#becfda' default
color quoted3 yellow default
color quoted4 red default # Header colors
color quoted5 brightred default color header '#49ace9' default ".*"
color signature brightgreen default color header '#df769b' default "^(From)"
color bold black default color header '#49d6e9' default "^(Subject)"
color underline black default color header '#becfda' default "^(CC|BCC)"
color hdrdefault '#49e9a6' default
# Quoted text (conversation depth)
color quoted '#49e9a6' default
color quoted1 '#49ace9' default
color quoted2 '#49d6e9' default
color quoted3 '#e4b781' default
color quoted4 '#e66533' default
color quoted5 '#e97749' default
color signature '#49e9a6' default
# Body patterns # Body patterns
color body brightred default "[\-\.+_a-zA-Z0-9]+@[\-\.a-zA-Z0-9]+" color body '#e97749' default "[\-\.+_a-zA-Z0-9]+@[\-\.a-zA-Z0-9]+"
color body brightblue default "(https?|ftp)://[\-\.,/%~_:?&=\#a-zA-Z0-9]+" color body '#49ace9' default "(https?|ftp)://[\-\.,/%~_:?&=\#a-zA-Z0-9]+"
color body green default "\`[^\`]*\`" color body '#49e9a6' default "\`[^\`]*\`"
color body brightblue default "^# \.*" color body '#49ace9' default "^# \.*"
color body brightcyan default "^## \.*" color body '#49d6e9' default "^## \.*"
color body brightgreen default "^### \.*" color body '#49e9a6' default "^### \.*"
color body yellow default "^(\t| )*(-|\\*) \.*" color body '#e4b781' default "^(\t| )*(-|\\*) \.*"
color body brightcyan default "[;:][-o][)/(|]" color body '#49d6e9' default "[;:][-o][)/(|]"
color body brightcyan default "[;:][)(|]" color body '#49d6e9' default "[;:][)(|]"
color body brightcyan default "[ ][*][^*]*[*][ ]?" color body '#49d6e9' default "[ ][*][^*]*[*][ ]?"
color body brightcyan default "[ ]?[*][^*]*[*][ ]" color body '#49d6e9' default "[ ]?[*][^*]*[*][ ]"
color body red default "(BAD signature)" color body '#e66533' default "(BAD signature)"
color body cyan default "(Good signature)" color body '#49d6e9' default "(Good signature)"
color body brightblack default "^gpg: Good signature .*" color body '#475e6c' default "^gpg: Good signature .*"
color body brightyellow default "^gpg: " color body '#e4b781' default "^gpg: "
color body brightyellow red "^gpg: BAD signature from.*" color body '#e4b781' '#e66533' "^gpg: BAD signature from.*"
mono body bold "^gpg: Good signature" mono body bold "^gpg: Good signature"
color body red default "([a-z][a-z0-9+-]*://(((([a-z0-9_.!~*'();:&=+$,-]|%[0-9a-f][0-9a-f])*@)?((([a-z0-9]([a-z0-9-]*[a-z0-9])?)\\.)*([a-z]([a-z0-9-]*[a-z0-9])?)\\.?|[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+)(:[0-9]+)?)|([a-z0-9_.!~*'()$,;:@&=+-]|%[0-9a-f][0-9a-f])+)(/([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*(;([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*)*(/([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*(;([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*)*)*)?(\\?([a-z0-9_.!~*'();/?:@&=+$,-]|%[0-9a-f][0-9a-f])*)?(#([a-z0-9_.!~*'();/?:@&=+$,-]|%[0-9a-f][0-9a-f])*)?|(www|ftp)\\.(([a-z0-9]([a-z0-9-]*[a-z0-9])?)\\.)*([a-z]([a-z0-9-]*[a-z0-9])?)\\.?(:[0-9]+)?(/([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*(;([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*)*(/([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*(;([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*)*)*)?(\\?([-a-z0-9_.!~*'();/?:@&=+$,]|%[0-9a-f][0-9a-f])*)?(#([-a-z0-9_.!~*'();/?:@&=+$,]|%[0-9a-f][0-9a-f])*)?)[^].,:;!)? \t\r\n<>\"]"
# Index colors # Index colors
color index yellow default '.*' color index '#becfda' default '.*'
color index_author red default '.*' color index_author '#df769b' default '.*'
color index_number blue default color index_number '#49ace9' default
color index_subject cyan default '.*' color index_subject '#49d6e9' default '.*'
color index_date '#475e6c' default
color index_size '#475e6c' default
color index_flags '#49e9a6' default '.*'
# New mail # New mail - highlighted with bg_highlight
color index brightyellow black "~N" color index '#e4b781' '#0c3f5f' "~N"
color index_author brightred black "~N" color index_author '#df769b' '#0c3f5f' "~N"
color index_subject brightcyan black "~N" color index_subject '#49d6e9' '#0c3f5f' "~N"
color progress black cyan # Flagged mail
color index '#e66533' default "~F"
color index_author '#e66533' default "~F"
# Deleted mail
color index '#475e6c' default "~D"
color index_author '#475e6c' default "~D"
color index_subject '#475e6c' default "~D"
# Tagged mail
color index '#49e9a6' default "~T"
color index_author '#49e9a6' default "~T"
color progress '#051b29' '#49d6e9'

View file

@ -48,11 +48,9 @@ bind index,pager,browser d half-down
bind index,pager,browser u half-up bind index,pager,browser u half-up
# Sidebar # Sidebar
bind index,pager \Ck sidebar-prev bind index,pager \Cp sidebar-prev
bind index,pager \Cj sidebar-next bind index,pager \Cn sidebar-next
bind index,pager \Cl sidebar-open bind index,pager o sidebar-open
bind index,pager \Cp sidebar-prev-new
bind index,pager \Cn sidebar-next-new
bind index,pager B sidebar-toggle-visible bind index,pager B sidebar-toggle-visible
# Misc # Misc
@ -63,3 +61,5 @@ bind index,pager D purge-message
macro index,pager a ":set confirmappend=no delete=yes\n<tag-prefix><save-message>=Archive\n<sync-mailbox>:set confirmappend=yes delete=ask-yes\n" macro index,pager a ":set confirmappend=no delete=yes\n<tag-prefix><save-message>=Archive\n<sync-mailbox>:set confirmappend=yes delete=ask-yes\n"
macro index,pager n "<tag-prefix><clear-flag>N<untag-pattern>.<enter>\n" macro index,pager n "<tag-prefix><clear-flag>N<untag-pattern>.<enter>\n"
macro attach O "<enter-command>unset wait_key<enter><shell-escape>rm -f /tmp/mutt-attach<enter><save-entry><kill-line>/tmp/mutt-attach<enter>^A" macro attach O "<enter-command>unset wait_key<enter><shell-escape>rm -f /tmp/mutt-attach<enter><save-entry><kill-line>/tmp/mutt-attach<enter>^A"
macro attach,pager A "|git apply<enter>" "Apply git patch"
macro attach,pager P "|git-apply-patch<enter>" "Apply git patch (interactive)"

View file

@ -9,6 +9,7 @@ set editor = "emacs -nw"
set edit_headers = yes set edit_headers = yes
# General settings # General settings
set color_directcolor = yes
set implicit_autoview = yes set implicit_autoview = yes
set crypt_use_gpgme = yes set crypt_use_gpgme = yes
alternative_order text/enriched text/plain text alternative_order text/enriched text/plain text

View file

@ -150,6 +150,7 @@
age age
ssh-to-age ssh-to-age
nixfmt-rfc-style nixfmt-rfc-style
shfmt
]; ];
DIRENV_LOG_FORMAT = ""; DIRENV_LOG_FORMAT = "";
}; };

View file

@ -7,15 +7,12 @@
}: }:
{ {
imports = [
./mailcap.nix
];
options.custom.email = with lib; { options.custom.email = with lib; {
enable = mkEnableOption "Enable email"; enable = mkEnableOption "Enable email";
davmail = mkEnableOption "Enable DavMail"; davmail = mkEnableOption "Enable DavMail";
mbsync = mkEnableOption "Enable Mbsync"; mbsync = mkEnableOption "Enable Mbsync";
neomutt = mkEnableOption "Enable NeoMutt"; neomutt = mkEnableOption "Enable NeoMutt";
mailcap = mkEnableOption "Enable mailcap";
}; };
config = lib.mkIf config.custom.email.enable { config = lib.mkIf config.custom.email.enable {
@ -33,38 +30,38 @@
}; };
# Install mail-related packages # Install mail-related packages
home.packages = with pkgs; [ home.packages =
with pkgs;
[
isync # mbsync isync # mbsync
msmtp msmtp
sops # for password decryption sops # for password decryption
age # for sops age backend age # for sops age backend
]
++ lib.optionals config.custom.email.neomutt [
# Wrapper script for neomutt with truecolor support
(writeShellScriptBin "neomutt" ''
export TERMINFO_DIRS="${ncurses}/share/terminfo''${TERMINFO_DIRS:+:$TERMINFO_DIRS}"
exec env TERM=xterm-direct ${neomutt}/bin/neomutt "$@"
'')
]
++ lib.optionals config.custom.email.mailcap [
mailcap
w3m # HTML rendering
zathura # PDF viewer
kitty # for kitten icat
]; ];
# Symlink config files # Symlink config files
xdg.configFile = { xdg.configFile = {
# msmtp config "msmtp".source = config.lib.file.mkOutOfStoreSymlink "${dots}/config/msmtp";
"msmtp/config".source = config.lib.file.mkOutOfStoreSymlink "${dots}/config/msmtp/config"; "neomutt".source = config.lib.file.mkOutOfStoreSymlink "${dots}/config/neomutt";
# neomutt configs
"neomutt/neomuttrc".source = config.lib.file.mkOutOfStoreSymlink "${dots}/config/neomutt/neomuttrc";
"neomutt/keybinds".source = config.lib.file.mkOutOfStoreSymlink "${dots}/config/neomutt/keybinds";
"neomutt/colors".source = config.lib.file.mkOutOfStoreSymlink "${dots}/config/neomutt/colors";
"neomutt/accounts/personal".source =
config.lib.file.mkOutOfStoreSymlink "${dots}/config/neomutt/accounts/personal";
"neomutt/accounts/uchicago".source =
config.lib.file.mkOutOfStoreSymlink "${dots}/config/neomutt/accounts/uchicago";
"neomutt/signatures/personal".source =
config.lib.file.mkOutOfStoreSymlink "${dots}/config/neomutt/signatures/personal";
"neomutt/signatures/uchicago".source =
config.lib.file.mkOutOfStoreSymlink "${dots}/config/neomutt/signatures/uchicago";
# isync/mbsync config (some tools look here)
"isyncrc".source = config.lib.file.mkOutOfStoreSymlink "${dots}/config/mbsync/mbsyncrc"; "isyncrc".source = config.lib.file.mkOutOfStoreSymlink "${dots}/config/mbsync/mbsyncrc";
}; };
# neomutt program (for the package) # mailcap symlink
programs.neomutt = lib.mkIf config.custom.email.neomutt { home.file = lib.mkIf config.custom.email.mailcap {
enable = true; ".mailcap".source = config.lib.file.mkOutOfStoreSymlink "${dots}/config/home/.mailcap";
}; };
# Create mail directories # Create mail directories

View file

@ -1,48 +0,0 @@
{
pkgs,
lib,
config,
...
}:
let
w3m = lib.getExe pkgs.w3m;
zathura = lib.getExe config.programs.zathura.package;
# term = lib.getExe config.programs.kitty.package;
term = lib.getExe config.programs.wezterm.package;
in
{
options.custom.email = with lib; {
mailcap = mkEnableOption "Enable mailcap";
};
config = lib.mkIf config.custom.email.mailcap {
home.packages = with pkgs; [
mailcap
];
home.file.".mailcap" = {
text = ''
# HTML
text/html; ${w3m} -sixel -o tmp_dir=~/.cache/w3m -o auto_image=TRUE -o display_image=1 -T text/html %s; nametemplate=%s.html
# text/html; ${w3m} -o inline_img_protocol=4 -o tmp_dir=~/.cache/w3m -o auto_image=TRUE -o display_image=1 -T text/html %s; nametemplate=%s.html
# This second one is chosen by auto_view due to the copiousoutput tag
text/html; ${w3m} -I %{charset} -T text/html -cols 140 -o tmp_dir=~/.cache/w3m -o display_link_number=1 -dump; copiousoutput
text/plain; nvim %s
#PDFs
application/x-pdf; ${zathura} '%s'; test=test -n "$DISPLAY"
application/pdf; ${zathura} '%s'; test=test -n "$DISPLAY"
message/rfc822; nvim %s
#Images
# image/png; /usr/bin/feh %s
# image/jpeg; /usr/bin/feh %s
# image/*; (clear && ${term} +kitten icat %s); needsterminal
image/*; (clear && ${term} imgcat %s); needsterminal
'';
};
};
}

View file

@ -1,72 +0,0 @@
{ pkgs, ... }:
''
# Header colors:
color header blue default ".*"
color header brightmagenta default "^(From)"
color header brightcyan default "^(Subject)"
color header brightwhite default "^(CC|BCC)"
mono bold bold
mono underline underline
mono indicator reverse
mono error bold
color normal default default
color indicator brightyellow default # currently selected message. default makes bar clear, disabled arrow to save space.
color sidebar_highlight red default
color sidebar_divider brightblack black
color sidebar_flagged red black
color sidebar_new green black
color normal brightyellow default
color error red default
color tilde black default
color message cyan default
color markers red white
color attachment white default
color search brightmagenta default
color status brightyellow black
color hdrdefault brightgreen default
color quoted green default
color quoted1 blue default
color quoted2 cyan default
color quoted3 yellow default
color quoted4 red default
color quoted5 brightred default
color signature brightgreen default
color bold black default
color underline black default
color normal default default
color body brightred default "[\-\.+_a-zA-Z0-9]+@[\-\.a-zA-Z0-9]+" # Email addresses
color body brightblue default "(https?|ftp)://[\-\.,/%~_:?&=\#a-zA-Z0-9]+" # URL
color body green default "\`[^\`]*\`" # Green text between ` and `
color body brightblue default "^# \.*" # Headings as bold blue
color body brightcyan default "^## \.*" # Subheadings as bold cyan
color body brightgreen default "^### \.*" # Subsubheadings as bold green
color body yellow default "^(\t| )*(-|\\*) \.*" # List items as yellow
color body brightcyan default "[;:][-o][)/(|]" # emoticons
color body brightcyan default "[;:][)(|]" # emoticons
color body brightcyan default "[ ][*][^*]*[*][ ]?" # more emoticon?
color body brightcyan default "[ ]?[*][^*]*[*][ ]" # more emoticon?
color body red default "(BAD signature)"
color body cyan default "(Good signature)"
color body brightblack default "^gpg: Good signature .*"
color body brightyellow default "^gpg: "
color body brightyellow red "^gpg: BAD signature from.*"
mono body bold "^gpg: Good signature"
# mohttps://neomutt.org/code/config_vars.htmlno body bold "^gpg: BAD signature from.*"
color body red default "([a-z][a-z0-9+-]*://(((([a-z0-9_.!~*'();:&=+$,-]|%[0-9a-f][0-9a-f])*@)?((([a-z0-9]([a-z0-9-]*[a-z0-9])?)\\.)*([a-z]([a-z0-9-]*[a-z0-9])?)\\.?|[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+)(:[0-9]+)?)|([a-z0-9_.!~*'()$,;:@&=+-]|%[0-9a-f][0-9a-f])+)(/([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*(;([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*)*(/([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*(;([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*)*)*)?(\\?([a-z0-9_.!~*'();/?:@&=+$,-]|%[0-9a-f][0-9a-f])*)?(#([a-z0-9_.!~*'();/?:@&=+$,-]|%[0-9a-f][0-9a-f])*)?|(www|ftp)\\.(([a-z0-9]([a-z0-9-]*[a-z0-9])?)\\.)*([a-z]([a-z0-9-]*[a-z0-9])?)\\.?(:[0-9]+)?(/([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*(;([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*)*(/([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*(;([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*)*)*)?(\\?([-a-z0-9_.!~*'();/?:@&=+$,]|%[0-9a-f][0-9a-f])*)?(#([-a-z0-9_.!~*'();/?:@&=+$,]|%[0-9a-f][0-9a-f])*)?)[^].,:;!)? \t\r\n<>\"]"
# Default index colors:
color index yellow default '.*'
color index_author red default '.*'
color index_number blue default
color index_subject cyan default '.*'
# For new mail:
color index brightyellow black "~N"
color index_author brightred black "~N"
color index_subject brightcyan black "~N"
color progress black cyan
''

View file

@ -1,78 +0,0 @@
{
pkgs,
config,
lib,
...
}:
let
keybinds = import ./keybind.nix rec {
inherit config lib pkgs;
};
colors = import ./colors.nix rec {
inherit config lib pkgs;
};
in
{
options.custom.email = with lib; {
neomutt = mkEnableOption "Enable NeoMutt";
};
config = lib.mkIf (config.custom.email.enable && config.custom.email.neomutt) {
xsession.windowManager.i3.config =
let
i3config = config.xsession.windowManager.i3.config;
in
{
keybindings = lib.mkOptionDefault {
"${i3config.modifier}+m" =
"exec --no-startup-id ${i3config.terminal} -e ${config.programs.neomutt.package}/bin/neomutt";
};
};
programs.neomutt = {
enable = true;
vimKeys = false;
sort = "threads";
unmailboxes = true;
binds = keybinds.binds ++ [ ];
macros = keybinds.macros ++ [ ];
extraConfig = ''
set abort_key = "<Esc>"
# set editor = "nvim"
set editor = "emacs -nw"
set edit_headers = yes
set sidebar_visible
set sidebar_format = "%D%?F? [%F]?%* %?N?%N/?%S"
set mail_check_stats
# set new_mail_command="notify-send 'New Email' '%n new messages, %u unread.' &"
# status bar, date format, finding stuff etc.
set status_chars = " *%A"
# set status_format = "[ Folder: %f ] [%r%m messages%?n? (%n new)?%?d? (%d to delete)?%?t? (%t tagged)? ]%>─%?p?( %p postponed )?"
set status_format = "[ Folder: %D ] [%r%m messages%?n? (%n new)?%?d? (%d to delete)?%?t? (%t tagged)? ]%>%?p?( %p postponed )?"
set date_format = "%d.%m.%Y %H:%M"
set uncollapse_jump
set sort_re
set reply_regexp = "^(([Rr][Ee]?(\[[0-9]+\])?: *)?(\[[^]]+\] *)?)*"
set quote_regexp = "^( {0,4}[>|:#%]| {0,4}[a-z0-9]+[>|]+)+"
set send_charset = "utf-8:iso-8859-1:us-ascii"
set charset = "utf-8"
set arrow_cursor = "no" # Change `color indicator` depending
# Pager View Options
set pager_index_lines = 10 # Shows 10 lines of index when pager is active
set pager_context = 3
set pager_stop
set menu_scroll
set tilde
unset markers
${colors}
'';
};
};
}

View file

@ -1,316 +0,0 @@
{ pkgs, ... }:
{
binds = [
{
map = [ "attach" ];
key = "<return>";
action = "view-mailcap";
}
{
map = [ "attach" ];
key = "l";
action = "view-mailcap";
}
# {
# map = [ "attach" ];
# key = "O";
# action = "<enter-command>unset wait_key<enter><shell-escape>rm -f /tmp/mutt-attach<enter><save-entry><kill-line>/tmp/mutt-attach<enter>^A";
# }
{
map = [ "editor" ];
key = "<space>";
action = "noop";
}
{
map = [ "pager" ];
key = "c";
action = "imap-fetch-mail";
}
{
map = [ "index" ];
key = "G";
action = "last-entry";
}
{
map = [ "index" ];
key = "g";
action = "noop";
}
{
map = [ "index" ];
key = "gg";
action = "first-entry";
}
{
map = [
"pager"
"attach"
];
key = "h";
action = "exit";
}
{
map = [ "pager" ];
key = "j";
action = "next-line";
}
{
map = [ "pager" ];
key = "k";
action = "previous-line";
}
{
map = [ "pager" ];
key = "l";
action = "view-attachments";
}
{
map = [ "index" ];
key = "D";
action = "delete-message";
}
{
map = [ "index" ];
key = "U";
action = "undelete-message";
}
{
map = [ "index" ];
key = "L";
action = "limit";
}
{
map = [ "index" ];
key = "h";
action = "noop";
}
{
map = [
"browser"
"pager"
"index"
];
key = "n";
action = "search-next";
}
{
map = [
"browser"
"pager"
"index"
];
key = "N";
action = "search-opposite";
}
{
map = [ "index" ];
key = "l";
action = "display-message";
}
{
map = [ "browser" ];
key = "h";
action = "goto-parent";
}
{
map = [ "browser" ];
key = "l";
action = "select-entry";
}
{
map = [
"pager"
"browser"
];
key = "gg";
action = "top-page";
}
{
map = [
"pager"
"browser"
];
key = "G";
action = "bottom-page";
}
{
map = [
"index"
"pager"
"browser"
];
key = "d";
action = "half-down";
}
{
map = [
"index"
"pager"
"browser"
];
key = "u";
action = "half-up";
}
{
map = [ "index" ];
key = "R";
action = "group-reply";
}
{
map = [ "index" ];
key = "\\031";
action = "previous-undeleted";
}
{
map = [ "index" ];
key = "\\005";
action = "next-undeleted";
}
{
map = [ "pager" ];
key = "\\031";
action = "previous-line";
}
{
map = [ "pager" ];
key = "\\005";
action = "next-line";
}
{
map = [ "editor" ];
key = "<Tab>";
action = "complete-query";
}
{
map = [
"index"
"pager"
];
key = "\\Ck";
action = "sidebar-prev";
}
{
map = [
"index"
"pager"
];
key = "\\Cj";
action = "sidebar-next";
}
{
map = [
"index"
"pager"
];
key = "\\Co";
action = "sidebar-open";
}
{
map = [
"index"
"pager"
];
key = "\\Cp";
action = "sidebar-prev-new";
}
{
map = [
"index"
"pager"
];
key = "\\Cn";
action = "sidebar-next-new";
}
{
map = [
"index"
"pager"
];
key = "B";
action = "sidebar-toggle-visible";
}
{
map = [
"index"
"pager"
];
key = "@";
action = "compose-to-sender";
}
{
map = [
"index"
"pager"
];
key = "D";
action = "purge-message";
}
{
map = [ "index" ];
key = "<tab>";
action = "sync-mailbox";
}
{
map = [ "index" ];
key = "<space>";
action = "collapse-thread";
}
{
map = [ "editor" ];
key = "<Tab>";
action = "complete-query";
}
{
map = [ "editor" ];
key = "^T";
action = "complete";
}
# {
# map = [
# "index"
# "pager"
# ];
# key = "<f2>";
# action = "<sync-mailbox><enter-command>source ~/.config/neomutt/accounts/uchicago<enter><change-folder>!<enter>";
# }
# {
# map = [
# "index"
# "pager"
# ];
# key = "<f3>";
# action = "<sync-mailbox><enter-command>source ~/.config/neomutt/accounts/personal<enter><change-folder>!<enter>";
# }
# {
# map = [ "attach" ];
# key = "V";
# action = "<pipe-entry>iconv -c --to-code=UTF8 > ~/.cache/mutt-mail.html<enter><shell-escape>xdg-open ~/.cache/mutt-mail.html<enter>";
# }
];
macros = [
{
map = [
"index"
"pager"
];
key = "a";
action = ":set confirmappend=no delete=yes\\n<tag-prefix><save-message>=Archive\\n<sync-mailbox>:set confirmappend=yes delete=ask-yes\\n";
}
{
map = [
"index"
"pager"
];
key = "n";
action = "<tag-prefix><clear-flag>N<untag-pattern>.<enter>\\n";
}
{
map = [
"attach"
];
key = "O";
action = "<enter-command>unset wait_key<enter><shell-escape>rm -f /tmp/mutt-attach<enter><save-entry><kill-line>/tmp/mutt-attach<enter>^A";
}
];
}

View file

@ -51,6 +51,7 @@
nerd-fonts.droid-sans-mono nerd-fonts.droid-sans-mono
nerd-fonts.space-mono nerd-fonts.space-mono
nerd-fonts.dejavu-sans-mono nerd-fonts.dejavu-sans-mono
nerd-fonts.symbols-only
]; ];
} }

View file

@ -60,6 +60,7 @@
pandoc pandoc
duckdb duckdb
hyperfine hyperfine
fastfetch
(pkgs.python311.withPackages (ppkgs: [ (pkgs.python311.withPackages (ppkgs: [
ppkgs.numpy ppkgs.numpy
])) ]))
@ -69,10 +70,18 @@
}) })
imagemagick imagemagick
spotify-player spotify-player
eza
] ]
++ lib.optionals pkgs.stdenv.isDarwin [ coreutils ] ++ lib.optionals pkgs.stdenv.isDarwin [ coreutils ]
++ (lib.attrValues config.custom.shell.packages); ++ (lib.attrValues config.custom.shell.packages);
home.shellAliases = {
ls = "eza";
ll = "eza -la --icons --git";
la = "eza -a --icons";
lt = "eza --tree --level=2 --icons";
};
programs.bash = { programs.bash = {
enable = true; enable = true;
enableVteIntegration = true; enableVteIntegration = true;
@ -103,6 +112,8 @@
enableFishIntegration = config.programs.fish.enable; enableFishIntegration = config.programs.fish.enable;
}; };
xdg.configFile."direnv/direnv.toml".source =
config.lib.file.mkOutOfStoreSymlink "${dots}/config/direnv/direnv.toml";
xdg.configFile."sesh".source = config.lib.file.mkOutOfStoreSymlink "${dots}/config/sesh"; xdg.configFile."sesh".source = config.lib.file.mkOutOfStoreSymlink "${dots}/config/sesh";
xdg.configFile."yazi".source = config.lib.file.mkOutOfStoreSymlink "${dots}/config/yazi"; xdg.configFile."yazi".source = config.lib.file.mkOutOfStoreSymlink "${dots}/config/yazi";
xdg.configFile."spotify-player".source = xdg.configFile."spotify-player".source =

View file

@ -104,6 +104,7 @@
davmail = true; davmail = true;
neomutt = true; neomutt = true;
mbsync = true; mbsync = true;
mailcap = true;
}; };
}; };
} }

22
secrets/wb.enc Normal file

File diff suppressed because one or more lines are too long