{"id":25526145,"url":"https://github.com/exbotanical/dotfiles","last_synced_at":"2026-01-05T19:30:14.375Z","repository":{"id":61708578,"uuid":"207409298","full_name":"exbotanical/dotfiles","owner":"exbotanical","description":"stow-managed configuration files for arch. home to the greatest bash config of all time","archived":false,"fork":false,"pushed_at":"2025-02-11T16:45:55.000Z","size":5798,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-02-11T17:45:52.772Z","etag":null,"topics":["alacritty-config","bash","bash-configs","bashrc","dotfiles","i3wm","linux","posix","shell-scripting","tmux-conf","unix","vimrc"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/exbotanical.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-09-09T21:36:29.000Z","updated_at":"2025-02-11T16:46:01.000Z","dependencies_parsed_at":"2024-01-03T07:24:02.938Z","dependency_job_id":"55d0bfe1-7226-4c19-a1b6-dabbe03ada4e","html_url":"https://github.com/exbotanical/dotfiles","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exbotanical%2Fdotfiles","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exbotanical%2Fdotfiles/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exbotanical%2Fdotfiles/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exbotanical%2Fdotfiles/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/exbotanical","download_url":"https://codeload.github.com/exbotanical/dotfiles/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239735258,"owners_count":19688262,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["alacritty-config","bash","bash-configs","bashrc","dotfiles","i3wm","linux","posix","shell-scripting","tmux-conf","unix","vimrc"],"created_at":"2025-02-19T21:16:50.282Z","updated_at":"2026-01-05T19:30:14.329Z","avatar_url":"https://github.com/exbotanical.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Personal Configurations\n\nThis directory houses my configuration files. It's also home to probably the most intense bash setup ever.\n\n## How it works\nHere's how it all works.\n\nFirst, I manage all dotfiles via [Gnu Stow](https://www.gnu.org/software/stow/). Stow allows one to manage all dotfiles from a single place, then symlink them to their respective locations. For example, all of my dotfiles are housed in a `dotfiles` directory under my home directory. Suppose I need my i3wm config file to reside at `~/.config/i3/config`. I would then structure this as `~/dotfiles/i3/.config/i3/config`. The top-level `i3` directory is simply nominal; everything therein specifies the filepath at which it will exist on the host system when I invoke `stow`.\n\nI use a Makefile to do this: `make install` will invoke `stow`. `make test` will, shockingly, run the unit tests.\n\nOther examples follow. As an exercise to the reader, try looking through the dotfiles directory for each of the following:\n* VSCodium config files must reside in `~/.config/VSCodium/User/*`.\n* X11 configurations reside in the home directory itself.\n\nAs of 7/26/2024 my primary setup consists of:\n* desktop env: x11\n* window manager: i3wm\n* notifications daemon: dunst\n* toolbar: eww\n* shell: bash\n* terminal: alacritty\n\n## Bash Config Framework\n\nI love Bash; it's a bizarre language that can do far more than it should. You may find my Bash config of interest. Instead of the usual rc file, I've written a bespoke Bash configurations framework that allows one to logically and functionally separate commands, aliases, runtime/interactive settings, one-time login settings, and application-specific configurations.\n\nI've taken and adapted a lot of ideas from various folks across the internet, but a noteworthy influence for this setup (and one that certainly deserves accreditation) has been Ted Lilley @binaryphile - some of the setup code has been taken directly from his work, which can be found [here](https://github.com/binaryphile/init.bash).\n\nThe entrypoint for my Bash config resides in [init.bash](bash/.config/bash/init.bash), where we load in a [utility library](bash/.config/bash/lib/utils.bash) and all settings files. This means the utility library is accessible to all settings files; at the end of the init script, we remove all of the utility functions and temporary variables from the shell environment so as not to prevent pollution. The utilities allow us to easily append to the `PATH` (and prevent duplication therein, which is quite a common problem), toggle globbing, temporarily change `IFS`, etc.\n\nWe load several files:\n* [`alias.bash`](bash/.config/bash/src/alias.bash) - global aliases that are non-program specific\n* [`cmd.bash`](bash/.config/bash/src/cmd.bash) - global commands\n* [`env.bash`](bash/.config/bash/src/env.bash) - global environment settings\n* [`interative.bash`](bash/.config/bash/src/interative.bash) - interactive mode settings. These are loaded every time a new shell is spawned.\n* [`login.bash`](bash/.config/bash/src/login.bash) - login settings. These are loaded once, when first initializing the machine.\n\nThere's also a directory called [`apps`](bash/.config/bash/apps). This houses the same 5 configuration files seen above but in the context of a specific application. For example, `git` houses configurations that explicitly pertain to and rely on `git`. In `init.bash`, there's logic that determines whether each program in the `apps` directory actually exists on the machine. If it does, it loads the configuration files; if it doesn't, nothing happens. There's an escape hatch here - `detect.bash`, which can override the app loader and tell it to explicitly load or not load the configurations based on the return code in the file.\n\nThus, `:` inside `detect.bash` (e.g. [here](bash/.config/bash/apps/rust/detect.bash)) means we will *always* load that app's configurations. In other cases, we may check the host OS or [specific files](bash/.config/bash/apps/go/detect.bash) and figure it out from there.\n\nLast, the [config](bash/.config/bash/config) directory houses config for the Bash setup logic - things like feature flags.\n\n### Testing\n\nThe Bash config loader is fully unit-tested using `shpec`. One can find the tests [here](bash/t).\n\n### Scripts\n\nI've written various Bash scripts that are housed [here](bash/.config/bash/scripts). When loading the login configurations, I [load](bash/.config/bash/settings/login.bash#L3) these into `/usr/bin` so they're on the `PATH`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexbotanical%2Fdotfiles","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fexbotanical%2Fdotfiles","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexbotanical%2Fdotfiles/lists"}