#+title: William's Dotfiles
#+author: William Ball
#+email: williampi103@gmail.com

#+options: toc:nil num:nil

* Dotfiles
My personal dotfiles for River on Arch Linux. They are designed to be used with [[https://www.gnu.org/software/stow/][gnu stow]]. Each directory is a kind of 'module' that can be individually symlinked.

You are welcome to do whatever you would like with these configs (they are licensed under the 0 clause BSD license); be inspired by them, copy them, whatever, no attribution necessary. I would encourage you to fork this repo, then use =stow= to install whatever modules you would like, changing whatever you want as you go. For example, if you want to use just my neovim configuration, you could run =stow nvim=, assuming this repo is located in your home directory, and my neovim configuration will automatically be symlinked to =~/.config/nvim=.

* Some Software I run

** Terminal

*** Foot
I use [[https://codeberg.org/dnkl/foot][foot]] as my terminal of choice, mostly because I like having a terminal and client. It makes launching the terminal practically instantaneous, and I don't really need the multiplexing capabilities. I've also used and enjoyed [[https://alacritty.org/][alacritty]], [[https://sw.kovidgoyal.net/kitty/][kitty]], [[https://wezterm.org/][wezterm]] and [[https://st.suckless.org][st]] in the past and think they are all excellent terminals.

*** Fish
I use [[https://fishshell.com/][fish]] as my shell, with [[https://starship.rs][starship]] as my prompt. My config is fairly small and sensible, though you would likely want to tweak it. I particularly love and recommend settings =fish_hybrid_key_bindings=, as I'm used to both Emacs and Vim keybindings.

Most of the config is just setting the path, and tweaking some environment variables to make things better for wayland or force programs to follow the XDG spec.

*** RIIR
I have a couple (mostly written in rust) replacements for standard unix tools. Here's a bunch of them:

|-----------+----------|
| Tool      | Replaces |
|-----------+----------|
| [[https://github.com/sharkdp/bat][bat]]       | =cat=      |
| [[https://github.com/bootandy/dust][dust]]      | =du=       |
| [[https://github.com/eza-community/eza][eza]]       | =ls=       |
| [[https://github.com/sharkdp/fd][fd]]        | =find=     |
| [[https://github.com/sharkdp/hyperfine][hyperfine]] | =time=     |
| [[https://github.com/BurntSushi/ripgrep][ripgrep]]   | =grep=     |
| [[https://github.com/XAMPPRocky/tokei][tokei]]     | =wc=       |
|-----------+----------|

** Editors

*** Neovim
I absolutely love [[https://neovim.io][neovim]], though it is a pain to configure. My config is fairly clean as far as neovim configs go, but probably isn't a very good fit for your use case. I would recommend checking out projects like [[https://www.lunarvim.org/][lunarvim]], [[https://nvchad.com/][nvchad]], or [[https://github.com/LazyVim/LazyVim][LazyVim]] to get started, or borrowing how my config is structured but changing the actual details.

*** Emacs
I love both [[https://www.gnu.org/software/emacs/][emacs]] and vim, but use them for different purposes. In terms of editing experience, my extremely customized neovim is absolutely perfect for me, but there are some things that emacs can do that is just impossible to replicate in neovim. Emacs is fantastic for [[https://orgmode.org][org-mode]] and writing [[https://latex-project.org][LaTeX]], though I usually leave writing code to neovim (emacs still being single-threaded in <current-year> hurts).

** Desktop
I use a custom [[https://wayland.freedesktop.org][Wayland]] desktop built around the excellent compositor [[https://codeberg.org/river/river][river]]

*** River
The first tiling window manager I used (after a brief stint with [[https://i3wm.org][i3]]) was [[https://dwm.suckless.org][dwm]], and river strikes the best balance between maturity, usability, and similarity to dwm. The tag system is strictly superior to usual workspaces in my opinion.

*** Niri
I've started messing around with [[https://github.com/YaLTeR/niri][niri]], and it is honestly incredible. I love river, but I honestly don't see myself going back any time soon. Niri is so nice on a laptop. It suits my workflow perfectly.

*** Mako
I use [[https://github.com/emersion/mako][mako]] as my notification daemon of choice. I started off on X11 using [[https://github.com/dunst-project/dunst][dunst]], but switched to mako before dunst got Wayland support, since mako's almost the same thing.

*** Swaylock/Swayidle
I use [[https://github.com/swaywm/swaylock][swaylock]] and [[https://github.com/swaywm/swayidle][swayidle]] to handle my screen locking needs. I also have a couple scripts (=timeout.sh= and =toggle_caffeine.sh= in my river/niri configs), to basically enable toggling swayidle. I usually want my computer to lock automatically if I've been idle long enough, but sometimes want to be able to turn that off.

*** Fuzzel
I use [[https://codeberg.org/dnkl/fuzzel][fuzzel]] as my launcher. It's basically [[https://github.com/davatorium/rofi][rofi]] for wayland but with less baggage and better [[https://tools.suckless.org/dmenu/][dmenu]]-like functionality. I use it in several scripts in addition to it being my launcher.

*** Bemenu
I've lately been trying out [[https://github.com/Cloudef/bemenu][bemenu]], which is a fairly straightforward [[https://tools.suckless.org/dmenu/][dmenu]] implementation that works on Wayland. bemenu : dmenu :: fuzzel : rofi.

*** Wob
I use [[https://github.com/francma/wob][wob]] to show my volume and brightness when I change them. It's just a wayland version of the excellent [[https://github.com/florentc/xob][xob]].

*** Swaybg
I use [[https://github.com/swaywm/swaybg][swaybg]] as my wallpaper setter. There are a million of these, and it doesn't really matter which you pick.

*** Waybar
I don't really like really elaborate and fancy status bars. Whatever status bar I'm using, I like to have workspaces on the left, time and date in the middle, and volume, wifi, and battery on the right. I don't know where I picked up this habit (I think an ancient [[https://github.com/LemonBoy/bar][lemonbar]] script of mine, but I don't really remember), but it's what I'm used to now, and is very easy to emulate in [[https://github.com/Alexays/Waybar][waybar]]. I've tried [[https://codeberg.org/dnkl/yambar][yambar]], but found it very confusing to configure.

*** Keyd
As a heavy emacs/vim user, remapping caps lock to esc/control is absolutely necessary, and [[https://github.com/rvaiya/keyd][keyd]] is great for this. Note that =stow keyd= won't work properly. Instead you should copy =keyd/default.conf= to =/etc/keyd/= and enable the =keyd= service. [[https://gitlab.com/interception/linux/plugins/caps2esc][caps2esc]] is also great for this purpose, but I find keyd a little easier to use. It's capable of way more than just what I use it for, and [[https://github.com/kmonad/kmonad][kmonad]] is even fancier, but keyd works great.

*** Zathura
My pdf viewer of choice is [[https://pwmt.org/projects/zathura/][zathura]], which is simply excellent. Configurable, uses vim keybindings, does exactly what I need it to out of the box and nothing more. I've tried to get into [[https://sioyek.info/][sioyek]] in the past, but never quite figured it out.

*** Pianobar
[[https://github.com/PromyLOPh/pianobar][Pianobar]] is one of the most underrated pieces of software ever. It's an absolutely phenomenal cli [[https://pandora.com][pandora]] client (that skips ads btw). As just a cli, it's phenomenal, but it's also very easy to build on top of. I'm not much of a hacker, but I was easily able to throw together some scripts to let me pause, skip songs, etc. from keybinds from river, change the station with a dmenu style menu, and send notifications upon song changes with the album art and everything. All with a couple tiny bash scripts. If you don't want to set this up manually, there are also several pieces of software built on top of pianobar, my favorite being [[https://pithos.github.io/][pithos]] (though [[https://github.com/agrif/pianobar.el][pianobar.el]] is also a ton of fun, it just doesn't work very well for me).

** Colors

I currently use [[https://github.com/catppuccin][catppuccin]] for everything. I'm getting a little tired of catppuccin, but it has the most complete list of ports of any colorscheme I've ever seen, maybe just shy of Dracula, even compared to much older staples like Nord, Gruvbox, or Solarized. Since I've already painstakingly themed everything I use with catppuccin colors, it's too late to switch now.

I do like [[https://protesilaos.com/emacs/modus-themes][modus-themes]] on emacs, and used gruvbox pretty heavily when starting out. There's no shortage of good themes.
