Merge branch 'DotFiles' into 'main'
Document dotfiles See merge request d_mcknight/blog-content!8
This commit is contained in:
commit
d075971f3c
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