-- Set as the leader key -- See `:help mapleader` -- NOTE: Must happen before plugins are loaded (otherwise wrong leader will be used) vim.g.mapleader = ',' vim.g.maplocalleader = ',' -- Set to true if you have a Nerd Font installed and selected in the terminal vim.g.have_nerd_font = true require 'opt' require 'keymap' require 'autocmd' require 'lazy_init' -- nnoremap ev :tabedit $MYVIMRC -- The line beneath this is called `modeline`. See `:help modeline` -- vim: ts=2 sts=2 sw=2 et -- " Mappings --- {{{ -- " Editing files - {{{ -- "Make it easy to edit the vimrc file -- " }}} -- -- "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.