diff --git a/2024-06-21_Dotfiles.md b/2024-06-21_Dotfiles.md new file mode 100644 index 0000000..64b1eec --- /dev/null +++ b/2024-06-21_Dotfiles.md @@ -0,0 +1,198 @@ +--- +date: 2024-06-21 +title: Dotfiles +tags: + - homelab + - linux + - bash + - development +--- + +In [my previous post](https://blog.mcknight.tech/2024/04/21/Kubernetes-Tools/#Future-Plans), +I mentioned syncing dotfiles as a future task. I considered using Nextcloud to sync my home +directory, but realistically I only want a small subset of files to sync between devices. I +also don't necessarily want to share sensitive data like SSH keys or device-specific +configuration the same way I do dotfiles. For now, I've decided to put things in a +git [repository](https://git.mcknight.tech/d_mcknight/dotfiles); this makes updates simple `git` actions +and allows me to pull everything to a new environment easily. + +## `.bashrc` +I [previously documented my .bashrc](https://blog.mcknight.tech/2024/03/27/Shell-Customizations/#BASH-Configuration) +but have added a couple new things. + +```shell +alias sudosu="sudo bash --rcfile ~/.bashrc" + +if [ -n "${SUDO_USER}" ]; then + alias nano="nano --rcfile \"/home/${SUDO_USER}/.nanorc\"" +fi +``` + +The `sudosu` alias allows me to open a root shell with my customized `.bashrc`, without modifying the `root` directory. +This means any changes to `~/.bashrc` are available in an elevated shell automatically. The `nano` alias likewise +applies customizations in an elevated shell. + +## `.nanorc` +The `nanorc` file is [documented here](https://www.nano-editor.org/dist/latest/nanorc.5.html). I keep mine at +`~/.nanorc` for simplicity and have a few customizations: + +``` +set smarthome +# home goes to the first non-whitespace character instead of the start of the line +set keycolor cyan,gray +set titlecolor cyan,gray +# color to match my other terminal customizations +``` + +There are many other ways to customize `nano`, and many other editors available. + +## `.tmux.conf` +As I continue to use `tmux`, I've found some helpful customizations that make it +easier to use. The config file is pretty big, so I'll go over it in sections. + +``` +# Custom Prefix +set -g prefix C-space +``` +Rebinds the prefix to `ctrl`+`space` which is a bit easier to reach than +`ctrl`+`c`. + +``` +# Shortcut to sync panes +bind C-x setw synchronize-panes +``` +Adds a shorcut to synchronize inputs between all panes. This is occasionally useful +for things like benchmarking multiple systems, or running tasks in parallel. + +``` +# Shortcut to respawn panw +bind M-r respawn-pane -k +``` +This is particularly useful on my laptop, where I'll sleep the machine with an SSH +session left over and come back later. This preserves the pane layout but kills any +processes (like a dead SSH session). + + +``` +# Mouse Scrolling +set -g mouse on +``` +Enables mouse actions, such as scrolling and pane selection/resizing. + + +``` +# Mouse Copy +bind -T copy-mode C-C send -X copy-pipe-no-clear "xsel -i --clipboard"\; display "Copied" +bind -T copy-mode-vi C-C send -X copy-pipe-no-clear "xsel -i --clipboard"\; display "Copied" +``` +Enables copying highlighted text with `ctrl`+`c`; I prefer using the mouse over the +keyboard shortcuts, mostly because its what I'm used to. + + +``` +# Split +bind S-down split-window -v +bind S-right split-window -h +``` +Rebinds `shift`+`down` and `shift`+`right` to open a new split below or to the right +of the selected window. Much easier to remember than the defaults that I've already +forgotten. +> These are both handled after the prefix command. + + +``` +# Navigation +bind -n C-Left select-pane -L +bind -n C-Right select-pane -R +bind -n C-Up select-pane -U +bind -n C-Down select-pane -D + +bind -n C-S-Left previous-window +bind -n C-S-Right next-window +``` +Faster keybindings to navigate between panes and easier to remember bindings to switch +views. `ctrl`+arrow to move between panes (no prefix required) and +`ctrl`+`shift`+`left`/`right` to move between windows. + + +``` +# Config +bind R source-file ~/.tmux.conf \; display "Config reloaded!" +``` +Adds a shortcut (`shift`+`R`) to reload config and display a confirmation +in the lower left of the window. + +``` +# Colors +set -g default-terminal "screen-256color" +set -g pane-border-style fg='#008b8b' +set -g pane-active-border-style fg='#34E2E2' + +set -g message-style bg='#222222',fg='#34E2E2' +set -g status-style bg='#222222',fg='#AD7FA8' +``` +Sets window chrome to match other colors (`nano` and my custom prompt). + +``` +# Status +set -g status-left '#{?client_prefix,#[fg=#008b8b]█, }' +set -g status-interval 1 +set-window-option -g window-status-style fg='#008b8b',bg=default +set-window-option -g window-status-current-style fg='#222222',bg='#ad7fa8' +``` +Customizes the status bar. When the prefix is pressed, +a colored block in the bottom left of the terminal provides visual +confirmation (especially helpful when you have nested tmux sessions, +such as an SSH connection where the remote is also running tmux). + The status styling gives the active window an inverted +scheme to be easily identified at a glance. + + +I figured out most of this through trial and error and anticipate more +changes as I continue to adapt my workflows to use `tmux`. There are +countless guides and examples on the internet, so I will definitely be +experimenting with more plugins and options. + +## `.dircolors` +For most cases, the default highlighting in directory listings works great. +I've noticed in a few terminals though, you can end up with low contrast +between text and background colors. If you're customizing everything in +`tmux` as I am, it is nice to make sure text from `ls`, etc. matches the +overall theme, and more importantly is easy to read. + +To load custom directory colors, I added to my `.bashrc`: + +```shell +[ -f ~/.dircolors ] && eval "$(dircolors ~/.dircolors)" +``` + +To generate the default `.dircolors` file: +```shell +dircolors -p > .dircolors +``` + +I left the majority of these as the default values, but there were two +fields I changed because the green text on blue background was very low +contrast and hard to read: + +``` +STICKY_OTHER_WRITABLE 30;45 # dir that is sticky and other-writable (+t,o+w) +OTHER_WRITABLE 26;45 # dir that is other-writable (o+w) and not sticky +``` + +I wasn't able to find an official reference for the color codes used here, +but [this StackExchange post](https://unix.stackexchange.com/a/94505) was +a very helpful reference. + +## Synchronizing Changes +As mentioned in the beginning of this post, all of these files are saved +in a git repository for easy synchronization. To link the repo files to +the expected locations, I have a simple `setup` script along with the +dotfiles. This only needs to be run once on a computer and then any +subsequent updates are simply pulled from git. + +> Side note, if you're not using SSH for git operations, do it. I spent + years dealing with tokens for password authentication (realistically, + my IDE did this automatically 99% of the time) and just uploading a + key to GitHub/GitLab and replacing `http` with `ssh` obviates the + whole thing.