19 KiB
- Configurations
- Terminal
- Wezterm
- Text Editors
- Audio
- Xorg Config
- Tasks
- Dunst
- Databases
- Special Exceptions
- Window Manager
- Desktop Environment
- Media
- chat
- TODO
#+title:Dotfiles Configuration
Configurations
This file contains all configurations across all my machines. Well, most of them anyway.
Terminal
Shell Environment
alias k=kubectl
alias lg=lazygit
alias ld=lazydocker
export EDITOR=vim
export BROWSER=firefox
export PAGER=bat
export SHELL=fish
export TERMINAL=wezterm
export PATH="~/.dotfiles/scripts:$PATH"
export PATH="/usr/local/bin:$PATH"
Git
- TODO: re-evaluate merge conflictstyle
[user]
name = Ian Keane
email = ian@keane.sh
[alias]
find-file = "!for branch in `git for-each-ref --format=\"%(refname)\" refs/heads`; do echo \"${branch}:\"; git ls-tree -r --name-only $branch | nl -bn -w3 | grep \"$1\"; done; :"
[core]
pager = delta
[interactive]
diffFilter = delta --color-only
[delta]
navigate = true
side-by-side = true
line-numbers-left-format = ""
line-numbers-right-format = "│ "
[merge]
conflictstyle = diff3
[diff]
colorMoved = default
Bat
--style='changes,grid,header-filename'
--color=always
TODO Autojump
TODO Atuin
Fish
Fish shell configuration using starship prompt.
Main Configuration
fish_vi_key_bindings
# Initialize starship prompt
starship init fish | source
# Load aliases if they exist
test -f ~/.config/fish/aliases.fish && source ~/.config/fish/aliases.fish
Mode Prompt
Disable default mode indicator since starship handles it
function fish_mode_prompt
end
Starship Prompt
Configure the starship prompt appearance and behavior
# Multi-line prompt with project context
format = """
[╭─](bold blue) $directory\
$fill\
$git_branch$git_status$kubernetes$python$nodejs$rust$golang$docker_context
[╰─](bold blue)$character"""
# Add fill module for right alignment
[fill]
symbol = " "
style = "bold blue"
# Directory display with single-letter truncation
[directory]
style = "bold white"
truncation_length = 1
truncate_to_repo = true
fish_style_pwd_dir_length = 1
format = "[$path]($style)"
# Command prompt character
[character]
success_symbol = "[❯](bold green)"
error_symbol = "[❯](bold red)"
vimcmd_symbol = "[❮](bold green)"
# Git branch display
[git_branch]
format = "[$symbol$branch]($style)"
style = "bold purple"
symbol = " " # Git branch symbol
# Git status indicators
[git_status]
format = '([\[$ahead_behind$staged$modified$deleted\]]($style) )'
style = "bold cyan"
# Repository status compared to remote
ahead = "⇡${count}" # Local repo has ${count} commits not pushed to remote
behind = "⇣${count}" # Remote has ${count} commits not in local repo
diverged = "⇕⇡${ahead_count}⇣${behind_count}" # Local and remote have diverged
# Working tree status
staged = "+${count}" # Number of staged files
modified = "!${count}" # Number of files with unstaged changes
deleted = "✘${count}" # Number of deleted files
untracked = "" # Hide untracked files indicator (was "?${count}")
# Note: Other git status symbols available but hidden for cleaner display:
# conflicted = "✖" # Merge conflicts
# stashed = "≡" # Stashed changes
# renamed = "»" # Renamed files
# Kubernetes context
[kubernetes]
format = '[$symbol$context( \($namespace\))]($style) '
style = "bold blue"
symbol = "☸ "
disabled = true # Default to disabled
detect_files = ["k8s", "kubernetes", "k3d.yaml", "kubeconfig.yaml"] # Only show in directories with these files
# Python environment
[python]
format = '[$symbol$virtualenv]($style) '
style = "bold yellow"
symbol = "🐍 "
# Node.js
[nodejs]
format = '[$symbol($version )]($style)'
style = "bold green"
symbol = "⬢ "
# Rust
[rust]
format = '[$symbol($version )]($style)'
style = "bold red"
symbol = "🦀 "
# Docker
[docker_context]
format = '[$symbol$context]($style) '
style = "bold blue"
symbol = "🐋 "
# Golang
[golang]
format = '[$symbol($version )]($style)'
style = "bold cyan"
symbol = "Go "
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 = "≡"
[cmd_duration] min_time = 500 format = "[$duration]($style) "
[username] show_always = false style_user = "white bold" style_root = "red bold"
[hostname] ssh_only = true format = "[$hostname]($style) " trim_at = "-" style = "bold dimmed green"
#+end_src
Tmux
# Required for yazi
set -g allow-passthrough on
set -ga update-environment TERM
set -ga update-environment TERM_PROGRAM
# set-option -g default-shell /usr/bin/fish
# set -g default-terminal "screen-256color"
# # set-window-option -g mode-keys vi
# set-window-option -g automatic-rename on
set-window-option -g mode-keys vi
# Blank space between status and bottom of window
set -Fg 'status-format[1]' '#{status-format[0]}'
set -g 'status-format[0]' '#[bg=black] '
set -g status 2
# Smart pane switching with awareness of Vim splits.
# See: https://github.com/christoomey/vim-tmux-navigator
# Adapted to avoid fzf conflicts
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
| grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"
multiple_panes="[ $(tmux list-panes | wc -l) -gt 1 ]"
bind-key -n 'C-h' if-shell "$is_vim && $multiple_panes" 'send-keys C-h' 'select-pane -L'
bind-key -n 'C-j' if-shell "$is_vim && $multiple_panes" 'send-keys C-j' 'select-pane -D'
bind-key -n 'C-k' if-shell "$is_vim && $multiple_panes" 'send-keys C-k' 'select-pane -U'
bind-key -n 'C-l' if-shell "$is_vim && $multiple_panes" 'send-keys C-l' 'select-pane -R'
# bind-key -n C-\ if-shell "$is_vim" "send-keys C-\\" "select-pane -l"
bind a resize-pane -Z
# Shift arrow to switch windows
bind -n C-S-Space previous-window
bind -n C-Space next-window
# Remove escape delay
set -g escape-time 0
# Enable mouse scroll
set -g mouse on
set-option -g status-right-length 140
set-option -g status-right "#(curl 'wttr.in/?format=%%c%%t%%20')|#[bg=default] %a %l:%M %p#[default]#(curl 'wttr.in/?format=%%20%%m%%20(%%M)%') |#(sugar --tmux)#[bg=default]"
set-option -g status-left-length 140
set-option -g status-left " Session: #[bold,fg=green,bg=black] #S #[fg=black,bg=green] "
set-option -g status-justify centre
set-option -g window-status-current-format '#[bold,fg=green,bg=black] #{window_name} '
set-option -g window-status-format '#{window_name}'
TODO Tmuxinator
Wezterm
local wezterm = require 'wezterm'
local config = {}
config.color_scheme = 'OceanicNext (base16)'
config.font = wezterm.font 'Deja Vu Sans Mono'
config.font_size = 20
config.enable_tab_bar = false
return config
Text Editors
Helix
TODO Things to remap
- HML
- gg G
- next / previous / show hunk ghn ghp ghv
- alias & to something easier
- remap alt-s
- remap ctrl-r to redo
- remap gc to comment
TODO Misc
- Language server config
- GPT config
theme = "base16_transparent"
[[language]]
name = "lua"
auto-format = true
formatter = { command = "stylua", args = [ "-" ] }
Emacs Pinentry
allow-emacs-pinentry
Audio
mpd
db_file "~/.config/mpd/database"
log_file "~/.config/mpd/log"
music_directory "/mnt/media/music"
playlist_directory "~/.config/mpd/playlists"
pid_file "~/.config/mpd/pid"
state_file "~/.config/mpd/state"
sticker_file "~/.config/mpd/sticker.sql"
auto_update "yes"
bind_to_address "127.0.0.1"
restore_paused "yes"
max_output_buffer_size "16384"
audio_output {
type "alsa"
name "alsa for audio soundcard"
# mixer_type "software"
}
audio_output {
type "fifo"
name "toggle_visualizer"
path "/tmp/mpd.fifo"
format "44100:16:2"
}
audio_output {
type "pulse"
name "PulseAudio Output"
#server "localhost" # optional
#sink "alsa_output" # optional
}
audio_output {
type "alsa"
name "MPD"
device "pulse"
mixer_control "Master"
}
Bluetooth
- TODO: evaluate if this can be done differently in nixos
bluez_monitor.properties = {
["bluez5.enable-sbc-xq"] = true,
["bluez5.enable-msbc"] = true,
["bluez5.enable-hw-volume"] = true,
["bluez5.headset-roles"] = "[ hsp_hs hsp_ag hfp_hf hfp_ag ]"
}
Xorg Config
- Tangle to
/etc/X11/xorg.conf.d/00-keyboard.conffor non-nixos
Section "InputClass"
Identifier "keyboard-catchall"
MatchIsKeyboard "on"
Option "XkbLayout" "us,ru,ara"
Option "XkbOptions" "grp:alt_shift_toggle,ctrl:nocaps,altwin:swap_alt_win"
EndSection
Non-Nix Xorg
Laptop Only
- Avoid unintentional touchpad activation
- TODO: Tangle to /etc/X11/xorg.conf.d/10-synaptics.conf for non-nix
Section "InputClass"
Identifier "touchpad catchall"
Driver "synaptics"
MatchIsTouchpad "on"
MatchDevicePath "/dev/input/event*"
Option "MaxTapTime" "0"
EndSection
Tasks
Taskwarrior
- TODO: evaluate if taskwarrior 3 has different settings
- TODO: clean up categories
- TODO: configure aws bucket for task warrior
data.location=~/.local/share/task
hooks.location=~/.config/task/hooks
include dark-yellow-green.theme
color.project.infra=yellow
color.project.workflow=green
color.project.home=color5 # purple
color.project.other=blue
color.project.blog=color6 # ???
report.list.columns=id,depends.indicator,priority,project,recur.indicator,description.count
report.list.labels=ID,D,P,Project,R,Description
Vit
- TODO: Compare to mac for custom keybindings
[taskwarrior]
taskrc = ~/.config/task/taskrc
[vit]
default_keybindings = vi
theme = default
confirmation = False
[report]
row_striping = False
[color]
enabled = True
Dunst
[global]
monitor = 0
follow = none
width = 300
height = 300
origin = top-right
offset = 10x50
scale = 0
notification_limit = 0
progress_bar = true
progress_bar_height = 10
progress_bar_frame_width = 1
progress_bar_min_width = 150
progress_bar_max_width = 300
indicate_hidden = yes
transparency = 0
separator_height = 2
padding = 8
horizontal_padding = 8
text_icon_padding = 0
frame_width = 3
gap_size = 0
sort = yes
font = Monospace 12
line_height = 0
markup = full
# The format of the message. Possible variables are:
# %a appname
# %s summary
# %b body
# %i iconname (including its path)
# %I iconname (without its path)
# %p progress value if set ([ 0%] to [100%]) or nothing
# %n progress value if set without any extra characters
# %% Literal %
# Markup is allowed
format = "<b>%s</b>\n%b"
alignment = left
vertical_alignment = center
show_age_threshold = 60
ellipsize = middle
ignore_newline = no
stack_duplicates = true
hide_duplicate_count = false
show_indicators = yes
sticky_history = yes
history_length = 20
dmenu = /usr/bin/dmenu -p dunst:
browser = /usr/bin/xdg-open
always_run_script = true
title = Dunst
class = Dunst
corner_radius = 0
ignore_dbusclose = false
force_xinerama = false
mouse_left_click = close_current
mouse_middle_click = do_action, close_current
mouse_right_click = close_all
[experimental]
per_monitor_dpi = false
Databases
[main]
smart_completion = True
wider_completion_menu = False
multi_line = False
multi_line_mode = psql
destructive_warning = True
expand = False
auto_expand = False
generate_aliases = False
log_file = default
keyword_casing = auto
casing_file = default
generate_casing_file = False
case_column_headers = True
history_file = default
# "CRITICAL", "ERROR", "WARNING", "INFO" "DEBUG", "NONE"
log_level = INFO
# table_order and alphabetic
asterisk_column_order = table_order
qualify_columns = if_more_than_one_table
search_path_filter = False
timing = True
show_bottom_toolbar = True
# Recommended: psql, fancy_grid or grid.
table_format = psql
syntax_style = default
vi = True
on_error = STOP
row_limit = 1000
less_chatty = False
prompt = '\u@\h:\d> '
min_num_menu_lines = 4
multiline_continuation_char = ''
null_string = '<null>'
enable_pager = True
keyring = True
Special Exceptions
Tdrop
- Must be installed from the repo, doesn't work from nix repos
- Must be moved to /usr/local/bin and given same permissions that come from make install
Window Manager
BSPWM
BSPWM is a tiling window manager that represents windows as the leaves of a binary tree.
Workspace and Monitor Configuration
- Defines workspaces (desktops)
- Sets window rules for specific applications
- Configures border colors using Flavours theme integration
- Sets core window manager behavior (gaps, border width, etc)
#! /bin/sh
bspc monitor -d 1 2 3 4
bspc rule -a Gimp desktop='^8' state=floating follow=on
bspc rule -a Chromium desktop='^2'
bspc rule -a mplayer2 state=floating
bspc rule -a Kupfer.py focus=on
bspc rule -a Screenkey manage=off
bspc rule -a Screenkey manage=off
# start flavours
@ bspc config normal_border_color "#343D46"
@ bspc config active_border_color "#99C794"
@ bspc config focused_border_color "#99C794"
@ bspc config presel_feedback_color "#5FB3B3"
# end flavours
bspc config border_width 2
bspc config window_gap 12
bspc config split_ratio 0.52
bspc config borderless_monocle true
bspc config gapless_monocle true
export PATH = $PATH:~/scripts
autorandr &
polybar &
sleep 3 && sxhkd &
SXHKD
Simple X Hotkey Daemon (SXHKD) handles keyboard input and executes commands. Configuration is organized into sections for different types of functionality.
Floating Windows and (t|n)drops
Windows I want to be able to access at any time (usually fullscreen), often facilitated by tdrop or ndrop
-
TODO notes here about configuring tdrop to make this work
- TODO calcurse window command
- Right now these don't start the process necessarily that they list
# Persistent terminal window with tmux session
super + Return
tdrop -n 1 wezterm start --always-new-process -- tmux
super + c
tdrop -n 2 wezterm start --always-new-process -- tmux
super + m
tdrop -n 2 wezterm start --always-new-process -- ncmpcpp
super + r
tdrop -n secondmux wezterm --class secondmux && xdotool getwindowfocus getwindowclassname | grep -q secondmux && bspc node -t fullscreen
super + e
tdrop emacsclient -c
super + shift + n
{bspc rule -a \* -o state=floating && st -e nmtui}
Drop-down selectors (dmenu)
super + d
dmenu_run
super + @space
dmenu_run -l 15 -i -nf $norm_fg -nb $norm_bg -sb $sel_bg -sf $sel_fg
DE management
# make sxhkd reload its configuration files:
super + Escape
pkill -USR1 -x sxhkd
# quit/restart bspwm
super + alt + {q,r}
bspc {quit,wm -r}
Simple one-off keybinds
# close and kill
super + q
bspc node -c
# screenshot
super + s
sleep .2 && scrot -s -e 'xclip -selection clipboard -t image/png -i $f'
# change language (borked due to the key changing once in a different language)
super + x
languagecycle
Window Management
# set the window state
super + {t,shift + t,shift + f,f}
bspc node -t {tiled,floating,pseudo_tiled,~fullscreen}
# focus the node in the given direction
super + {_,shift + }{h,j,k,l}
bspc node -{f,s} {west,south,north,east}
# focus the next/previous desktop in the current monitor
super + bracket{left,right}
bspc desktop -f {prev,next}.local
# focus the last node/desktop
super + {grave,Tab}
bspc {node,desktop} -f last
# focus the older or newer node in the focus history
super + {o,i}
bspc wm -h off; \
bspc node {older,newer} -f; \
bspc wm -h on
# focus or send to the given desktop
super + {_,shift + }{1-9,0}
bspc {desktop -f,node -d} '^{1-9,10}'
# preselect the direction
super + ctrl + {h,j,k,l}
bspc node -p {west,south,north,east}
# Resize windows
super + alt + {h,j,k,l}
{bspc node @parent/second -z left -20 0; \
bspc node @parent/first -z right -20 0, \
bspc node @parent/second -z top 0 +20; \
bspc node @parent/first -z bottom 0 +20, \
bspc node @parent/first -z bottom 0 -20; \
bspc node @parent/second -z top 0 -20, \
bspc node @parent/first -z right +20 0; \
bspc node @parent/second -z left +20 0}
# move a floating window
super + {Left,Down,Up,Right}
bspc node -v {-20 0,0 20,0 -20,20 0}
super + w
gapcycle
super + shift + w
layoutcycle && sleep .1
Desktop Environment
- .fehbg
- polybar
TODO Media
- mpv
- video streaming
- lf file selection
- mpv plugins
TODO chat
TODO weechat
TODO
- Better polybar config
- BSPWM / sxhkd / startup stuff / xinitrc
- Consider configuring flavours
- taskwarrior
- vit
- vimrc
- tmuxinator setup
- special popup for emacs, chat, gpt, etc
- git / delta
- firefox plugins settings
- dunst alert once polybar battery widget shows low
- mpd + radio?
- sync calcurse and etar
-
polybar modules
- brightness
- bluetooth
- polybar font colors
- click battery to notify-send percentage
- clock click to open calcurse
- master chat notifications (click to open chat tdrop)
- autorandr
- dunstrc
-
ncmpcpp
-
scrobble
- mpdscribble
- internet radio
- polybar
-
- manage polybar w/ systemctl
- make 'youtube' albums of songs I from there
- explore mpd auto playlists