Document dotfiles
This commit is contained in:
parent
199639b4ca
commit
7378c832c8
1 changed files with 198 additions and 0 deletions
198
2024-06-21_Dotfiles.md
Normal file
198
2024-06-21_Dotfiles.md
Normal file
|
@ -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.
|
Loading…
Reference in a new issue