" Plugins --- {{{ if ! filereadable(system('echo -n "${XDG_CONFIG_HOME:-$HOME/.config}/nvim/autoload/plug.vim"')) echo "Downloading junegunn/vim-plug to manage plugins..." silent !mkdir -p ${XDG_CONFIG_HOME:-$HOME/.config}/nvim/autoload/ silent !curl "https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim" > ${XDG_CONFIG_HOME:-$HOME/.config}/nvim/autoload/plug.vim autocmd VimEnter * PlugInstall autocmd VimEnter * CHADdeps endif let g:polyglot_disabled = ['markdown'] call plug#begin(stdpath('data') . '/plugged') Plug 'rafi/awesome-vim-colorschemes' " Provides a number of pretty themes Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } " Fast fuzzy file searching Plug 'junegunn/fzf.vim' Plug 'tpope/vim-fugitive' " Adds git support to vim Plug 'tpope/vim-surround' " Adds motions for dealing with parentheses " Plug 'tpope/vim-commentary' " Easily comment/uncomment lines with `gc` (updated to work with style/script) Plug 'tpope/vim-unimpaired' " A series of bindings for complementary actions [ and ] for adding lines before and after Plug 'tpope/vim-vinegar' " Improvements to the file browser Plug 'jiangmiao/auto-pairs' " Creates closing parentheses when writing the opening, use to wrap the next word/group, to disable Plug 'mattn/emmet-vim' " Emmet support ,em to toggle it Plug 'dylanaraps/wal.vim' " Set the theme to match the system colours Plug 'godlygeek/tabular' " Easy alligning of code based on match, :Tab/| will line up markdown tables Plug 'plasticboy/vim-markdown' " All markdown features (some are disabled by polyglot) Plug 'sheerun/vim-polyglot' " Dynamically loads syntax hilighting from multiple packages Plug 'ms-jpq/chadtree', { 'branch': 'chad', 'do': 'python3 -m chadtree deps' } " A file tree "Plug 'wakatime/vim-wakatime' Plug 'neoclide/coc.nvim', { 'branch': 'release' } " Autocompletion Plug 'github/copilot.vim' " Copilot Plug 'easymotion/vim-easymotion' " Advanced navigation Plug 'antoinemadec/coc-fzf' " Open CocList results in fzf "Plug 'phpactor/phpactor', { 'do': 'composer install', 'for': 'php' } "Plug 'ncm2/ncm2' "Plug 'roxma/nvim-yarp' "autocmd BufEnter * call ncm2#enable_for_buffer() "set completeopt=noinsert,menuone,noselect "Plug 'phpactor/ncm2-phpactor' " " vim-devicons must be last plugin Plug 'ryanoasis/vim-devicons' " Icons for file tree call plug#end() " }}} " Basic settings ---- {{{ set nocompatible "Use the latest vim settings/options syntax enable "Enable syntax highlighting let mapleader = ',' "The default leader is \, but a comma is much better let localleader = '\\' "The leader to be used for filetype specific mappings set number relativenumber "Show relative line numbers set noerrorbells visualbell t_vb= "Remove the bells set tabstop=4 "Set how many columns a tab counts for set shiftwidth=4 "How many columns text is indented when using reindent set softtabstop=4 "Set columns for tabs in insert mode set expandtab "Use spaces instead of tabs set smartindent "Automatically indent code set ignorecase "Ignores case when searching set smartcase "Doesn't ignore case when the search includes upper case characters set backupdir=/tmp// "Store backup files in the /tmp directory set directory=/tmp// "Store swap files in the /tmp directory set undodir=/tmp// "Store undo history in the /tmp directory set undofile "Store the undo history "set spell "Enable spell checking set autowriteall "Save the file when switching buffers set colorcolumn=80,120 set updatetime=300 " Recommended by COC set signcolumn=yes " Also recommended by COC " }}} " Visuals ---- {{{ if isdirectory(system('echo -n "${XDG_CACHE_HOME:-$HOME/.cache}/wal"')) colorscheme guiwal else colorscheme atom-dark endif set t_Co=256 "User 256 colors. This is useful for terminal vim set guifont=Fira_Code:h17 set guioptions-=e "We don't want GUI tabs set termguicolors set guioptions-=l set guioptions-=L set guioptions-=r set guioptions-=R set nowrap "Don't wrap lines around "Set line number Colour to be same as background hi LineNr guibg=bg "Get rid of ugly split borders hi vertsplit guifg=bg guibg=bg " }}} " Navigation --- {{{ set splitbelow set splitright "Increase/Decrease window size nnoremap < nnoremap > nnoremap + nnoremap - "Move around splits nnoremap nnoremap nnoremap nnoremap "Go to next tab nnoremap :tabnext nnoremap :tabprev nnoremap :vertical resize:resize nnoremap = nnoremap :vsplit nnoremap :split nnoremap :q " }}} " Search --- {{{ set hlsearch set incsearch set path+=** " }}} " Mappings --- {{{ " Editing files - {{{ "Make it easy to edit the vimrc file nnoremap ev :tabedit $MYVIMRC "Source the vimrc file nnoremap es :source $MYVIMRC " }}} "Changing unused ctrl bindings "Turn on git blame nnoremap Git blame "List all tags in the current buffer (replaced pageup, use CTRL-u instead) nnoremap CocFzfList outline "List all tags in directory "nnoremap Tags "List all the recently opened files (replaced scroll one line up, use "k") nnoremap History "Search within the current buffer (replaced pagedown, use CTRL-d instead) "nnoremap / "Search within the whole project nnoremap Rg "Move line down (uses vim-unimpaired) (replaced move down, use "j") nnoremap "Move line up (uses vim-unimpaired) (replaced move up, use "k") nnoremap "Does not work because of legacy reasons " nnoremap "Search marks (replaced "j" clone) nnoremap Marks "Search version controlled files (replaced move up, use "k") nnoremap GFiles "Search all files in directory nnoremap Files "Toggle file draw nnoremap CHADopen "Search all snippets (uses ultisnips) nnoremap Snippets "Search git history (replaced scroll one line up, use "k") nnoremap Commits "Search git history within current buffer/selection nnoremap BCommits "Turn on git blame inoremap Git blame "List all tags in the current buffer inoremap BTags "List all tags in directory inoremap Tags "List all the recently opened files (replaced inserting characters from below) inoremap History "Search within the current buffer inoremap / "Search within the whole project inoremap Rg "Move line down (uses vim-unimpaired) (replaced clone) inoremap ddpi "Move line up (uses vim-unimpaired) (replaced start digraph, use command instead) inoremap ddkPi "Does not work because of legacy reasons " inoremap Marks "Add line below (replaced execute single command in normal) inoremap o "Add line above inoremap O "Search version controlled files (replaced autocomplete reverse) inoremap GFiles "Search all files in directory inoremap Files "Toggle file draw (replaces CTRL-v clone) inoremap CHADopen "Search all snippets (uses ultisnips) inoremap Snippets "Search git history (replaced inserting characters from above) inoremap Commits "Search git history within current buffer/selection inoremap BCommits "Add simple highlight removal nnoremap :nohlsearch "Convert tabs to spaces nnoremap :retab "Git mappings nnoremap ga :Git add % nnoremap gb :Git blame nnoremap gC :Git commit nnoremap gp :Git push nnoremap gP :Git pull "Map movement keys to Escape inoremap jj inoremap jk inoremap kk inoremap hh "Delete a line in insert mode " inoremap ddi "Use semicolon instead of colon for commands nnoremap ; : nnoremap : ; "Append the line with a semicolon inoremap ; mzA;`za nnoremap ; mzA;`za "Easily navigate items in the quickfix menu nnoremap ] :cnext nnoremap [ :cprevious "Indent arrays nnoremap { mzF[`a``%i`z nnoremap } mzF[`a``%i`zvi[:s/,\s*/,\r/gvi[=`z:nohlsearch "A command to properly indent json code command! FormatJSON %!python -m json.tool " Allow saving of files as doas command! W execute 'silent! w !doas /usr/bin/tee % >/dev/null' edit! command! X execute 'silent! x !doas /usr/bin/tee % >/dev/null' edit! " }}} " Plugins --- {{{ " COC --- {{{ " Use tab for trigger completion with characters ahead and navigate " NOTE: There's always complete item selected by default, you may want to enable " no select by `"suggest.noselect": true` in your configuration file " NOTE: Use command ':verbose imap ' to make sure tab is not mapped by " other plugin before putting this into your config inoremap \ coc#pum#visible() ? coc#pum#next(1) : \ CheckBackspace() ? "\" : \ coc#refresh() inoremap coc#pum#visible() ? coc#pum#prev(1) : "\" " Make to accept selected completion item or notify coc.nvim to format " u breaks current undo, please make your own choice inoremap coc#pum#visible() ? coc#pum#confirm() \: "\u\\=coc#on_enter()\" function! CheckBackspace() abort let col = col('.') - 1 return !col || getline('.')[col - 1] =~# '\s' endfunction if has('nvim') inoremap coc#refresh() else inoremap coc#refresh() endif " Use `[g` and `]g` to navigate diagnostics " Use `:CocDiagnostics` to get all diagnostics of current buffer in location list nmap [g (coc-diagnostic-prev) nmap ]g (coc-diagnostic-next) " GoTo code navigation nmap gd (coc-definition) nmap gy (coc-type-definition) nmap gi (coc-implementation) nmap gr (coc-references) " Use K to show documentation in preview window nnoremap K :call ShowDocumentation() function! ShowDocumentation() if CocAction('hasProvider', 'hover') call CocActionAsync('doHover') else call feedkeys('K', 'in') endif endfunction " Highlight the symbol and its references when holding the cursor autocmd CursorHold * silent call CocActionAsync('highlight') " Symbol renaming nmap rn (coc-rename) " Formatting selected code xmap f (coc-format-selected) nmap f (coc-format-selected) augroup mygroup autocmd! " Setup formatexpr specified filetype(s) autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected') " Update signature help on jump placeholder autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp') augroup end " Applying code actions to the selected code block " Example: `aap` for current paragraph xmap a (coc-codeaction-selected) nmap a (coc-codeaction-selected) " Remap keys for applying code actions at the cursor position nmap ac (coc-codeaction-cursor) " Remap keys for apply code actions affect whole buffer nmap as (coc-codeaction-source) " Apply the most preferred quickfix action to fix diagnostic on the current line nmap qf (coc-fix-current) " Remap keys for applying refactor code actions nmap re (coc-codeaction-refactor) xmap r (coc-codeaction-refactor-selected) nmap r (coc-codeaction-refactor-selected) " Run the Code Lens action on the current line nmap cl (coc-codelens-action) " Map function and class text objects " NOTE: Requires 'textDocument.documentSymbol' support from the language server xmap if (coc-funcobj-i) omap if (coc-funcobj-i) xmap af (coc-funcobj-a) omap af (coc-funcobj-a) xmap ic (coc-classobj-i) omap ic (coc-classobj-i) xmap ac (coc-classobj-a) omap ac (coc-classobj-a) " Remap and to scroll float windows/popups " if has('nvim-0.4.0') || has('patch-8.2.0750') " nnoremap coc#float#has_scroll() ? coc#float#scroll(1) : "\" " nnoremap coc#float#has_scroll() ? coc#float#scroll(0) : "\" " inoremap coc#float#has_scroll() ? "\=coc#float#scroll(1)\" : "\" " inoremap coc#float#has_scroll() ? "\=coc#float#scroll(0)\" : "\" " vnoremap coc#float#has_scroll() ? coc#float#scroll(1) : "\" " vnoremap coc#float#has_scroll() ? coc#float#scroll(0) : "\" " endif " Use CTRL-S for selections ranges " Requires 'textDocument/selectionRange' support of language server nmap (coc-range-select) xmap (coc-range-select) " Add `:Format` command to format current buffer command! -nargs=0 Format :call CocActionAsync('format') " Add `:Fold` command to fold current buffer command! -nargs=? Fold :call CocAction('fold', ) " Add `:OR` command for organize imports of the current buffer command! -nargs=0 OR :call CocActionAsync('runCommand', 'editor.action.organizeImport') " Add (Neo)Vim's native statusline support " NOTE: Please see `:h coc-status` for integrations with external plugins that " provide custom statusline: lightline.vim, vim-airline set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')} " Mappings for CoCList " Show all diagnostics nnoremap a :CocList diagnostics " Manage extensions nnoremap e :CocList extensions " Show commands nnoremap c :CocList commands " Find symbol of current document nnoremap o :CocList outline " Search workspace symbols nnoremap s :CocList -I symbols " Do default action for next item nnoremap j :CocNext " Do default action for previous item nnoremap k :CocPrev " Resume latest coc list nnoremap p :CocListResume " }}} " Emmet --- {{{ " Toggle emmet completion using with em let g:emmet_completion = 0 function ToggleEmmet() if g:emmet_completion echo "Emmet completion off!" let g:user_emmet_expandabbr_key=',' iunmap let g:emmet_completion = 0 else echo "Emmet completion on!" let g:user_emmet_expandabbr_key='' imap emmet#expandAbbrIntelligent("\") let g:emmet_completion = 1 endif endfunction nnoremap em :call ToggleEmmet() " }}} " Markdown --- {{{ " Conceal markdown text set conceallevel=3 " }}} " AutoPairs --- {{{ let g:AutoPairsFlyMode = 0 let g:AutoPairsShortcutBackInsert = '' " Use to insert the closing parentheses if it jumped ahead by mistake " }}} " CHADTree --- {{{ let g:chadtree_settings = { \ 'theme': { \ 'icon_glyph_set': 'devicons', \ 'text_colour_set': 'env', \ 'icon_colour_set': 'github', \ "discrete_colour_map": { \ "black": "#21222c", \ "red": "#ff5555", \ "green": "#50fa7b", \ "yellow": "#f1fa8c", \ "blue": "#bd93f9", \ "magenta": "#ff79c6", \ "cyan": "#8be9fd", \ "white": "#f8f8f2", \ "bright_black": "#6272a4", \ "bright_red": "#ff6e6e", \ "bright_green": "#69ff94", \ "bright_yellow": "#ffffa5", \ "bright_blue": "#d6acff", \ "bright_magenta": "#ff92df", \ "bright_cyan": "#a4ffff", \ "bright_white": "#ffffff" \ } \ } \ } " }}} " Commentary --- {{{ " function s:set_commentary_format() " echo "running command" " if &filetype =~ 'vue\|html\|svelte' " if searchpair('<\(script\|style\)', '', '', 'Wn') " let b:commentary_format="// %s" " else " let b:commentary_format=&commentstring " endif " endif " endfunction " xnoremap gc :call set_commentary_format()Commentary " nnoremap gc :call set_commentary_format()Commentary " onoremap gc :call set_commentary_format()Commentary " nnoremap gcc :call set_commentary_format()Commentary " nnoremap cgc :call set_commentary_format()Commentary " nnoremap cgu :call set_commentary_format()CommentaryCommentary " }}} " Easymotion --- {{{ let g:EasyMotion_do_mapping = 0 " Disable default mappings map (easymotion-prefix) " Jump to anywhere you want with minimal keystrokes, with just one key binding. " `s{char}{label} nmap s (easymotion-overwin-f) " Turn on case-insensitive feature let g:EasyMotion_smartcase = 1 " JK motions: Line motions map j (easymotion-j) map k (easymotion-k) " }}} " }}} " PHP --- {{{ " function! RunPHPUnitTest() " cd %:p:h " normal! T yw " let result = system("phpunit --filter " . @" . " " . bufname("%")) " split __PHPUnit_Result__ " normal! ggdG " setlocal buftype=nofile " call append(0, split(result, '\v\n')) " cd - " endfunction " nnoremap :call RunPHPUnitTest() " }}} " Moving around --- {{{ "Use capital H and L to move to the start and end of lines nnoremap H ^ nnoremap L $ " }}} " Operator mappings --- {{{ onoremap in( :normal! f(vi( onoremap il( :normal! F)vi( onoremap an( :normal! f(va( onoremap al( :normal! F)va( onoremap an{ :normal! f{vi{ onoremap al{ :normal! F}vi " }}} " Abbreviations --- {{{ iabbrev adn and iabbrev waht what iabbrev tehn then iabbrev tihs this iabbrev teh the iabbrev Teh The " }}} " Auto-Commands --- {{{ "Automatically source the config files on save. augroup autosourcing autocmd! autocmd BufWritePost $MYVIMRC source % "Source the vimrc file augroup END "Fold vimrc and zshrc files on open augroup autofolding autocmd! autocmd BufReadPost $MYVIMRC :setlocal foldlevelstart=0 autocmd FileType vim setlocal foldmethod=marker autocmd BufReadPost zsh :setlocal foldlevelstart=0 autocmd FileType zsh setlocal foldmethod=marker augroup END "Set commentary formats function s:setcommentary() if &commentstring =~ '/\*\s*%s\s*\*/' let b:commentary_format="// %s" endif endfunction augroup autocomment autocmd! autocmd FileType * call setcommentary() augroup END "Automatically save files augroup autosaving autocmd! autocmd FocusLost * silent! wa "Save all files when moving away from the window autocmd InsertLeave * silent! wa "Save all files when leaving insert mode autocmd TextChanged * silent! wa "Save all files when text is changed augroup END augroup modes autocmd! autocmd FocusLost * call feedkeys("\") "Go to normal mode when moving away autocmd BufNewFile * call feedkeys("i") "Go to insert mode when starting a new file augroup END "Recompile suckless software when updating config augroup suckless autocmd BufWritePost ~/.local/src/dwmblocks/config.h !cd ~/.local/src/dwmblocks/; doas make install && { killall -q dwmblocks;setsid -f dwmblocks } autocmd BufWritePost ~/.local/src/dwm/config.h !cd ~/.local/src/dwm/; doas make clean install autocmd BufWritePost ~/.local/src/st/config.h !cd ~/.local/src/st/; doas make clean install " }}} " Notes and tips " - press 'zz' to instantly center the line where the cursor is located. " - You can increment numbers with . " - To operate on multiple lines use to select the lines, to go to " insert mode, perform edit, press . " - Use the command :r to paste the output of a command to the buffer.