[Log] My Linux Post-Installation Setup.

6 min

TODOs:

  • yazi
  • Kitty
  • Zsh
  • tmux
  • lazygit
  • Nvim
  • Terminal tools(fzf, bat, fdfind, zoxide)

Linux Toolchain

My daily-driver setup on KDE Plasma / Ubuntu. Everything lives under ~/.config/.


Terminal: Kitty

~/.config/kitty/
├── kitty.conf             # main config (font, window, cursor, tabs, highlights)
├── keyboard.conf          # all key bindings (included from kitty.conf)
├── current-theme.conf     # active color theme (symlink / include)
└── install.sh             # one-click font installer (Maple Mono + Symbols Nerd Font)

Prerequisite

A bundled install.sh downloads and installs the two required fonts:

  1. Maple Mono NF CN — main font with CJK support
  2. Symbols Nerd Font Mono — icon glyphs
cd ~/.config/kitty && chmod +x install.sh && ./install.sh

After installing, press Ctrl+Shift+F5 to reload.

Key Bindings

All bindings live in keyboard.conf. Standard Ctrl+Shift combos throughout.

Tabs:

KeyAction
ctrl+shift+tNew tab (inherits cwd)
ctrl+shift+wClose tab
ctrl+shift+←/→Switch tabs
ctrl+shift+./,Move tab forward / backward
ctrl+shift+alt+tRename tab
ctrl+1-9Jump to tab by number

Windows:

KeyAction
ctrl+shift+enterNew window (inherits cwd)
ctrl+shift+qClose window
ctrl+shift+[/]Previous / next window
ctrl+shift+f/bMove window forward / backward
ctrl+shift+rResize window
ctrl+shift+lCycle layouts

Scroll:

KeyAction
ctrl+shift+↑/↓Scroll line by line
ctrl+shift+pgup/pgdnScroll page
ctrl+shift+home/endTop / bottom
ctrl+shift+hOpen scrollback in pager

Font size:

KeyAction
ctrl+shift+=/-Increase / decrease
ctrl+shift+0Reset

Clipboard:

KeyAction
ctrl+shift+c/vCopy / paste
ctrl+shift+sPaste from selection

Hints & Misc:

KeyAction
ctrl+shift+eOpen URLs with hints
ctrl+shift+p>fPick file path
ctrl+shift+p>lPick line
ctrl+shift+p>wPick word
ctrl+shift+f5Reload config
ctrl+shift+f2Edit config
ctrl+shift+f1Open kitty docs

Ctrl+Shift+M toggles regex markers that color-code log levels inline:

MarkerPatternColor
1INFOBlue (#74c7ec)
2WARNINGYellow (#F9E2AF)
3ERROR / FATALRed (#F38BA8)

Terminal Shell: Zsh

~/.config/zsh/
├── .zshrc             # main interactive shell config
├── .zimrc             # Zim module list
├── .zprofile          # login shell (PATH for pipx)
├── fzf.zsh            # fzf key-bindings + completion (sourced from .zshrc)
└── .zim/              # Zim home (plugins, init.zsh, zimfw.zsh)
    └── modules/       # auto-installed Zim modules

All zsh config lives under ZDOTDIR=~/.config/zsh (set in /etc/zsh/zshenv or ~/.zshenv).

Framework: Zim. Modules are declared in .zimrc and auto-installed on shell start.

Modules (.zimrc)

environment         # sane defaults
zsh-completions     # extra completions
completion          # tab completion engine
git                 # git aliases (G-prefixed: Gws, Gco, Gp, etc.)
input               # keybindings, bracketed paste
termtitle           # dynamic terminal title
utility             # colored ls, grep aliases
git-info            # git status in prompt
duration-info       # command duration tracking
prompt-pwd          # shortened cwd
magicmace           # minimal prompt theme
zsh-autosuggestions # fish-style suggestions
zsh-history-substring-search # up/down history filtering
fast-syntax-highlighting     # real-time syntax coloring
zfm                 # fuzzy bookmark manager (fzf-based)
fzf-tab             # fzf-powered tab completion

Module Configuration

ZSH_AUTOSUGGEST_MANUAL_REBIND=1           # skip auto-rebind on precmd (faster)
ZSH_HIGHLIGHT_HIGHLIGHTERS=(main brackets) # highlight commands + bracket matching

Aliases

alias cat='batcat'
alias fd='fdfind'

Plugins

fzf-tab

Replaces zsh’s default completion menu with fzf. Press Tab as usual — fzf takes over automatically.

KeyAction
TabTrigger fzf completion
Ctrl+SpaceToggle multi-select
F1 / F2Switch completion groups
/Continuous completion (deep paths)
EnterAccept selection
disable-fzf-tab    # temporarily disable, fall back to default
enable-fzf-tab     # re-enable
toggle-fzf-tab     # toggle on/off

fzf shell keybindings

Sourced from fzf.zsh, which bundles fzf’s native key-bindings and completion scripts. These work independently of fzf-tab.

KeyAction
Ctrl+RFuzzy search command history
Ctrl+TFuzzy search files/dirs, insert into command line
Alt+CFuzzy search dirs and cd into selection
<Tab>Trigger path completion (e.g. vim <Tab>, kill -9 <Tab>)

zfm (Zsh Fuzzy Marks)

A bookmark manager for files and directories, built on fzf.

KeyAction
Ctrl+PFuzzy select a bookmarked directory and cd into it
Ctrl+OFuzzy select bookmarks and insert path(s) into command line
zfm add ~/Projects ~/.config       # bookmark directories or files
zfm list                            # list all bookmarks
zfm list --files                    # file bookmarks only
zfm list --dirs                     # directory bookmarks only
zfm edit                            # edit bookmarks in $EDITOR
f <pattern>                         # jump to matching bookmarked directory

Bookmarks are stored in ~/.zfm.txt.


File Manager: Yazi

~/.config/yazi/
├── yazi.toml          # main config (layout, sorting, openers, preview)
├── keymap.toml        # key bindings (vim-style navigation)
├── theme.toml         # colors and borders
├── init.lua           # plugin initialization
├── package.toml       # plugin dependencies (ya pack)
├── starship.toml      # starship prompt config for header
├── bookmark            # saved bookmarks (yamb)
└── plugins/           # installed plugins

Launch: Shell wrapper y (defined in .zshrc) launches yazi and cds to its CWD on exit. From Neovim, press R to open yazi in a full-screen floating window via yazi.nvim.

Key Bindings

Navigation:

KeyAction
h / lParent dir / enter dir or open file (smart-enter)
j / kNext / previous file
H / LHistory back / forward
J / KSeek preview down / up 5 lines
gg / GTop / bottom of list
<C-u> / <C-d>Half-page up / down
gh / gc / gdGo to ~ / ~/.config / ~/Downloads
z / ZJump via fzf / zoxide

File operations:

KeyAction
<Space>Toggle selection
<C-a>Select all
v / VVisual mode / unset mode
y / xYank (copy) / yank (cut)
p / PPaste / paste (overwrite)
d / DTrash / permanent delete
aCreate file (append / for directory)
rRename
.Toggle hidden files

Search & filter:

KeyAction
fFilter files
FJump to a file / directory via fzf
/ / ?Find next / previous
s / SSearch by name (fd) / by content (rg)
, + keySort (,a alpha, ,s size, ,m mtime, etc.)

Copy paths:

KeyAction
cc / cd / cf / cnCopy path / dirname / filename / name without ext

Tabs:

KeyAction
tNew tab with CWD
19Switch to tab N
[ / ]Previous / next tab
{ / }Swap tab with previous / next
<C-c>Close current tab

Bookmarks (yamb):

KeyAction
baAdd bookmark
bg / bGJump by key / by fzf
bd / bDDelete by key / by fzf
br / bRRename by key / by fzf
bADelete all bookmarks

Other:

KeyAction
; / :Shell command / shell command (blocking)
<C-g>Launch lazygit
<Tab>Spot hovered file
ms / mp / mmLine mode: size / permissions / mtime
~Open help
q / QQuit (update CWD) / quit (keep CWD)

Plugins

PluginEffect
git.yaziShow git status indicators (modified, staged, untracked) alongside files
smart-enter.yazil/Enter enters directories or opens files — dual-action smart key
yamb.yaziBookmark manager — save, jump, delete, rename bookmarks with b prefix keys
yaziline.yaziCustom statusline with curvy separators and select/yank icons
full-border.yaziDraw borders around all panes for cleaner visual separation
starship.yaziStarship prompt in the header bar (aws, gcloud, lua modules disabled)

Neovim Integration (yazi.nvim)

Yazi is opened from Neovim via yazi.nvim. Press R to launch a full-screen floating window with no border. Opening a directory with nvim . automatically starts Yazi.

Key (inside floating window)Action
<C-v>Open in vertical split
<C-x>Open in horizontal split
<C-t>Open in new tab
<C-f>Grep in directory
<C-r>Replace in directory
<Tab>Cycle open buffers
<C-y>Copy relative path
<C-q>Send to quickfix list
<F1>Show help

Editor: Neovim

~/.config/nvim/

Structure:

init.lua                 # entry point
lua/config/
  defaults.lua           # vim.opt settings
  keymaps.lua            # custom bindings
  plugins.lua            # lazy.nvim bootstrap
lua/plugins/             # plugin specs (auto-imported)
  core.lua               # telescope, treesitter, which-key
  lsp.lua                # mason, lspconfig
  ui.lua                 # colorscheme, notifications
  editor.lua             # illuminate, autopairs, colorizer, ufo, move
  mini.lua               # mini.ai, mini.icons, mini.surround
  telescope.lua          # telescope config + fzf
  fzf.lua                # fzf-lua grep
  statusline.lua         # lualine
  terminal.lua           # toggleterm
  git.lua                # gitsigns, lazygit
  tabline.lua            # bufferline
  tex.lua                # vimtex (zathura viewer)
  typst.lua              # typst support
  ...

Plugin manager: lazy.nvim (~44 plugins)

Colorscheme: nvim-deus

LSP servers (via Mason): clangd, lua_ls, pylsp, ruff, texlab, tinymist, ts_ls, marksman

Key Settings

SettingValue
LeaderSpace
TabsHard tabs, width 4
Line numbersHybrid (absolute + relative)
ClipboardSystem (unnamedplus)
FoldingIndent-based, all open by default
SplitsRight / below
SearchSmart case, live preview

Key Bindings

KeyAction
SSave
QSave + quit
jkExit insert mode
;Command mode
H / LLine start / end
J / K5 lines down / up
<C-p>Find files (telescope)
<C-f>Global grep (fzf-lua)
<C-g>Lazygit
<C-\>Toggle floating terminal
<leader>ffFind files
<leader>fgLive grep
<leader>fbBuffers
<leader>eFile tree
<leader>dDiagnostics
gdGo to definition
gDGo to definition (split)
<Tab> / <S-Tab>Next / prev buffer
<leader>xClose buffer
s{motion}Substitute with yanked text
sa / sd / srSurround add / delete / replace
gccToggle comment
H (git)Preview hunk

Multiplexer: tmux

~/.config/tmux/tmux.conf

Prefix: Ctrl-a (rebound from default Ctrl-b)

SettingValue
MouseOn
Base index1
Escape time0 (for nvim)
True colorEnabled (terminal-overrides)
ThemeCatppuccin Mocha

Pane splitting: | horizontal, - vertical

Pane navigation: prefix + h/j/k/l (vim-style)

Config reload: prefix + r

Plugins (TPM):

tmux-plugins/tpm              # plugin manager
tmux-plugins/tmux-sensible    # sensible defaults
christoomey/vim-tmux-navigator # Ctrl-h/j/k/l across tmux + nvim
catppuccin/tmux               # theme (mocha)

The vim-tmux-navigator plugin makes Ctrl-h/j/k/l seamlessly switch between tmux panes and neovim splits.


Git TUI: Lazygit

~/.config/lazygit/config.yml   # empty (defaults)

Running with all defaults. Accessed primarily through nvim via <C-g> (lazygit.nvim plugin).


Other Tools

ToolCommandReplacesCore FunctionBasic Usage Example
zoxidezcdSmart Directory Jumper: Navigates to directories based on frequency and recency without full paths.z pro
(Jumps to /home/user/projects)
ripgreprggrepFast Text Search: Recursively searches files for text/regex patterns. Respects .gitignore by default.rg "main" src/
(Finds “main” inside files in src/)
batbat / batcat*catEnhanced File Viewer: Displays file contents with syntax highlighting, line numbers, and Git integration.bat config.json
(Pretty-prints the JSON file)
fdfd / fdfind*findFast File Finder: Locates files/directories on the filesystem with simple syntax. Respects .gitignore.fd logo
(Finds files named “logo” recursively)
TIP

On Ubuntu/Debian, bat is installed as batcat and fd is installed as fdfind due to naming conflicts.


Summary

ToolConfig LocationTheme/Style
Kitty~/.config/kitty/Catppuccin Mocha
Zsh~/.config/zsh/Zim + magicmace prompt
KDE Plasma~/.config/kde*Apple-Ventura-Dark + Gruvbox icons
Clash-Verge~/.config/clash-verge/Rule-based proxy
Chrome~/.config/google-chrome/Default
Neovim~/.config/nvim/nvim-deus, lazy.nvim
Yazi~/.config/yazi/Starship header, yaziline statusline
tmux~/.config/tmux/Catppuccin Mocha
Lazygit~/.config/lazygit/Defaults