This is my personal dotfiles which contain config for Neovim, vim, zsh, tmux, git, fzf etc.
Configuration files live in this repo and are symlinked into $HOME by dotbot; the Makefile wraps every install/update command. Edit a file in the repo and the change takes effect immediately through the symlink — then commit and push to sync it to your other machines.
Bootstrap a brand-new machine with dotbot:
cd ~
git clone git@github.com:einverne/dotfiles.git
cd dotfiles
make bootstrap # create all symlinks (nvim, vim, zsh, tmux, git, fzf, ...)
make mac # install GUI apps + CLI tools via brew (neovim, mise, ripgrep, fd, ...)
make macos # apply macOS system defaults (optional)Then finish the first-run steps:
- Log out and log back in — zinit installs all zsh plugins automatically.
- Run
nvimonce — lazy.nvim bootstraps and installs every Neovim plugin; Mason installs the language server the first time you open a file of that type. - In tmux, press
Ctrl-b+I— tpm installs all tmux plugins.
Disable .DS_Store creation on network and USB volumes (also included in macos/init_mac.sh):
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true
defaults write com.apple.desktopservices DSDontWriteUSBStores -bool truecd ~/dotfiles
git pull
make dotfiles # rebuild symlinks (run after pulling new links, e.g. the nvim config)
# or
make update # update everything, including submodulesRun make help to list every documented target.
| Command | What it does |
|---|---|
make bootstrap |
New-machine init: create symlinks + base bootstrap |
make dotfiles |
Rebuild symlinks only (run after editing config/install.conf.yml) |
make mac |
Install macOS apps and CLI tools via brew (includes mise) |
make brew |
Batch-install from ~/.Brewfile via brew bundle (includes mise) |
make mise |
Install mise standalone (normally covered by the brew flow) |
make tmux |
Install non-brew tools such as the tmux plugin manager |
make macos |
Run the macOS system-defaults scripts |
make linux / make termux |
Provision a Linux / Termux environment |
make update |
Update everything |
Install dependency first:
pkg install make python vim git
then:
git clone git@github.com:einverne/dotfiles.git
cd dotfiles
make termux
- using dotbot to manage dotfiles, read more
- zsh, using zinit as zsh plugin management
- Neovim, the primary editor, using lazy.nvim to manage plugins. Config lives under
.config/nvim/.viis aliased tonvimand$EDITORisnvim. See the Neovim config section below. - vim (legacy), kept for compatibility and still driven by vim-plug. Run
vimdirectly to use it;:PlugInstallinstalls its plugins. - tmux, using tpm to manage tmux plugins, in tmux, press
Ctrl +B+Ito install all tmux plugins. - mise to manage runtime versions (Python / Node / Flutter, ...), installed via brew.
- other useful tools, like fzf to fuzzy search, ripgrep for recursively searching directories, zoxide to replace cd, exa to replace ls.
GUI applications:
- Karabiner-Elements
- Hammerspoon
Terminal font:
- Ghostty uses
Fira Codeas the primary terminal font, withPingFang SCas the Chinese fallback. - Install the font on macOS with
brew install --cask font-fira-code.
This repository includes Claude Code skills and agents for enhanced AI assistance:
Specialized domain expertise that Claude can invoke:
- git-workflow: Git operations and best practices
- shell-scripting: Bash/Zsh scripting and automation
- dotfiles-manager: Dotfiles organization and management
- debug-helper: Debugging and troubleshooting
- performance-optimizer: Code and script optimization
- test-expert: Testing and TDD practices
See .claude/skills/README.md for detailed usage.
Autonomous task execution specialists:
- code-reviewer: Comprehensive code review
- backend-architect: Backend design and architecture
- frontend-developer: Frontend development
- typescript-pro: TypeScript expertise
- flutter-expert: Flutter development
- ui-ux-designer: UI/UX design guidance
to see .zshrc file.
Neovim is the primary editor. Its config is a modular Lua setup under .config/nvim/, symlinked to ~/.config/nvim and managed by lazy.nvim.
.config/nvim/
├── init.lua # entry: leader → options → keymaps → autocmds → lazy
├── lua/config/ # options, keymaps, autocmds, lazy bootstrap
└── lua/plugins/ # one file per plugin group
- First launch installs every plugin automatically; language servers are installed on demand by Mason.
- Requires a Nerd Font terminal font plus
ripgrepandfd(all in the brew install) for icons and Telescope search. - Manage things in-editor with
:Lazy(plugins),:Mason(language servers) and:checkhealth. - Leader key is
,. See.config/nvim/README.mdfor the full keymap table and the Vim→Neovim plugin mapping.
The original Vim setup is kept for compatibility — run vim directly to use it (vi is aliased to nvim). vim-plug related configuration is under vim-plug_vimrc, to show all plugins list, use :PluginList in vim. Python related configurations are under python_vimrc.
- bin/: executable shell scripts, Anything in bin/ will get added to your $PATH and be made available everywhere.
- conf/: configuration file of zsh etc
Neovim is the primary editor (see Neovim config). The steps below apply only to the legacy
vim.
Enter the vim and then run :PlugInstall to install all plugins.
Or, you can do it manually follow the step:
Enter vim, run :PlugInstall, after install all plugin, you will meet an error,
Taglist: Exuberant ctags (http://ctags.sf.net) not found in PATH. Plugin is not loaded.
For Ubuntu and derivatives:
sudo apt-get install exuberant-ctags
with yum:
sudo yum install ctags-etags
I take some Tmux config from gpakosz. If you want to learn more about tmux, you can check this article.
You can manually install tmux plugins by prefix + I.
Tmux need:
tmux >= 2.1- You should set
$TERMenvironment forxterm-256color
Tmux config:
- You can use
C-bas prefix, and useC-aas second choice prefix + |to split panel vertically,prefix + -split panel horizontallyC-hjklto switch paneprefix + Shift + HJKLto adjust pane size
Copy mode:
- Enter copy mode with
prefix + [ - Use
Spaceto start selection, thenEnterto copy - In vi mode, use
vto start selection, thenyto copy - You can also drag with the mouse, and copy on mouse release
- Local sessions prefer the system clipboard directly; remote SSH sessions fall back to OSC 52 so copied text can reach the outer terminal clipboard
- See
tmux/OSC52_CLIPBOARD.mdfor more details about the remote clipboard setup
I use Tmux Plugin Manager to manage tmux plugins, and by default I use following plugins:
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-yank'
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'
set -g @plugin 'tmux-plugins/tmux-open'
set -g @plugin 'tmux-plugins/tmux-copycat'
There are following alias in .zshrc :
- fe : open file using $EDITOR
- fo : open file Ctrl-o using open, Ctrl-e use $EDITOR
- fcd : cd path (fd to replace find)
- fkill : kill process
- tm : tm new tmux session
- fs : tmux attach tmux session
Karabiner-Elements configuration uses a hybrid approach since Goku does not support keyboard_type_if conditions needed for JIS keyboard remapping.
karabiner.edn- Goku source file for non-JIS rules (caps lock, ctrl+n/p, app-specific shortcuts, simlayers, etc.)jis-rules.json- JIS keyboard layout remapping rules (20 rules, requireskeyboard_type_ifwhich Goku cannot express)merge-karabiner.sh- Script to merge Goku-generated config with JIS rules
# 1. After editing karabiner.edn, run goku to generate base config
goku
# 2. Merge JIS rules into the generated config
./karabiner/merge-karabiner.shThe JIS rules remap a Japanese keyboard layout to produce US ANSI characters. Key mappings include @ to [, [ to ], ^ to =, : to ', ¥ to `, and their shifted variants.
The shift+bracket rules (shift+@ → {, shift+[ → }) intentionally exclude command from optional modifiers so that Cmd+Shift+[ / Cmd+Shift+] pass through as raw keycodes for native tab switching in apps like Ghostty.