Update vim stuff

This commit is contained in:
2026-04-07 08:24:08 -04:00
parent e985792472
commit cfc2b82c06
3 changed files with 307 additions and 0 deletions

View File

@@ -39,6 +39,7 @@ alias ...='cd ../..'
alias ....='cd ../../..'
# Tools
alias vim='vimx'
alias n='nvim'
alias n.="nvim ."
alias ns="nvim src"

292
config/dot/vim/vimrc Normal file
View File

@@ -0,0 +1,292 @@
" =============================================================================
" ~/.vim/vimrc
" Vim config — no plugins, ported from Neovim config.
" Symlink: ln -sf ~/.local/share/Panama/config/dot/vim/vimrc ~/.vim/vimrc
" =============================================================================
" =============================================================================
" GENERAL / COMPATIBILITY
" =============================================================================
" Disable Vi compatibility. Must be first.
set nocompatible
" Enable filetype detection, plugins, and indent files.
filetype plugin indent on
" Enable syntax highlighting.
syntax enable
" =============================================================================
" LEADER KEY
" =============================================================================
" Must be set before any <leader> mappings.
let mapleader = ' '
let maplocalleader = '\'
" =============================================================================
" LINE NUMBERS
" =============================================================================
set number " Absolute line number on current line
set relativenumber " Relative line numbers on all other lines
" =============================================================================
" INDENTATION
" =============================================================================
set tabstop=2 " A <Tab> displays as 2 columns
set softtabstop=2 " <Tab> in insert mode inserts 2 spaces
set shiftwidth=2 " >> and << shift by 2 spaces
set expandtab " Use spaces instead of tab characters
set smartindent " Auto-indent new lines based on context
" =============================================================================
" SWAP / UNDO
" =============================================================================
set noswapfile
" Persistent undo — ~/.vim/undodir must exist (it already does on this machine).
set undodir=~/.vim/undodir
set undofile
" =============================================================================
" SEARCH
" =============================================================================
set hlsearch " Highlight all matches
set incsearch " Show matches as you type
set ignorecase " Case-insensitive by default...
set smartcase " ...unless the query has uppercase
" =============================================================================
" APPEARANCE
" =============================================================================
" 24-bit color — requires a true-color terminal (kitty, ghostty, etc.).
set termguicolors
" Keep 4 lines visible above/below cursor when scrolling.
set scrolloff=4
" Always show the sign column to prevent layout shifts.
set signcolumn=yes
" Reduce delay before CursorHold fires.
set updatetime=50
" Show invisible characters: trailing spaces and non-breaking spaces as ⋅,
" tabs as two spaces so they are visible but not distracting.
set list
set listchars=trail:⋅,nbsp:⋅,tab:\ \
" Always show statusline even with a single window.
set laststatus=2
" habamax is a good built-in dark theme in Vim 9+; fall back to slate.
if v:version >= 900
colorscheme habamax
else
colorscheme slate
endif
" Transparent statusline background (mirrors the Neovim setup).
highlight StatusLine guibg=NONE ctermbg=NONE
highlight StatusLineNC guibg=NONE ctermbg=NONE
" =============================================================================
" STATUS LINE
" =============================================================================
" Mirrors lualine layout: mode | filepath [+][RO] ... filetype | enc | line:col | %
set statusline=
set statusline+=\ %{toupper(mode())}
set statusline+=\ \|\ %f\ %m%r
set statusline+=%=
set statusline+=%y\ \|\ %{&fileencoding?&fileencoding:&encoding}
set statusline+=\ \|\ %l:%c\ \|\ %p%%\
" =============================================================================
" MISCELLANEOUS
" =============================================================================
set ttyfast " Assume a fast terminal connection
set backspace=indent,eol,start " Backspace over everything in insert mode
set nowrap " Don't wrap long lines
set showcmd " Show partial commands in last line
set showmatch " Briefly jump to matching bracket on insert
" =============================================================================
" KEYMAPS — WINDOW NAVIGATION
" =============================================================================
nnoremap <leader>h <C-w>h
nnoremap <leader>j <C-w>j
nnoremap <leader>k <C-w>k
nnoremap <leader>l <C-w>l
vnoremap <leader>h <C-w>h
vnoremap <leader>j <C-w>j
vnoremap <leader>k <C-w>k
vnoremap <leader>l <C-w>l
" =============================================================================
" KEYMAPS — FILE OPERATIONS
" =============================================================================
nnoremap <leader>w :write<CR>
nnoremap <leader>q :quit<CR>
" Source the vimrc (mirrors <leader><leader>s in Neovim).
nnoremap <leader><leader>s :update<CR>:source $MYVIMRC<CR>
" Make the current file executable.
nnoremap <silent> <leader><leader>x :!chmod +x %<CR>
" =============================================================================
" KEYMAPS — LINE MANIPULATION
" =============================================================================
" Move selected lines down / up in visual mode.
vnoremap J :m '>+1<CR>gv=gv
vnoremap K :m '<-2<CR>gv=gv
" Join lines in normal mode while keeping the cursor position fixed.
nnoremap J mzJ`z
" =============================================================================
" KEYMAPS — SCROLL AND SEARCH WITH RECENTERING
" =============================================================================
nnoremap <C-d> <C-d>zz
nnoremap <C-u> <C-u>zz
" Next / previous search result: center view and open any fold.
nnoremap n nzzzv
nnoremap N Nzzzv
" =============================================================================
" KEYMAPS — CLIPBOARD (SYSTEM)
" =============================================================================
" Requires Vim compiled with +clipboard.
" On Fedora, install vim-X11 if needed: sudo dnf install vim-X11
" Verify with :version — look for +clipboard.
nnoremap <leader>p "+p
nnoremap <leader>P "+P
vnoremap <leader>p "+p
vnoremap <leader>P "+P
nnoremap <leader>y "+y
vnoremap <leader>y "+y
nnoremap <leader>yy "+yy
" Yank entire buffer to system clipboard.
nnoremap <leader>YY :%y+<CR>
" Visual: replace selection from clipboard without clobbering the clipboard.
xnoremap <leader>v "_dP
" =============================================================================
" KEYMAPS — VOID-REGISTER DELETE
" =============================================================================
" Delete without touching the unnamed register, preserving the last yank.
nnoremap <leader>d "_d
vnoremap <leader>d "_d
nnoremap <leader>dd "_dd
" =============================================================================
" KEYMAPS — SEARCH AND REPLACE
" =============================================================================
" Replace the word under the cursor across the whole file.
" Cursor is placed inside the replacement text for immediate editing.
nnoremap <leader>sr :%s/\<<C-r><C-w>\>/<C-r><C-w>/gI<Left><Left><Left>
" =============================================================================
" KEYMAPS — DISABLED KEYS
" =============================================================================
nnoremap Q <nop>
" =============================================================================
" KEYMAPS — COMMENT TOGGLE (<leader>c)
" =============================================================================
" Toggles `// ` comments on the current line (normal) or each line in a
" visual selection. Not filetype-aware — works for C, C++, JS, TS, Go, Rust.
" For language-aware comments a plugin like vim-commentary would be needed.
function! ToggleComment() range
let l:first_line = getline(a:firstline)
if l:first_line =~ '^\s*\/\/ '
execute a:firstline . ',' . a:lastline . 's/^\(\s*\)\/\/ /\1/'
else
execute a:firstline . ',' . a:lastline . 's/^\(\s*\)/\1\/\/ /'
endif
endfunction
nnoremap <silent> <leader>c :call ToggleComment()<CR>
vnoremap <silent> <leader>c :call ToggleComment()<CR>
" =============================================================================
" AUTOCOMMANDS
" =============================================================================
augroup VimRCGroup
autocmd!
" Strip trailing whitespace on every save.
autocmd BufWritePre * :%s/\s\+$//e
" Auto-source this vimrc whenever it is saved.
autocmd BufWritePost vimrc source $MYVIMRC
augroup END
" =============================================================================
" HIGHLIGHT YANK
" =============================================================================
" Briefly highlights yanked text using IncSearch colors, then clears it.
" Implements Neovim's vim.highlight.on_yank() using matchadd + timer_start.
" Requires Vim 8.0.1422+ (for v:event) and Vim 8.0+ (for timer_start).
augroup HighlightYank
autocmd!
autocmd TextYankPost * call s:HighlightYank()
augroup END
function! s:HighlightYank()
if v:event.operator !=# 'y'
return
endif
let l:match_id = matchadd('IncSearch',
\ '\%' . line("'[") . 'l\%' . col("'[") . 'c\_.*' .
\ '\%' . line("']") . 'l\%' . col("']") . 'c')
call timer_start(150, {-> s:ClearYankHighlight(l:match_id)})
endfunction
function! s:ClearYankHighlight(match_id)
silent! call matchdelete(a:match_id)
endfunction

View File

@@ -31,6 +31,20 @@ ln -s "$PANAMA_BASH/.bashrc" "$HOME/.bashrc"
dirs=("espanso" "forge" "ghostty" "kitty" "nvim" "tmux")
# --- Vim vimrc ---
echo -e "\n--- Setting up vim ---"
mkdir -p "$HOME/.vim"
if [ -L "$HOME/.vim/vimrc" ]; then
rm "$HOME/.vim/vimrc"
log "Removed old symlink at ~/.vim/vimrc"
fi
if [ -f "$HOME/.vim/vimrc" ]; then
mv "$HOME/.vim/vimrc" "$PANAMA_OLD/vimrc"
log "Moved existing ~/.vim/vimrc to $PANAMA_OLD/vimrc"
fi
ln -s "$PANAMA_DOT/vim/vimrc" "$HOME/.vim/vimrc"
log "Linked $PANAMA_DOT/vim/vimrc → ~/.vim/vimrc"
for dir in "${dirs[@]}"; do
echo -e "\n--- Setting up $dir ---"