Config files for various tools I use, or have used in the past, such as fish, git, jed, and Visual Studio Code.
It's very unlikely that anyone will want to use this directly; the more interesting directories are:
- fish - configuration and startup files for fish shell.
- bin - bash scripts for various things.
- fish functions - more scripts, generally those that are awkward/impossible to write in bash.
- etc/git/templates - git hooks
- docker - Dockerfile
The idempotent install script handles a few different operating systems and package managers (past and present) has a some interesting constructions that may be useful.
Getting locale-related errors when going through these steps?
- Generate missing locales:
locale-gen en_GB.UTF-8
- Ubuntu:
sudo apt-get install git-core - OS X:
xcode-select --install(or install Xcode)
No
sudo? (If, for example, you're on a Gandi VPS.)
- Login as root:
ssh root@server- Install
sudo:apt-get install sudo- Edit
/etc/sudoers:visudo- Add the line:
mjs ALL=(ALL) NOPASSWD:ALL
sudo apt-get install fishVia brew:
brew install fish
chsh -s /bin/bash # .bash_profile runs fish if available (zsh is default)Don't already have
brew?If you want to install into
/opt/homebrew...See http://brew.sh.
If you want to install somewhere else ...
See alternative installs. (Installing into
~/local/homebrew, and symlinkingbrewinto~/local/homebrew/binmight be a good option.)Note that the binaries are symlinked into whatever directory
brewis installed into. (So ifbrewis symlinked into/usr/local/bin, then all executables installed bybrewwill be symlinked into there as well.) This can be useful if you want to installbrewin your home directory, but symlink binaries into/usr/local/bin.
$ cd $HOME
$ git clone https://github.com/ithinkihaveacat/dotfiles.git .dotfiles
$ cd $HOME/.dotfiles
# Pull from ro repo, push to rw
$ git remote set-url origin --push git@github.com:ithinkihaveacat/dotfiles.git
$ ./update # if macOS and brew in PATH
$ PATH=~/local/homebrew/bin:/opt/homebrew/bin:$PATH ./update # if not
# On OS X, logout and login againNote that update may be destructive—if you have "unmanaged" files in
locations such as ~/Library/KeyBindings or ~/Library/Fonts, they will be
wiped out!
(Though it is safe to run update multiple times.)
This repository uses direnv to automatically switch
development environments when entering directories. This is configured via
~/.direnvrc (linked from home/.direnvrc) and hooks in fish/config.fish.
To configure a project, create an .envrc file in the project root.
Node.js versions are managed by the custom node-install script (found in
bin/) and direnv.
-
Install a Node.js version:
node-install 22 # Installs the latest 22.x releaseThis installs the version into
$HOME/.local/share/node/versions. -
Use it in a project:
Add the following to your
.envrc:use node 22 layout node
use node 22selects the version, andlayout nodeaddsnode_modules/.binto the PATH.
Python environments are managed using uv.
-
Use it in a project:
Add the following to your
.envrc:layout uv
This will automatically create a virtual environment (
.venv) if one doesn't exist (usinguv venv) and activate it.
You can also use .envrc to set environment variables on a per-project basis.
This is useful for API keys, configuration flags, or other project-specific
settings.
Example:
export GEMINI_API_KEY="your-api-key"
export PORT=8080When you enter the directory, these variables will be exported. When you leave, they will be unset.
If you have problems installing jed from packages, it can be installed
manually via something like:
# slang
wget http://www.jedsoft.org/snapshots/slang-pre2.3.1-40.tar.gz
# extract
./configure --prefix=$HOME/local \
--libdir=$HOME/local/homebrew/lib \
--includedir=$HOME/local/homebrew/include \
--without-x --without-png
make
make install
# jed
wget http://www.jedsoft.org/snapshots/jed-pre0.99.20-111.tar.gz
# extract
./configure --prefix=$HOME/local \
--libdir=$HOME/local/homebrew/lib \
--includedir=$HOME/local/homebrew/include \
--without-x
make
make install(See this script for some tips on how to change some of these settings automatically.)
Import the [etc/Solarized Dark.terminal](etc/Solarized Dark.terminal) profile,
and set it to the "default". (See
this script for
some information on how to do this automatically.)
- Open System Preferences > Keyboard
- Open Shortcuts > Services > File and Folders, enable "New Terminal at Folder".
- Open Text, disable "Correct spelling automatically".
If signed into the same iCloud account, these should be shared automatically.
Otherwise, see
Back up and share text replacements on Mac.
Text replacements themselves are stored in [etc/Text Replacements.plist](etc/Text Replacements.plist)
Configure via "Keychain Access" preferences.
Control Center | Sound | Always Show in Menu Bar.
sudo tmutil disablelocalhttps://developer.apple.com/download/more/?q=Additional%20Tools
This provides a way to simulate degraded network conditions (more info).
See https://ia.net/writer/templates/.
Via System Preferences.
See https://typography.guru/journal/awesome-catalina-fonts/.
Get emacs keybindings across all gtk apps (source):
gsettings set org.gnome.desktop.interface gtk-key-theme "Emacs"Set the compose key to Caps Lock
so that you can e.g. hold down Caps Lock and type --- to get an mdash.
Open "System Settings", change the fonts as below:
Run the following gconftool commands to set
Solarized colours correctly:
http://stackoverflow.com/a/7734960
Use "Profile Preferences" to change the default font.
Open "Keyboard Shortcuts" and unselect "Enable menu access keys". (Otherwise Alt is used for accessing the menu.)
Edit "Default" profile, change custom default terminal size to 100 columns, 60 rows.
-
Use the Raspberry Pi Imager https://www.raspberrypi.com/software/ to install the OS on an SD card or external SSD.
- For a "headless" version (i.e. without desktop apps), go to "Raspberry Pi OS (other)" and select "Raspberry Pi OS Lite".
- In the OS customization settings, enable SSH access in the "Remote access" section.
- (Optional) Configure Wi-Fi in the "Wi-Fi" section.
-
SSH into the machine:
ssh mjs@lil.local(wheremjsis the username andlilis the hostname provided in the "User" section of the imager).- (Optional) If using Ghostty, copy the terminfo (run from your local
machine):
infocmp -x xterm-ghostty | ssh mjs@lil.local -- tic -x -
- (Optional) If using Ghostty, copy the terminfo (run from your local
machine):
-
Update the OS:
sudo apt-get update && sudo apt-get upgrade -y- If
/var/run/reboot-requiredexists (created if a package update requires a reboot), reboot:sudo reboot.
- If
-
Install
fishfrom the OpenSUSE Build Service (for the latest version):curl -fsSL https://download.opensuse.org/repositories/shells:fish:release:4/Debian_Unstable/Release.key | \ gpg --dearmor | sudo tee /usr/share/keyrings/fish-shell.gpg > /dev/null echo 'deb [signed-by=/usr/share/keyrings/fish-shell.gpg] https://download.opensuse.org/repositories/shells:/fish:/release:/4/Debian_Unstable/ /' | \ sudo tee /etc/apt/sources.list.d/fish-shell.list sudo apt update && sudo apt install -y fish
Alternatively, install the (older) version from the Debian repos:
sudo apt-get install fish. -
Install
git:sudo apt-get install git. -
Install
tailscale:curl -fsSL https://tailscale.com/install.sh | shhttps://tailscale.com/download/linux- Log in to Tailscale:
sudo tailscale up
- Log in to Tailscale:
-
(Optional) Install
nodejsandnpm:sudo apt-get install nodejs npm. Note that these may be older versions; for newer versions, see the Node.js section. -
(Optional) Disable WiFi and Bluetooth: add
dtoverlay=disable-wifianddtoverlay=disable-bton separate lines under the[all]section in/boot/firmware/config.txt. (See the overlays README for more info.) -
(Optional) Change the hostname: edit
/etc/hostnameand/etc/hosts, replacing the old hostname with the new one in both files.
A reboot is recommended after performing any of the optional configuration steps
above (such as disabling WiFi/Bluetooth or changing the hostname) to ensure that
the changes are consistently applied across the system: sudo reboot.
Once complete, the Raspberry Pi is ready for user configuration. Proceed to the Installation section to clone these dotfiles and set up your environment.
Recommendation: use VS Code's Remote - SSH extension to edit files.
Put them in ~/local/bin, and man pages (if you have them) in
~/local/share/man/man?. (man --path lists the man page search path.)
