Created
October 14, 2025 14:20
-
-
Save Tracnac/d2855fe835b49dc8cf1f9ffd0843292b to your computer and use it in GitHub Desktop.
Vim minimal
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| " Minimal Vim | |
| if !exists('g:loaded_clean_vimrc') | |
| let g:loaded_clean_vimrc = 1 | |
| set all& | |
| set nocompatible | |
| endif | |
| " Create directories for persistent files (undo/backup/swap) | |
| if has('win32') | |
| let s:vim_dir = expand('$APPDATA') . '\\Vim' | |
| call mkdir(s:vim_dir . '\\undo', 'p') | |
| call mkdir(s:vim_dir . '\\backup', 'p') | |
| call mkdir(s:vim_dir . '\\swap', 'p') | |
| else | |
| let s:vim_dir = expand('$HOME') . '/.vim' | |
| call mkdir(s:vim_dir . '/undo', 'p') | |
| call mkdir(s:vim_dir . '/backup', 'p') | |
| call mkdir(s:vim_dir . '/swap', 'p') | |
| endif | |
| " Persistent states | |
| set undofile | |
| set backup | |
| set writebackup | |
| set swapfile | |
| set backupcopy=yes | |
| if has('win32') | |
| let &undodir = s:vim_dir . '\\undo' | |
| let &backupdir = s:vim_dir . '\\backup' | |
| let &directory = s:vim_dir . '\\swap' | |
| else | |
| let &undodir = s:vim_dir . '/undo' | |
| let &backupdir = s:vim_dir . '/backup' | |
| let &directory = s:vim_dir . '/swap' | |
| endif | |
| " Leader key | |
| let mapleader = " " | |
| " ALE options | |
| let g:ale_completion_enabled = 1 | |
| let g:ale_lint_on_text_changed='never' | |
| let g:ale_lint_on_insert_leave = 0 | |
| let g:ale_lint_on_save = 0 | |
| let g:ale_echo_cursor = 0 | |
| let g:ale_hover_cursor=0 | |
| nnoremap <leader>l :ALEToggle<CR> | |
| nnoremap <leader>L :ALELintStop<CR> | |
| " CTRLP options | |
| if executable('rg') | |
| let g:ctrlp_user_command = 'rg --files --hidden --glob "" %s' | |
| elseif executable('fd') | |
| let g:ctrlp_user_command = 'fd --type f --hidden --exclude .git --strip-cwd-prefix %s' | |
| elseif executable('ag') | |
| let g:ctrlp_user_command = 'ag -l --hidden --ignore .git %s' | |
| endif | |
| let g:ctrlp_custom_ignore = { | |
| \ 'dir': '\v[\/]\.(git|hg|svn|node_modules|venv)$', | |
| \ 'file': '\v\.(exe|so|dll|class|o)$', | |
| \ } | |
| let g:ctrlp_use_caching = 1 | |
| let g:ctrlp_map = '<C-p>' | |
| let g:ctrlp_cmd = 'CtrlP' | |
| let g:ctrlp_match_window = 'bottom,order:ttb,min:1,max:15,results:100' | |
| " Netrw | |
| let g:netrw_banner = 0 " no top banner | |
| let g:netrw_liststyle = 3 " tree view | |
| let g:netrw_browse_split = 2 | |
| " let g:netrw_altv = 1 | |
| let g:netrw_winsize = 16 | |
| " Bootstrap (run once in a shell): | |
| " curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim | |
| call plug#begin('~/.vim/plugged') | |
| Plug 'dense-analysis/ale' | |
| Plug 'ctrlpvim/ctrlp.vim' | |
| Plug 'tpope/vim-commentary' | |
| call plug#end() | |
| " Basic behavior | |
| set encoding=utf-8 | |
| set termguicolors | |
| filetype plugin indent on | |
| syntax on | |
| set lazyredraw | |
| set nrformats-=octal | |
| " Editing experience | |
| set hidden | |
| set backspace=indent,eol,start | |
| set nowrap | |
| " Indentation (sane defaults) | |
| set expandtab | |
| set shiftwidth=2 | |
| set softtabstop=2 | |
| set tabstop=2 | |
| set smarttab | |
| set autoindent | |
| set smartindent | |
| " Searching | |
| set incsearch | |
| set hlsearch | |
| set smartcase | |
| " Display | |
| set number | |
| if exists('+relativenumber') | |
| set relativenumber | |
| endif | |
| " set cursorline | |
| set showcmd | |
| set showmatch | |
| set laststatus=2 | |
| set ruler | |
| set showtabline=0 | |
| set formatoptions+=j | |
| hi StatusLineMode guifg=#282828 guibg=#fabd2f gui=bold ctermfg=Black ctermbg=Yellow | |
| set statusline=%#StatusLineMode#%{StatusMode()}%*\ %F\ %y\ %m%r%h%w\ %=\ [%l:%c]\ [%p%%]\ %{StatusTabs()}\ %{StatusBuffers()}\ %{exists('*FugitiveHead')?FugitiveHead():''}\ %{StatusALE()} | |
| set sessionoptions-=options | |
| set viewoptions-=options | |
| set sidescroll=1 | |
| set sidescrolloff=2 | |
| " Performance | |
| set updatetime=300 | |
| set timeoutlen=500 | |
| set ttimeout | |
| set ttimeoutlen=100 | |
| set complete-=i | |
| " Disable mouse by default (change to 'a' to enable) | |
| set mouse= | |
| " Clipboard: leave empty (do not override system clipboard) | |
| set clipboard= | |
| " Wildmenu and completion conveniences | |
| set wildmenu | |
| set wildmode=longest,full | |
| set wildignore+=*/tmp/*,*.so,*.swp,*.zip | |
| set path+=** | |
| " Prevent visual/terminal bells | |
| set noerrorbells | |
| set novisualbell | |
| set t_vb= | |
| " Basic file handling | |
| set autoread | |
| set nowritebackup | |
| " Small helper: Trim trailing whitespace in current buffer | |
| function! TrimWhitespace() | |
| let l:save = winsaveview() | |
| keeppatterns %s/\s\+$//e | |
| call winrestview(l:save) | |
| endfunction | |
| command! TrimWhitespace call TrimWhitespace() | |
| " Show tabs if more than 1 | |
| function! StatusTabs() | |
| if tabpagenr('$') > 1 | |
| return printf('[T:%d/%d]', tabpagenr(), tabpagenr('$')) | |
| endif | |
| return '' | |
| endfunction | |
| " Show buffers if more than 1 | |
| function! StatusBuffers() | |
| let l:buffers = filter(range(1, bufnr('$')), 'buflisted(v:val)') | |
| if len(l:buffers) > 1 | |
| return printf('[B:%d/%d]', bufnr('%'), len(l:buffers)) | |
| endif | |
| return '' | |
| endfunction | |
| " ALE errors and warnings | |
| function! StatusALE() | |
| let l:e = exists('*ale#statusline#Count') ? ale#statusline#Count('E') : 0 | |
| let l:w = exists('*ale#statusline#Count') ? ale#statusline#Count('W') : 0 | |
| if l:e > 0 || l:w > 0 | |
| return printf('E:%d W:%d', l:e, l:w) | |
| endif | |
| return '' | |
| endfunction | |
| " Minimal statusline | |
| function! StatusMode() | |
| let l:ms = mode() | |
| if l:ms ==# 'n' | |
| return 'NORMAL' | |
| elseif l:ms ==# 'i' | |
| return 'INSERT' | |
| elseif l:ms ==# 'R' || l:ms ==# 'Rv' | |
| return 'REPLACE' | |
| elseif l:ms ==# 'v' || l:ms ==# 'V' || l:ms ==# "\<C-v>" | |
| return 'VISUAL' | |
| elseif l:ms ==# 'c' | |
| return 'COMMAND' | |
| elseif l:ms ==# 't' | |
| return 'TERMINAL' | |
| else | |
| return toupper(l:ms) | |
| endif | |
| endfunction | |
| " Simple mappings | |
| nnoremap <silent> <leader>e :Lexplore<CR> | |
| nnoremap <silent> <C-l> :nohlsearch<CR> | |
| " --- Window/buffer navigation with Ctrl + Arrow keys --- | |
| nnoremap <C-Left> <C-w>h | |
| nnoremap <C-Down> <C-w>j | |
| nnoremap <C-Up> <C-w>k | |
| nnoremap <C-Right> <C-w>l | |
| nnoremap <C-S-Left> :vertical resize -2<CR> | |
| nnoremap <C-S-Right> :vertical resize +2<CR> | |
| nnoremap <C-S-Up> :resize +1<CR> | |
| nnoremap <C-S-Down> :resize -1<CR> | |
| nnoremap <silent> <Tab> :bnext<CR> | |
| nnoremap <silent> <S-Tab> :bprevious<CR> | |
| nnoremap <silent> <C-A-Right> :tabn<CR> | |
| nnoremap <silent> <C-A-Left> :tabp<CR> | |
| " Stop messing with yank... | |
| " Normal + Visual deletes go to black hole | |
| for cmd in ['d', 'c', 'x', 's'] | |
| execute 'nnoremap' cmd '"_'.cmd | |
| execute 'xnoremap' cmd '"_'.cmd | |
| execute 'nnoremap <leader>'.cmd cmd | |
| execute 'xnoremap <leader>'.cmd cmd | |
| endfor | |
| nnoremap <silent> <leader>y "+y | |
| nnoremap <silent> <leader>p "+p | |
| xnoremap <silent> <leader>y "+y | |
| xnoremap <silent> <leader>p "+p | |
| xnoremap p "_dp | |
| xnoremap P "_dP |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment