- Shell 59.5%
- Python 21.3%
- Lua 14.3%
- Vim Script 4.4%
- JavaScript 0.5%
| bin/.local/bin | ||
| previews | ||
| shell | ||
| sway | ||
| .gitignore | ||
| README.md | ||
| setup-alpine.sh | ||
| setup-debian.sh | ||
| setup-termux.sh | ||
| UNLICENSE | ||
dots
personal config files for python development and writing across debian 13, alpine linux, and termux.
table of contents
installation
there are three setup-*.sh scripts at the root of this repository with the optional flags --sway, --homedir, and for termux only, --syncthing. without an argument, they install base packages for shell functionality. each script has usage comments at the top.
but, to install these dotfiles manually, you'll need git and gnu stow.
- debian:
sudo apt install git stow - alpine:
doas apk add git stow - termux:
pkg install git stow
Note
the default login shell on alpine is ash, which doesn't have brace expansion.
# set up homedir
mkdir -p .config .local/{bin,cache,lib,share,state} d p m s
mkdir -p .local/state/{bash,zsh}
# clone and stow
git clone https://codeberg.org/sailorfe/dots.git p/dots
cd p/dots/shell && stow -t ~ bash git nvim shell themes tmux vim zsh
cd ../sway && stow -t ~ beets foot mako mpd mpv ncmpcpp qutebrowser sway swaylock wmenu
cd .. && stow -t ~ bin
# set zsh home (alpine 3.23 preconfigures this)
# debian: sudo echo "export ZDOTDIR='$HOME/.config/zsh'" >> /etc/zsh/zshenv
# termux: "export ZDOTDIR='/data/data/com.termux/files/home/.config/zsh'" >> .zshenv
# change shell
chsh -s /bin/zsh
# termux: chsh -s $PREFIX/bin/zsh
shell
i use zsh as my login shell and script in bash. i don't use anything beyond zsh-autosuggestions, zsh-completions, and zsh-syntax-highlighting. i've made my shell config pretty much plug-and-play by hardcoding my prompts' hex codes and automating their selection by hostname with a case statement because i need at minimum three visual cues to know where tf i am.
i'm trying to move away from using relying on aliases, so now all i have is --color and --group-directories-first appended to all ls variations. previously, i lifted a bunch of git aliases from xero, but they weren't helpful to me for actually intimately learning the git cli.
tmux
i use tmux on machines without GUIs, so my clamshelled macbook air 2017 devbox and termux, or if i've booted one of my sway machine for just a second to do something in the tty. i also have some convoluted scripts on my desktop for opening tmux sessions with mpv, but i'm trying to make more use of sway's scratchpad for keeping terminals in the background.
tmux is best on the devbox where i do more prolonged python work. i will activate a virtual environment outside of tmux and then tmux -new -s $PROJECT in the project directory, but this rarely happens because sessions persist for days if not weeks.
editor(s)
i use neovim for writing prose and code, and i do more of the former than the latter, with the combined might of the built-in lsp and nvim-treesitter. i manage plugins with lazy, but i've been curious about forgoing a plugin manager altogether...
- language servers + linters: ty, clangd, Marksman, bashls, shellcheck, among others
- formatters: ruff, prettierd/prettier, shfmt, markdown-toc
- notable plugins:
- bullets.vim: for the markdown-pilled
- conform.nvim: configured to format on
:w - indent-blankline.nvim: indentation guides, very important for python and yaml
- my own colorschemes made with lush.nvim and shipwright.nvim: perona, luna, moonqueen
- mason.nvim: manages language servers/linters/formatters that i find annoying to hunt down or don't want from debian repositories or other package managers. so basically anything that i can't get with
uv - mini.nvim: comment, completion, diff, files, git, icons, notify, pairs, pick, snippets, splitjoin, surround, starter, statusline.
- no-neck-pain.nvim: 👵🏼
- render-markdown.nvim: really great for codeblocks and such
- telescope.nvim: tbh i mostly use this for
:Telescope lsp_document_symbols - trouble.nvim: diagnostics
- wordcount.nvim: my
g <C-gworkaround for ignoring fenced YAML in markdown files
i have Space as my leader key in part because i use a 40% mechanical keyboard that puts \ and | on the same key as '/".
a fair bit of my config is geared toward writing markdown, which i've been doing in neo/vim for years before i started programming. it all relies on vim's built-in spellcheck and a Markdown ftplugin i've tinkered with longer than anything.
i make liberal use of neovim's runtimepath and love squirreling stuff away in XDG_{DATA,STATE}_HOME/nvim.
.config/nvim
├── ftplugin
│ ├── markdown.lua
│ └── python.lua
├── init.lua
├── lazy-lock.json
└── lua
├── core
│ ├── editor.lua
│ ├── init.lua => load order for core
│ ├── keys.lua
│ ├── lazy.lua
│ ├── theme.lua
│ └── ui.lua
├── plugins
│ └── {21 and four are colorschemes!}
└── wordcount
└── init.lua
i also keep a light vimrc for when any of the above feels too busy or opinionated. i have aggressively moved most vim state files to XDG_STATE_HOME/vim:
.config/vim
├── ftplugin
│ ├── markdown.vim
│ └── python.vim
└── vimrc
sway
| moonqueen | luna | perona |
|---|---|---|
![]() |
![]() |
![]() |
i don't toil away at ricing linux, but what i do have are three custom neovim colorschemes that serve the functional purpose of reminding me what host i'm on, and which i want my machines with sway to match. besides colors, this customization takes different swaybar scripts per device (i don't need battery on desktop, for example). my modular sway setup looks like
.
├── config
├── config.d
│ ├── 00-base => keybindings
│ ├── 10-luna => colorschemes
│ ├── 10-moonqueen
│ ├── 10-perona
│ ├── 20-goingmerry => device-specific workspaces
│ └── 20-thousandsunny => exec's user services on alpine
├── desktop.sh
└── laptop.sh
where config is only a few lines to include relevant files from config.d in load order. 10-$PALETTE correspond to my nvim schemes. 20-$HOSTNAME differ mostly by my laptop occasionally being plugged into a 4k tv; otherwise, i give myself six workspaces and the tray at 0 and keep it more or less the same besides sending one to hdmi.
browsers
my browser of choice is either qutebrowser or librewolf. qutebrowser is written and configured with python, so it's a lot of fun. i also sometime go rogue and use w3m.
terminal emulator
i love foot, the default wayland terminal emulator, but i sometimes switch to alacritty when utf-8 gets weird. there is config for rio, ghostty, and wezterm in here, but i generally stick to foot.
fonts
fonts are some of my greatest passions. these days i rotate between
- recursive mono casual: very fun and almost pen-like with great italics. i also use the sans serif for my resumes.
- cozette: takes enabling bitmapped fonts on debian and alpine. i use this in my swaybar, wmenu, and rarely-seen sway window titles. it's also my cope for having 1080p monitors. i will sincerely look at 11pt bitmaps to get 3 neovim windows side by side.
- ibm 3270 or 3270 nerd font: honestly? extremely readable.
in the past, i've gotten a lot of mileage out of iosevka and jetbrains mono.
scripts
most of the scripts in the bin package are for sway, swaybar, wmenu, and make use of libnotify through mako. some are just trying to get things to work on alpine and sway, e.g. with openrc/busybox and wayland. highlights:
battery-alert: for alpine laptop, requireselogindas a boot service.player-status: displays audio/video player information as plain text for swaybar. requires playerctl and mpd-mpris.wl-colorpick: hex code picker for wayland. depends on grim, slurp, imagemagick, libnotify + a notification daemon.
license
these configs and scripts are released with the unlicense / kopimi.



