Files
nvim/init.vim
2023-10-12 22:09:23 +01:00

594 lines
20 KiB
VimL

" 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 [<space> and ]<space> 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 <m-e> to wrap the next word/group, <m-p> 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 <M-q> <C-W><
nnoremap <M-w> <C-W>>
nnoremap <M-S-q> <C-W>+
nnoremap <M-S-w> <C-W>-
"Move around splits
nnoremap <M-h> <C-W><C-H>
nnoremap <M-l> <C-W><C-L>
nnoremap <M-j> <C-W><C-J>
nnoremap <M-k> <C-W><C-K>
"Go to next tab
nnoremap <M-S-l> :tabnext<CR>
nnoremap <M-S-h> :tabprev<CR>
nnoremap <M-f> :vertical resize<CR>:resize<CR>
nnoremap <M-g> <C-W>=
nnoremap <M-s> :vsplit<CR>
nnoremap <M-v> :split<CR>
nnoremap <M-w> :q<CR>
" }}}
" Search --- {{{
set hlsearch
set incsearch
set path+=**
" }}}
" Mappings --- {{{
" Editing files - {{{
"Make it easy to edit the vimrc file
nnoremap <Leader>ev :tabedit $MYVIMRC<CR>
"Source the vimrc file
nnoremap <Leader>es :source $MYVIMRC<CR>
" }}}
"Changing unused ctrl bindings
"Turn on git blame
nnoremap <C-S-A> <CMD>Git blame<CR>
"List all tags in the current buffer (replaced pageup, use CTRL-u instead)
nnoremap <C-Q> <CMD>CocFzfList outline<CR>
"List all tags in directory
"nnoremap <C-S-B> <CMD>Tags<CR>
"List all the recently opened files (replaced scroll one line up, use "k")
nnoremap <C-E> <CMD>History<CR>
"Search within the current buffer (replaced pagedown, use CTRL-d instead)
"nnoremap <C-F> /
"Search within the whole project
nnoremap <C-F> <CMD>Rg<CR>
"Move line down (uses vim-unimpaired) (replaced move down, use "j")
nnoremap <C-J> <C-E>
"Move line up (uses vim-unimpaired) (replaced move up, use "k")
nnoremap <C-K> <C-Y>
"Does not work because of legacy reasons
" nnoremap <C-M>
"Search marks (replaced "j" clone)
nnoremap <C-N> <CMD>Marks<CR>
"Search version controlled files (replaced move up, use "k")
nnoremap <C-P> <CMD>GFiles<CR>
"Search all files in directory
nnoremap <C-S-P> <CMD>Files<CR>
"Toggle file draw
nnoremap <C-S-Q> <CMD>CHADopen<CR>
"Search all snippets (uses ultisnips)
nnoremap <C-S> <CMD>Snippets<CR>
"Search git history (replaced scroll one line up, use "k")
nnoremap <C-Y> <CMD>Commits<CR>
"Search git history within current buffer/selection
nnoremap <C-S-Y> <CMD>BCommits<CR>
"Turn on git blame
inoremap <C-S-A> <CMD>Git blame<CR>
"List all tags in the current buffer
inoremap <C-Q> <CMD>BTags<CR>
"List all tags in directory
inoremap <C-S-Q> <CMD>Tags<CR>
"List all the recently opened files (replaced inserting characters from below)
inoremap <C-E> <CMD>History<CR>
"Search within the current buffer
inoremap <C-F> <Esc>/
"Search within the whole project
inoremap <C-S-F> <CMD>Rg<CR>
"Move line down (uses vim-unimpaired) (replaced <CR> clone)
inoremap <C-J> <Esc>ddpi
"Move line up (uses vim-unimpaired) (replaced start digraph, use command instead)
inoremap <C-K> <Esc>ddkPi
"Does not work because of legacy reasons
" inoremap <C-M> <CMD>Marks<CR>
"Add line below (replaced execute single command in normal)
inoremap <C-O> <Esc>o
"Add line above
inoremap <C-S-O> <Esc>O
"Search version controlled files (replaced autocomplete reverse)
inoremap <C-P> <CMD>GFiles<CR>
"Search all files in directory
inoremap <C-S-P> <CMD>Files<CR>
"Toggle file draw (replaces CTRL-v clone)
inoremap <C-S-Q> <CMD>CHADopen<CR>
"Search all snippets (uses ultisnips)
inoremap <C-S> <CMD>Snippets<CR>
"Search git history (replaced inserting characters from above)
inoremap <C-Y> <CMD>Commits<CR>
"Search git history within current buffer/selection
inoremap <C-S-Y> <CMD>BCommits<CR>
"Add simple highlight removal
nnoremap <Leader><Space> :nohlsearch<CR>
"Convert tabs to spaces
nnoremap <Leader><Tab> :retab<CR>
"Git mappings
nnoremap ga :Git add %<CR>
nnoremap gb :Git blame<CR>
nnoremap gC :Git commit<CR>
nnoremap gp :Git push<CR>
nnoremap gP :Git pull<CR>
"Map movement keys to Escape
inoremap jj <Esc>
inoremap jk <Esc>
inoremap kk <Esc>
inoremap hh <Esc>
"Delete a line in insert mode
" inoremap <C-D> <Esc>ddi
"Use semicolon instead of colon for commands
nnoremap ; :
nnoremap : ;
"Append the line with a semicolon
inoremap <Leader>; <Esc>mzA;<Esc>`za
nnoremap <Leader>; mzA;<Esc>`za<Esc>
"Easily navigate items in the quickfix menu
nnoremap <Leader>] :cnext<CR>
nnoremap <Leader>[ :cprevious<CR>
"Indent arrays
nnoremap <Leader>{ mzF[`a<CR><Esc>``%i<CR><Esc>`z
nnoremap <Leader>} mzF[`a<CR><Esc>``%i<CR><Esc>`zvi[:s/,\s*/,\r/g<CR>vi[=<Esc>`z:nohlsearch<CR>
"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' <BAR> edit!
command! X execute 'silent! x !doas /usr/bin/tee % >/dev/null' <BAR> 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 <tab>' to make sure tab is not mapped by
" other plugin before putting this into your config
inoremap <silent><expr> <TAB>
\ coc#pum#visible() ? coc#pum#next(1) :
\ CheckBackspace() ? "\<Tab>" :
\ coc#refresh()
inoremap <expr><S-TAB> coc#pum#visible() ? coc#pum#prev(1) : "\<C-h>"
" Make <CR> to accept selected completion item or notify coc.nvim to format
" <C-g>u breaks current undo, please make your own choice
inoremap <silent><expr> <CR> coc#pum#visible() ? coc#pum#confirm()
\: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"
function! CheckBackspace() abort
let col = col('.') - 1
return !col || getline('.')[col - 1] =~# '\s'
endfunction
if has('nvim')
inoremap <silent><expr> <c-space> coc#refresh()
else
inoremap <silent><expr> <c-@> coc#refresh()
endif
" Use `[g` and `]g` to navigate diagnostics
" Use `:CocDiagnostics` to get all diagnostics of current buffer in location list
nmap <silent> [g <Plug>(coc-diagnostic-prev)
nmap <silent> ]g <Plug>(coc-diagnostic-next)
" GoTo code navigation
nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)
" Use K to show documentation in preview window
nnoremap <silent> K :call ShowDocumentation()<CR>
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 <leader>rn <Plug>(coc-rename)
" Formatting selected code
xmap <leader>f <Plug>(coc-format-selected)
nmap <leader>f <Plug>(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: `<leader>aap` for current paragraph
xmap <leader>a <Plug>(coc-codeaction-selected)
nmap <leader>a <Plug>(coc-codeaction-selected)
" Remap keys for applying code actions at the cursor position
nmap <leader>ac <Plug>(coc-codeaction-cursor)
" Remap keys for apply code actions affect whole buffer
nmap <leader>as <Plug>(coc-codeaction-source)
" Apply the most preferred quickfix action to fix diagnostic on the current line
nmap <leader>qf <Plug>(coc-fix-current)
" Remap keys for applying refactor code actions
nmap <silent> <leader>re <Plug>(coc-codeaction-refactor)
xmap <silent> <leader>r <Plug>(coc-codeaction-refactor-selected)
nmap <silent> <leader>r <Plug>(coc-codeaction-refactor-selected)
" Run the Code Lens action on the current line
nmap <leader>cl <Plug>(coc-codelens-action)
" Map function and class text objects
" NOTE: Requires 'textDocument.documentSymbol' support from the language server
xmap if <Plug>(coc-funcobj-i)
omap if <Plug>(coc-funcobj-i)
xmap af <Plug>(coc-funcobj-a)
omap af <Plug>(coc-funcobj-a)
xmap ic <Plug>(coc-classobj-i)
omap ic <Plug>(coc-classobj-i)
xmap ac <Plug>(coc-classobj-a)
omap ac <Plug>(coc-classobj-a)
" Remap <C-f> and <C-b> to scroll float windows/popups
" if has('nvim-0.4.0') || has('patch-8.2.0750')
" nnoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>"
" nnoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>"
" inoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(1)\<cr>" : "\<Right>"
" inoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(0)\<cr>" : "\<Left>"
" vnoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>"
" vnoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>"
" endif
" Use CTRL-S for selections ranges
" Requires 'textDocument/selectionRange' support of language server
nmap <silent> <C-s> <Plug>(coc-range-select)
xmap <silent> <C-s> <Plug>(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', <f-args>)
" 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 <silent><nowait> <space>a :<C-u>CocList diagnostics<cr>
" Manage extensions
nnoremap <silent><nowait> <space>e :<C-u>CocList extensions<cr>
" Show commands
nnoremap <silent><nowait> <space>c :<C-u>CocList commands<cr>
" Find symbol of current document
nnoremap <silent><nowait> <space>o :<C-u>CocList outline<cr>
" Search workspace symbols
nnoremap <silent><nowait> <space>s :<C-u>CocList -I symbols<cr>
" Do default action for next item
nnoremap <silent><nowait> <space>j :<C-u>CocNext<CR>
" Do default action for previous item
nnoremap <silent><nowait> <space>k :<C-u>CocPrev<CR>
" Resume latest coc list
nnoremap <silent><nowait> <space>p :<C-u>CocListResume<CR>
" }}}
" Emmet --- {{{
" Toggle emmet completion using <Tab> with <Leader>em
let g:emmet_completion = 0
function ToggleEmmet()
if g:emmet_completion
echo "Emmet completion off!"
let g:user_emmet_expandabbr_key=','
iunmap <Tab>
let g:emmet_completion = 0
else
echo "Emmet completion on!"
let g:user_emmet_expandabbr_key='<Tab>'
imap <Expr> <Tab> emmet#expandAbbrIntelligent("\<Tab>")
let g:emmet_completion = 1
endif
endfunction
nnoremap <Leader>em :call ToggleEmmet()<CR>
" }}}
" Markdown --- {{{
" Conceal markdown text
set conceallevel=3
" }}}
" AutoPairs --- {{{
let g:AutoPairsFlyMode = 0
let g:AutoPairsShortcutBackInsert = '<M-b>' " Use <M-B> 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\)', '', '</\(script\|style\)>', 'Wn')
" let b:commentary_format="// %s"
" else
" let b:commentary_format=&commentstring
" endif
" endif
" endfunction
" xnoremap gc :call <SID>set_commentary_format()<CR><Plug>Commentary
" nnoremap gc :call <SID>set_commentary_format()<CR><Plug>Commentary
" onoremap gc :call <SID>set_commentary_format()<CR><Plug>Commentary
" nnoremap gcc :call <SID>set_commentary_format()<CR><Plug>Commentary
" nnoremap cgc :call <SID>set_commentary_format()<CR><Plug>Commentary
" nnoremap cgu :call <SID>set_commentary_format()<CR><Plug>Commentary<Plug>Commentary
" }}}
" Easymotion --- {{{
let g:EasyMotion_do_mapping = 0 " Disable default mappings
map <Leader> <Plug>(easymotion-prefix)
" Jump to anywhere you want with minimal keystrokes, with just one key binding.
" `s{char}{label}
nmap s <Plug>(easymotion-overwin-f)
" Turn on case-insensitive feature
let g:EasyMotion_smartcase = 1
" JK motions: Line motions
map <Leader>j <Plug>(easymotion-j)
map <Leader>k <Plug>(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 <F12> :call RunPHPUnitTest()<cr>
" }}}
" Moving around --- {{{
"Use capital H and L to move to the start and end of lines
nnoremap H ^
nnoremap L $
" }}}
" Operator mappings --- {{{
onoremap in( :<C-U>normal! f(vi(<CR>
onoremap il( :<C-U>normal! F)vi(<CR>
onoremap an( :<C-U>normal! f(va(<CR>
onoremap al( :<C-U>normal! F)va(<CR>
onoremap an{ :<C-U>normal! f{vi{<CR>
onoremap al{ :<C-U>normal! F}vi<CR>
" }}}
" 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 <SID>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("\<Esc>") "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 <c-a>.
" - To operate on multiple lines use <c-v> to select the lines, <c-i> to go to
" insert mode, perform edit, press <esc>.
" - Use the command :r to paste the output of a command to the buffer.