"------------Setup-------------" mapclear " Clear all mappings. packadd! matchit " Add match tag pairs package. let skip_defaults_vim=1 " Do not load defaults if vimrc is missing. "------------General------------" let mapleader = "\" " Set default map leader. let php_htmlInStrings = 1 " Highlight HTML in PHP. set ruler " Show the cursor position all the time. set nowrap " Do not wrap lines. set nonumber " Set line numbers. set hlsearch " Enable search. set incsearch " Set incremental search. set showmatch " Briefly show matching tags. set nocompatible " Use Vim defaults. set splitbelow " Open horizontal splits below. set splitright " Open vertical splits to the right. set cursorline " Set cursor line highlight. set notimeout " Wait indefinitely for complete key combinations. set ttimeout " Prevent pressing twice. set nostartofline " Do not move cursor to line start on buffer switch. set showcmd " Show key presses in status line. set wildmenu " Show tab completions menu. set nojoinspaces " Insert one space after a '.', '?' and '!' with a join command. set path+=** " Search subfolders. set display=lastline " @@@ which indicates remaining line is not displayed. set hidden " Set hidden buffers. set nobackup " No write backups. set noswapfile " Disable swap files. set nowritebackup " No overwrite backups. set autoread " Auto read file on external change. set autowrite " Write if modified. set autowriteall " Write if modified on buffer change. set autoindent " Copy indent from current line to new line. set ignorecase " Ignore case on search. set smartcase " Search by case smartly. set nolazyredraw " Disable lazy redraw on screen when using macros. set ttyfast " Assume fast terminal. set undofile " Enable undofile. set viminfo+=n~/.vim/viminfo " Set viminfo file path. set undodir=~/.vim/undodir " Set undofile directory. set mouse=a " Enable mouse. set shortmess+=I " Disable startup message. set shortmess-=S " Count number of search result matches. set showtabline=0 " Disable tab bar. set updatetime=1500 " Set duration for cursor hold event. set synmaxcol=500 " Maximum column in which to search for syntax items. set fillchars= " Set split window margin fill to none. set laststatus=0 " Disable status bar. set linespace=3 " Set line spaces. set guiheadroom=0 " Disable headroom on window maximize. set history=50 " Keep 50 lines of command line history. set clipboard=unnamed " Use clipboard as default register. set backspace=indent,eol,start " Enable backspacing. set formatoptions-=t " Do not auto wrap text when typing. set complete=.,w,b,u " Set our desired autocompletion match pattern. set encoding=utf-8 " Set UTF-8 encoding. set scrolloff=3 " Set vertical scroll headroom. set sidescroll=3 " Set horizontal column scroll. set sidescrolloff=10 " Set horizontal scroll headroom. set foldcolumn=2 " Set fold column width to 2. set title titlestring=vim:\ %F titlelen=999999 " Set parseable title. set tabstop=2 softtabstop=0 shiftwidth=2 smarttab expandtab " Set spaces as default. set listchars=eol:¬,tab:>·,trail:~,extends:>,precedes:<,space:␣ " Set hidden character identifiers. "----------------Visuals----------------" syntax enable " Enable syntax highlighting. colorscheme fluid " Set color scheme. "---------------Functions---------------" " Ansible Check function! AnsibleCheck() :exe 'Notify(''ansible-playbook --syntax-check ' . expand('%') . ' 2>&1'')' | :e endfunction " Typography Format function! TypographyFormat() :silent! %s/\(^\|\s\|\w\)\zs--\ze\($\|\s\|\w\)/–/g | silent! %s/\(^\|\s\|\w\)\zs---\ze\($\|\s\|\w\)/—/g :silent! %s/ '/ ‘/g | silent! %s/' /’ /g | :silent! %s/^'/‘/g | silent! %s/'$/’/g :silent! %s/ "/ “/g | silent! %s/" /” /g | :silent! %s/^"/“/g | silent! %s/"$/”/g :silent! %s/\S\@='\S@!/’/g | :silent! %s/\S\@<='\S\@=/’/g :silent! %s/\S\@="\S@!/”/g | :silent! %s/\S\@<="\S\@=/”/g endfunction "---------------Shortcuts---------------" " Edit shortcuts nmap ev :tabedit ~/.vim/vimrc nmap eh :tabedit ~/.vim/post-save-hook " Show key mappings nmap mn :nmap nmap mv :vmap nmap mi :imap nmap mc :command " Search documentation under cursor nmap ds :exe ':term ++hidden ++close recoll -q ' . '' . expand('') . '' nmap dt :exe ':term dict -h localhost -d dict-moby-thesaurus-latest ' . expand('') " Search for file containing word under cursor nmap ag :Ag " View function documentation nmap dp :call fzf#run({'options': ['--preview', 'echo doc {} \| psysh \| fold --spaces --width 80'], 'source': "psysh-doc", 'sink': ':term psysh-doc', 'down': '50%'}) " Jump to line nmap jl :norm yaW \| :Jump " Load and save sessions nmap sl :source ~/.vim/sessions/session.vim \| :source ~/.vim/vimrc:Notify('printf "Last saved session loaded."') nmap ss :silent! exe "!~/.vim/hooks/pre-session-save" \| :mksession! ~/.vim/sessions/session.vim \| :redraw!:Notify('printf "Current session saved."') " Toggle Spell Check nmap sp :set spell! " Sort lines by length vnoremap sn !perl -e 'print sort { length($a) <=> length($b) } <>' " Switch between tabs and spaces nmap ses :set tabstop=2 softtabstop=0 shiftwidth=2 smarttab expandtab nmap set :set tabstop=2 softtabstop=0 shiftwidth=2 smarttab noexpandtab " Close buffer and window nmap qq :bd nmap qa :silent! %bd!\|e#\|bd# nmap qw c " Re-indent entire file nmap re gg=G " Reset all settings and source configuration. nmap ra :set all& \| :source ~/.vim/vimrc \| :packloadall \|:e:Notify('printf "Settings cleared and reloaded."') " Remove trailing whitespace nmap rs :%s/\s\+$//e " Dump output of command to new buffer nmap rr :enew \| .! " Remove duplicate lines vnoremap rd !awk '\!visited[$0]++' " Toggle color column nmap cv :exe "set colorcolumn=" . (&colorcolumn == "" ? "80" : "") " Toggle cursor column nmap cx :set cursorcolumn! " Transliterate special characters to ascii nmap ce :silent! %s/–/--/g \| :silent! %s/—/---/g \| my \| :%!iconv -f utf-8 -t ascii//translit'y " Use typographic characters nmap cl :call TypographyFormat() " Toggle line numbers nmap cn :set number! nmap cr :set relativenumber! " Move line up or down nmap ck ddkkpk nmap cj ddpk " Justify columns vnoremap ct !column -t -o' ' " Fold text vnoremap cf \| !fold --spaces --width80 " Go to scratchpad of specified filetype noremap cs :w !cat > $HOME/.cache/vim-scratchpad:e +setf\ $HOME/.cache/vim-scratchpad " File open mappings nmap :Buffers nmap ov :Lines nmap ob :BLines nmap ol :Locate nmap ot :exe '!$TERMINAL -cd ' . expand('%:p:h') . ' > /dev/null 2>&1 &' nmap of :call fzf#run({'options': [], 'source': "cat $FZF_FILE_MARKS", 'sink': 'e', 'window': { 'xoffset': 0, 'yoffset': 1, 'width': 1, 'height': 0.5 }}) nmap od :call fzf#run({'options': ['--preview', 'ls {}'], 'source': "cut -d' ' -f3 $FZF_DIRECTORY_MARKS", 'sink': 'cd', 'window': { 'xoffset': 0, 'yoffset': 1, 'width': 1, 'height': 0.5 }}) nmap oo :call fzf#run({'options': ['--preview', 'highlight -O ansi --force {}'], 'source': 'rg --files --hidden \|\| find . -type f -printf "%P\n"', 'sink': 'e', 'window': { 'xoffset': 0, 'yoffset': 1, 'width': 1, 'height': 0.5 }}) nmap oa :call fzf#run({'options': ['--preview', 'ls {}'], 'source': "find $HOME -type d -maxdepth 6", 'sink': 'cd', 'window': { 'xoffset': 0, 'yoffset': 1, 'width': 1, 'height': 0.5 }}) " Mappings for nnn nmap nm :NnnPicker nmap nn :NnnPicker '%:p:h' " Exit incremental search nmap :nohl " Disable Ex Mode nnoremap Q " Split window mappings nmap :vsplit nmap :split nmap :resize +5 nmap :resize -5 nmap :vertical resize +5 nmap :vertical resize -5 " Inverse Tabs inoremap " Retain visual selection when tabbing vnoremap < >gv " Prevent cursor from jumping in visual select context https://ddrscott.github.io/blog/2016/yank-without-jank/ vnoremap y "my\"" . v:register . "y`y" "------------------Snippets-------------------" nnoremap ,awk :-1read $HOME/.vim/snippets/skeleton.awk nnoremap ,nix-shell :-1read $HOME/.vim/snippets/shell.nix2jf"a nnoremap ,nix-module :-1read $HOME/.vim/snippets/module.nix4jf"a nnoremap ,nix-package :-1read $HOME/.vim/snippets/package.nix3jf"a nnoremap ,html :-1read $HOME/.vim/snippets/skeleton.html3jwf>a "---------------Plugin Settings---------------" let g:gundo_prefer_python3=1 " Use python3 to restore gundo functionality. let g:netrw_banner=0 " Disable netrw banner. let g:nnn#command = 'nnn -H' " Override default command. let g:nnn#set_default_mappings = 0 " Disable default mappings. let g:nnn#layout = 'new' " Opens the nnn window in a split. let g:nnn#layout = { 'left': '~20%' } " Left 20% of the window. let g:fzf_layout = { 'window': { 'xoffset': 0, 'yoffset': 1, 'width': 1, 'height': 0.5 } } " Set fzf window layout, "-------------------Scripts-------------------" " https://vi.stackexchange.com/questions/14300/vim-how-to-send-entire-line-to-a-buffer-of-type-terminal function s:repl(start, end, language) let g:terminal_buffer = get(g:, 'terminal_buffer', -1) if g:terminal_buffer == -1 || !bufexists(g:terminal_buffer) terminal ++rows=10 let g:terminal_buffer = bufnr('') call term_sendkeys(g:terminal_buffer, a:language . "; exit" . "\") wincmd p elseif bufwinnr(g:terminal_buffer) == -1 exe 'sbuffer ' . g:terminal_buffer wincmd p endif call term_sendkeys(g:terminal_buffer, join(getline(a:start, a:end), "\") . " " . "\") endfunction " Jump to line and column in the format 123:13 function s:cursor(selection) wincmd p let g:cursor_request = split(a:selection, ":") call cursor(g:cursor_request[0], g:cursor_request[1]) endfunction " Notify function s:notify(command) call popup_notification(systemlist(a:command), { 'pos': 'topright', 'col': 9999, 'time' : 600000, 'highlight': 'Normal' }) endfunction "-------------------Commands-------------------" command! -nargs=? -range Jump call s:cursor(@*) command! -nargs=? -range REPL call s:repl(, , ) command! -nargs=1 -range Notify call s:notify() command! Term term ++noclose "----------------Autorun----------------" augroup AutoCommands " Clear auto commands. autocmd! " Source reloads. autocmd BufWritePost .vimrc,vimrc source % | Notify('printf "Configuration sourced."') " Linting file type post write commands. autocmd FileType markdown autocmd! BufWritePost :only | :term ++rows=10 sh -c "cat % | vale --ext .md" autocmd FileType raku autocmd! BufWritePost exe 'Notify(''raku -c ' . expand('%') . ' 2>&1'')' | :e autocmd FileType scheme autocmd! BufWritePost exe 'Notify(''guile -s ' . expand('%') . ' 2>&1'')' | :e autocmd FileType css autocmd! BufWritePost exe 'Notify(''prettier --write --parser css ' . expand('%') . ' 2>&1'')' | :e autocmd FileType html autocmd! BufWritePost exe 'Notify(''prettier --write --parser html ' . expand('%') . ' 2>&1'')' | :e autocmd FileType python autocmd! BufWritePost exe 'Notify(''ruff --no-cache ' . expand('%') . ' 2>&1 && black ' . expand('%') . ' 2>&1'')' | :e autocmd FileType nim autocmd! BufWritePost exe 'Notify(''nimpretty ' . expand('%') . ' 2>&1 && printf "Nim OK: ' . expand('%') . '"'')' | :e autocmd FileType rust autocmd! BufWritePost exe 'Notify(''rustfmt ' . expand('%') . ' 2>&1 && printf "rustfmt OK: ' . expand('%') . '"'')' | :e autocmd FileType json autocmd! BufWritePost exe 'Notify(''jsonlint -i ' . expand('%') . ' 2>&1 && printf "JSON OK: ' . expand('%') . '"'')' | :e autocmd FileType ruby autocmd! BufWritePost exe 'Notify(''rubocop --fix-layout ' . expand('%') . ' 2>&1 && rubocop ' . expand('%') . ' 2>&1'')' | :e autocmd FileType javascript autocmd! BufWritePost exe 'Notify(''eslint --fix ' . expand('%') . ' 2>&1 && printf "JavaScript OK: '. expand('%') . '"'')' | :e autocmd FileType elixir autocmd! BufWritePost exe 'Notify(''mix format ' . expand('%') . ' 2>&1 && printf "Elixir Format OK: ' . expand('%') . '"'')' | :e autocmd FileType haskell autocmd! BufWritePost exe 'Notify(''hlint ' . expand('%') . ' 2>&1 && brittany --write-mode inplace ' . expand('%') . ' 2>&1'')' | :e autocmd FileType bash,sh autocmd! BufWritePost exe 'Notify(''shellcheck -x --exclude=SC1090,SC1091 ' . expand('%') . ' 2>&1 && printf "Shellcheck OK: ' . expand('%') . '"'')' autocmd FileType xml,xslt,rng,xsd autocmd! BufWritePost exe 'Notify(''xmllint --pretty 1 ' . expand('%') . ' --output ' . expand('%') . ' 2>&1 && printf "XML OK: ' . expand('%') . '"'')' | :e autocmd FileType go autocmd! BufWritePost exe 'Notify(''gofmt -w -s -e ' . expand('%') . ' 2>&1 && go vet ' . expand('%') . ' 2>&1 && printf "Go Format OK: ' . expand('%') . '"'')' | :e autocmd FileType nix autocmd! BufWritePost exe 'Notify(''nix-linter ' . expand('%') . ' 2>&1 && printf "Nix Lint OK: ' . expand('%') . '"' . ' && nixfmt ' . expand('%') . ' 2>&1' . ''')' | :e autocmd FileType php autocmd! BufWritePost exe 'Notify(''phpcbf ' . expand('%') . ' 2>&1 && phpstan --no-progress --no-ansi --no-interaction analyze --level max ' . expand('%') . ' 2>&1'')' | :e autocmd FileType tex autocmd! BufWritePost exe 'Notify(''latexindent ' . expand('%') . ' 2>&1 && printf "LaTeX OK: ' . expand('%') . '"'')' | :e | :only | :term ++close ++rows=10 latex-compile % autocmd FileType bindzone autocmd! BufWritePost exe 'Notify(''file="' . expand('%') . '" && named-checkzone "$(head --lines=1 "$file" | cut --delimiter=" " --fields=2 | perl -ple "chop")" $file'')' | :e autocmd FileType awk autocmd! BufWritePost exe 'Notify(''awk -g -f ' . expand('%') . ' 2>&1 && awk -o- -f ' . expand('%') . ' | sponge ' . expand('%') . ' && printf "AWK OK: ' . expand('%') . '"'')' | :e autocmd FileType yaml autocmd! BufWritePost exe 'Notify(''yaml round-trip --indent 2 --save ' . expand('%') . ' 2>&1 && yamllint -s ' . expand('%') . ' 2>&1 && printf "YAML OK: ' . expand('%') . '"'')' | :e autocmd FileType typescript autocmd! BufWritePost exe 'Notify(''deno fmt ' . expand('%') . ' 2>&1 && NO_COLOR=true deno lint ' . expand('%') . ' 2>&1'')' | :e | :only | :term ++rows=10 deno run --allow-all --location https://example.com/ % autocmd FileType c autocmd! BufWritePost exe 'Notify(''clang-format -i ' . expand('%') . ' 2>&1 && printf "Clang Format OK: ' . expand('%') . '\n"' . ' && gcc -Wall -Wpedantic -Werror -fsyntax-only ' . expand('%') . ' 2>&1'')' | :e autocmd FileType sql autocmd! BufWritePost exe 'Notify(''sqlint ' . expand('%') . ' 2>&1 && pg_format --type-case 2 --inplace ' . expand('%') . ' 2>&1 && sqlfluff lint --exclude-rules L003,L016 --dialect postgres ' . expand('%') . ' 2>&1 && printf "SQL OK: ' . expand('%') . '"'')' | :e " Linting extension post write commands. autocmd BufWritePost $HOME/.config/chromexup/config.ini exe 'Notify(''chromexup 2>&1'')' autocmd BufWritePost rc.lua exe 'Notify(''awesome -k 2>&1'')' autocmd BufWritePost quotes,*.fortune exe 'Notify(''strfile ' . expand('%') . ''')' autocmd BufWritePost *.doas exe 'Notify(''doas -C ' . expand('%') . ' 2>&1 && printf "doas OK: ' . expand('%') . '"'')' autocmd BufWritePost Xresources exe 'Notify(''xrdb ~/.config/X11/Xresources ' . '2>&1 && printf "Reloading Xresources: ' . expand('%') . '"'')' autocmd BufWritePost Makefile exe 'Notify(''make --dry-run --warn-undefined-variables ' . '2>&1 && printf "\nMake OK: ' . expand('%') . '"'')' autocmd BufWritePost *.nft exe 'Notify(''doas nft --check --file ' . expand('%') . ' 2>&1 && printf "nftables OK: ' . expand('%') . '"'')' autocmd BufWritePost *.desktop exe 'Notify(''desktop-file-validate ' . expand('%') . ' 2>&1 && printf "Desktop File OK: ' . expand('%') . '"'')' autocmd BufWritePost *.service exe 'Notify(''systemd-analyze verify --user ' . expand('%') . ' 2>&1 && printf "Systemd Service File OK: ' . expand('%') . '"'')' " File type function under cursor lookups. autocmd FileType go noremap df :exe ':term ++rows=10 go doc ' . expand('') autocmd FileType elixir noremap df :exe ':term ++rows=10 sh -c "echo ''h(' . expand('') . ')'' \| iex"' " REPL commands. autocmd FileType bash noremap cc :REPL bash -x autocmd FileType elixir noremap cc :REPL iex autocmd FileType go noremap cc :REPL gore autocmd FileType javascript noremap cc :REPL node autocmd FileType lua noremap cc :REPL lua autocmd FileType nix noremap cc :REPL nix repl autocmd FileType perl noremap cc :REPL perl -de0 autocmd FileType php noremap cc :REPL psysh autocmd FileType python noremap cc :REPL python autocmd FileType rust noremap cc :REPL evcxr autocmd FileType scheme noremap cc :REPL guile autocmd FileType sh noremap cc :REPL dash -x autocmd FileType typescript noremap cc :REPL deno autocmd FileType awk noremap cc :term ++rows=10 ++close awk -f % " Format using visual select + gq. autocmd FileType nix set formatprg=nixfmt autocmd FileType sh set formatprg=shfmt\ - autocmd FileType lua set formatprg=lua-format autocmd FileType perl set formatprg=perltidy\ - autocmd FileType typescriptreact set formatprg=deno\ fmt\ - autocmd FileType typescript set formatprg=deno\ fmt\ - autocmd FileType elixir set formatprg=mix\ format\ - autocmd FileType c set formatprg=clang-format\ - autocmd FileType python set formatprg=black\ --quiet\ - autocmd FileType scheme set formatprg=emacs-batch-indent\ scheme autocmd FileType css set formatprg=prettier\ --parser\ css\ --stdin-filepath\ % autocmd FileType html set formatprg=prettier\ --parser\ html\ --stdin-filepath\ % autocmd FileType markdown set formatprg=prettier\ --parser\ markdown\ --stdin-filepath\ % autocmd FileType javascript set formatprg=swc\ compile\ --filename\ %\ \|\ tail\ --lines\ +2 autocmd FileType ruby set formatprg=rubocop\ --autocorrect\ --stderr\ --stdin\ %\ 2>\ \/dev\/null " Format by extension using visual select + gq autocmd BufRead,BufNewFile *.mathml.xml set formatprg=latexmlmath\ - " Set file types by extension autocmd BufRead,BufNewFile *.nims set filetype=nim autocmd BufRead,BufNewFile *.rasi set filetype=css autocmd BufRead,BufNewFile *.doas set filetype=conf autocmd BufRead,BufNewFile *.nft set filetype=nftables autocmd BufRead,BufNewFile *.blade.php set filetype=php " Clear notification on cursor movement. autocmd CursorMoved * silent! call popup_clear() " Automatically remove trailing white space on save. autocmd BufWritePre * %s/\s\+$//e " Automatically save file on insert and idle. autocmd InsertLeave,CursorHold * silent! write \| silent! exe "!~/.vim/hooks/post-save > /dev/null 2>&1 &" \| :echo expand('%:t') '[filetype=' . &filetype . ']' augroup END