This repository contains tools and configurations I use in the shell. It includes no graphical configurations, making it usable on servers and personal workstations. It has been battle-tested on macOS and various Linux distributions, including Debian, Ubuntu, CentOS, and even WSL.
I'm a big fan of the XDG Base Directory
Specification
and organize my dotfiles in a way that they don't clutter the $HOME
directory. I have reduced the files required in $HOME
to a single
.zshenv
; everything else goes under standard XDG paths or is launched via
aliases. Additionally, if you have root permissions, you can install dotfiles
with zero home presence.
- Extensive Zsh configuration and plugins, including:
- Vim configuration and plugins
- Neovim configuration and plugins
- Tmux configuration and plugins
- Yazi configuration and plugins
- Other configurations:
- Handy utilities, including:
- fzf
- spark to draw bar charts right in the console
- diff-so-fancy for a much better git diff layout
- git-extras additional helpers for Git
- Environment wrappers for multiple programming languages:
Warning
I'm in process on switching to Neovim. Vim configuration isn't maintained anymore, might be removed in future.
zsh
version 5.9 or newer is strongly recommendedgit
all external components are added as git submodules
make
required to install git helpersperl
diff-so-fancy runtimedelta
will be used as git pager instead of diff-so-fancyfd
orrg
orag
will be used as fzf default commandbat
will be used in fzf preview window and as man pager
Dotfiles can be installed in any directory, but probably somewhere under
$HOME
. Personally, I use $HOME/.local/dotfiles
. The installation is
simple:
git clone https://github.com/z0rc/dotfiles.git "$HOME/.local/dotfiles"
$HOME/.local/dotfiles/deploy.zsh
chsh -s /bin/zsh
The deployment script helps set up all required symlinks after the initial clone. It also adds a cron job to pull updates every midnight and serves as a post-merge git hook, so you don't have to worry about updating submodules after a successful pull.
It's possible to install dotfiles without creating a ~/.zshenv
symlink. To
do so, set the environment variable ZDOTDIR
to <installation dir>/zsh
,
e.g., $HOME/.local/dotfiles/zsh
. This variable should be set very early in
the login process, before zsh starts sourcing the user's .zshenv
. One
possible option is to add:
export ZDOTDIR="$HOME/.local/dotfiles/zsh"
into /etc/zsh/zshenv
. Alternatively, you can set it with a PAM environment
module.
Neovim configuration is tested with latest released Neovim version only. At the moment of writing it's version 0.11.0.
Vim 9.1 or higher is required to support the XDG Base Directory Specification. To use all bundled vim plugins, install vim with Python and Ruby support built-in.
Update ~/.config/git/local/user
with your email and name. It should look
like this:
[user]
email = jdoe@example.com
name = John Doe
You can also add additional configurations in ~/.config/git/local/stuff
.
Note that Zsh configuration skips every global configuration file except
/etc/zsh/zshenv
.
You can add your local configuration into $ZDOTDIR/env.d/9[0-9]_*
and
$ZDOTDIR/rc.d/9[0-9]_*
. The difference is that env.d
is sourced always,
while rc.d
is sourced only in interactive sessions.
Additionally, $ZDOTDIR/.zlogin
and $ZDOTDIR/.zlogout
are available for
modifications, though they are missing by default.
Local configuration can be added to:
$DOTFILES/nvim/init/0[1-9]_*
(like01_local.lua
) to load after default options, but before any plugin.$DOTFILES/nvim/init/9[0-9]_*
(like99_local.vim
) to load after plugins.
Add your local configuration to $DOTFILES/vim/vimrc.local
.
Local binaries can be placed in $HOME/.local/bin
; it's added to PATH
by
default. Man pages can be placed in $XDG_DATA_HOME/man
.
Pyenv and similar wrappers are lazy-loaded, meaning they won't be initialized
at shell start. Activation occurs on the first execution. Check the output of
type -f pyenv
in the shell and the
implementation. Because of this, files like
.python-version
won't work as expected; it's recommended to use
autoenv.zsh
to explicitly activate the needed environment.
For example, Htop updates its config file htoprc
when changing any view
mode or sort order. To ignore local changes to configuration files, you can do:
git update-index --assume-unchanged configs/htoprc
To restore git tracking of those files, use:
git update-index --no-assume-unchanged configs/htoprc