dotfiles
dotfiles copied to clipboard
Dotfiles & Developer Environment. Supports Ubuntu2004+, macOS Catalina+, Windows 10 w WSL
Dotfiles & Developer Environment 
Cross-platform dotfiles & developer environment for PopOS (Ubuntu), macOS Catalina+ & Windows 11 with WSL2
Install with curl bash which will download, clone and execute script:
curl -fsSL https://raw.githubusercontent.com/jthegedus/dotfiles/main/dotfiles.bash | bash
⚠️ Always read script contents before executing via "curl-bash" - read Friends don't let friends Curl | Bash
Run install script locally after clone:
git clone https://github.com/jthegedus/dotfiles ~/projects/dotfiles
bash ~/projects/dotfiles/dotfiles.bash
Contents
- Contents
- Types of Software
-
Installled with script
- Rolling Version Software
- Pinned Version Software
-
Other Useful Software
- Fonts
- Linux / Gnome stuff
- Uninstall
- Why Nushell
- TODO
- License
Types of Software
There are 2 categories of software:
- install once with rolling version updates: OS, browsers, editors, shells, prompts etc.
- install multiple times & pin to specific versions: runtimes and tools used to develop & build projects defined on a per-project basis (
asdf
as an example)
Available solutions to this problem
How you manage and install these 2 categories of software is very difficult to maintain, especially across multiple machines and OSs. How should you manage dependencies that span the boundaries of these two types of top-level software categories? Eg: your browser could require a dependency to be updated that is used by a pinned version of a runtime used for a specific project. There doesn't seem to be a perfect solution.
Desired properties to tackle this problem can be observed below:
tool | os-level install | manages dep graph | version pinning per-project | Debian/Ubuntu | Windows11 (non-WSL) | macOS |
---|---|---|---|---|---|---|
aptitude | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ |
Homebrew |
✅ | ✅ | ❌ | ✅ | ❌ | ✅ |
asdf |
✅ | ❌ | ✅ | ✅ | ❌ | ✅ |
Nix |
✅* | ✅ | ✅ | ✅ | ❌ | ✅ |
Docker/Vagrant | ❌ | ✅ | ✅ | ✅ | ✅* | ✅ |
NixOS appears to be the best solution to this problem. Unfortunately it does not support windows11, NixOS is itself an operating system and configuration requires learning the .nix
language.
In my opinion rolling version updates should use the systems native package manager. And unless you're willing to put in the hours to learn Nix then asdf
is a decent fit for version pinning per-project.
Installled with script
Rolling Version Software
-
nushell
: a new type of shell -
starship
: cross-shell theme -
asdf
: Manage multiple runtime versions with a single CLI tool -
powerline fonts
-
ripgrep
: recursively search directories for a regex pattern while respecting your gitignore -
zoxide
: A smarter cd command -
bat
: A cat(1) clone with wings -
fd
: A simple, fast and user-friendly alternative to 'find'
Pinned Version Software
Naturally these should be managed per-project for which we have chosen asdf
.
Other Useful Software
Not installed automatically with this repo's script, but worth looking into:
-
input-leap
(fork of Barrier which is fork of Synergy 1.9): Open-source KVM software - VSCode: File editor with plugins. See https://vscode.dev for an in-browser experience.
Fonts
- JetBrains Mono: mono, ligatures, free
- Microsoft's Cascadia Code with Powerlines: mono, ligatures, free
- Fira Code: mono, ligatures, free
- Dank Mono: mono, ligatures, paid (although reasonable)
- Hack: mono, free
PopOS / Gnome stuff
I rely on the PopOS distro for:
- tiling behaviour in Gnome as previous extensions I used were not as reliable
- make tab switching swap all app windows not just apps:
Settings > Keyboard > customize keyboard shortcuts > Navigation > Switch Windows: set to use the keyboard combo you like, eg:
alt+tab
Gnome Extensions:
- Caffeine: Disable the screensaver and auto suspend
Uninstall
curl -fsSL https://raw.githubusercontent.com/jthegedus/dotfiles/dotfiles.bash | bash -- -s --uninstall
or locally
bash ~/projects/dotfiles/dotfiles.bash --uninstall
Why Nushell
Nushell has a delightful core set of features that allow easy replacement of many tools. It achieves most of these features by treating "everything as data". For example, jq or jql can be replaced with inbuilt commands:
dotfiles on main took 521ms
➜ fetch https://api.github.com/repos/jthegedus/dotfiles | select created_at
───┬──────────────────────
# │ created_at
───┼──────────────────────
0 │ 2017-03-28T01:04:13Z
───┴──────────────────────
dotfiles on main
➜ (fetch https://api.github.com/repos/jthegedus/dotfiles).created_at
2017-03-28T01:04:13Z
Over the years I have slowly moved from extremely custom systems to a smaller set of more powerful tools allowing the same flexibility. From i3wm on Ubuntu to PopOS with it's tiling defaults, bash -> zsh -> nushell achieves the same simplification of toolset by utilising a newer tool that is built on the experience and learning from the past.
TODO
- macOS support in installer script
- native Windows11 support
- find binary alternative(s) to thefuck
- per-directory gitconfigs like https://stackoverflow.com/a/43884702
- global with includes to per-dir configs:
~/.gitconfig
-> symlinked to~/projects/dotfiles/gitconfigs/.global.gitconfig
- personal:
~/projects/dotfiles/gitconfigs/.personal.gitconfig
- work:
~/projects/dotfiles/gitconfigs/.work.gitconfig
- global with includes to per-dir configs:
License
MIT License © James Hegedus