dots/.vimrc

487 lines
13 KiB
VimL
Raw Normal View History

2022-09-24 01:07:06 +02:00
" General config {{{
2021-03-10 17:48:56 +01:00
"
2021-03-10 18:06:07 +01:00
" Most acronyms are unreadable, but they keep the overview
" I have to do a quick :h lookup for most of these anyway.
2020-02-17 17:05:51 +01:00
2021-03-10 18:06:07 +01:00
se nocp " Disable vi incompatibility
filet plugin indent on " Filetype recognition
2021-03-10 17:48:56 +01:00
se enc=utf8 "
2021-03-10 18:06:07 +01:00
se hid " Allow hiding unsaved buffers
se tf " Fast tty
2021-03-10 17:48:56 +01:00
se ut=300 " 300ms for update time
2021-03-10 18:06:07 +01:00
se to tm=200 ttm=5 " Timeouts
2021-03-10 17:48:56 +01:00
se shm+=c " ...
2021-03-10 18:06:07 +01:00
se ul=500 hi=500 " History and undo
se nu rnu scl=number " Line numbers & signs
2021-03-10 17:48:56 +01:00
se nowrap
2021-03-10 18:06:07 +01:00
se bs=indent,eol,start " Indentation
se ai ts=2 sts=2 sw=2 et " Indentation
se is ic scs hls " Search
se lz " Only essential redraws
se nobk nowb noswf " No backups
se vi='20,\"101 " Max 100 lines in registers
se novb " Bell
2021-08-31 14:14:25 +02:00
se cole=0 cocu="" " Conceal
2021-03-10 18:06:07 +01:00
se cb=unnamedplus " Clipboard
se fcs+=vert:│ " Cleaner split separator (tmux style)
2022-08-18 13:47:32 +02:00
set list
set lcs=trail,tab:→\ ,nbsp:␣ " Whitespace rendering
2021-08-31 14:14:50 +02:00
set ar " Autoread
2020-02-17 17:05:51 +01:00
2020-09-19 22:07:29 +02:00
" Functions ____________________________
2021-03-10 17:48:56 +01:00
" Toggle line numbers
2022-05-11 00:56:13 +02:00
fu! ToggleLineNumbers()
set nu! rnu! " toggle: no numbers - relative nummbers
2021-03-10 17:48:56 +01:00
endfu
2020-04-15 15:10:46 +02:00
2021-08-31 14:15:23 +02:00
" https://alok.github.io/2018/04/26/using-vim-s-conceal-to-make-languages-more-tolerable/
fu! ToggleConceal()
if (&cole == 0) | se cole =2 | else | set cole =0 | endif
endfu
2022-05-11 00:56:13 +02:00
" Insert date
fu! Today()
:put =strftime('%d %b %Y')
endfu
" Add command line functions names
com! -nargs=0 Today :call Today()
com! -nargs=0 ToggleLineNumbers :call ToggleLineNumbers()
2021-08-31 14:15:23 +02:00
com! -nargs=0 ToggleConceal :call ToggleConceal()
2022-05-11 00:56:39 +02:00
" Setup Man command for reading man pages
if exists(":Man") != 2
source $VIMRUNTIME/ftplugin/man.vim
endif
2021-03-10 17:48:56 +01:00
" Keybindings
"""""""""""""
2020-02-17 17:05:51 +01:00
2021-03-10 17:48:56 +01:00
" Leader keys
nn <space> <nop>
2020-05-07 02:11:41 +02:00
let mapleader = " "
2020-05-08 16:11:55 +02:00
let maplocalleader = ";"
2021-03-10 17:48:56 +01:00
" Splits & navigation
2021-03-28 10:37:23 +02:00
nm ss :sp<CR><c-w>w| " Split horizontal
nm sv :vs<CR><c-w>w| " Split vertical
nn sw <c-w>w| " Navigate splits
nn sh <c-w>h| " "
nn sj <c-w>j| " "
nn sk <c-w>k| " "
nn sl <c-w>l| " "
nn sH <c-w>8<| " Resize splits
nn sJ <c-w>8-| " "
nn sK <c-w>8+| " "
nn sL <c-w>8>| " "
nn s= <c-w>=| " Equalize splits
2021-03-10 17:48:56 +01:00
" Open
2021-03-28 10:37:23 +02:00
nn sb :Lex<cr>| " File tree
nn <leader>t :term<cr>| " Open terminal
2023-04-07 22:21:22 +02:00
nn <leader>o :!xdg-open http://localhost:8080/%:t:r.html & <cr>
2021-03-10 17:48:56 +01:00
" Remaps
2021-03-28 10:37:23 +02:00
ino <nowait> jj <esc>| " Normal now
nn <left> <nop>| " Hard mode
nn <down> <nop>| " "
nn <up> <nop>| " "
nn <right> <nop>| " "
ino <left> <nop>| " "
ino <down> <nop>| " "
ino <up> <nop>| " "
ino <right> <nop>| " "
2021-03-10 17:48:56 +01:00
" Search
nn <leader>/ :noh<cr>
nn <leader>f :Ag <cr>
" Line numbers
nn <leader>n :call ToggleRnu()<cr>
" Vim configuration
nn <leader>ec :split $MYVIMRC<cr>
nn <leader>so :so %<cr>
" Plugins
"""""""""
2023-04-07 22:21:22 +02:00
" Plug setup {{{
" Plugin build helpers {{{
function! BuildComposer(info)
if a:info.status != 'unchanged' || a:info.force
if has('nvim')
!cargo build --release --locked
else
!cargo build --release --locked --no-default-features --features json-rpc
endif
endif
endfunction
" }}}
2020-02-17 17:05:51 +01:00
2020-05-07 02:11:41 +02:00
call plug#begin()
2021-03-10 17:48:56 +01:00
" Coc
Plug 'neoclide/coc.nvim', {'branch': 'release'}
2022-12-01 13:51:29 +01:00
Plug 'github/copilot.vim'
2021-03-10 17:48:56 +01:00
" General
2022-12-01 13:54:13 +01:00
Plug 'unblevable/quick-scope'
Plug 'tpope/vim-commentary'
2020-09-19 22:07:29 +02:00
Plug 'machakann/vim-sandwich'
2021-08-31 14:19:18 +02:00
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
2020-05-07 02:11:41 +02:00
Plug 'junegunn/fzf.vim'
2021-03-10 17:48:56 +01:00
" JS and TypeScript
2020-05-07 02:11:41 +02:00
Plug 'pangloss/vim-javascript', { 'for': ['javascript', 'javascript.jsx'] }
Plug 'leafgarland/typescript-vim', { 'for': ['typescript', 'typescript.tsx'] }
Plug 'peitalin/vim-jsx-typescript', { 'for': ['typescript.tsx'] }
Plug 'evanleck/vim-svelte', {'branch': 'main'}
2022-05-11 01:02:08 +02:00
" JSON with comments
Plug 'neoclide/jsonc.vim'
2023-04-07 22:21:22 +02:00
" LaTeX
2021-03-10 17:48:56 +01:00
Plug 'lervag/vimtex'
2022-11-27 23:12:07 +01:00
" Wiki
Plug 'lervag/wiki.vim'
Plug 'hektor/taskwiki'
" Markdown
Plug 'vim-pandoc/vim-pandoc'
2021-08-31 14:22:15 +02:00
Plug 'vim-pandoc/vim-pandoc-syntax'
2023-04-07 22:21:22 +02:00
Plug 'ferrine/md-img-paste.vim'
Plug 'euclio/vim-markdown-composer', { 'do': function('BuildComposer') }
2021-03-10 17:48:56 +01:00
" TidalCycles
Plug 'supercollider/scvim'
Plug 'tidalcycles/vim-tidal'
call plug#end()
2020-11-02 11:50:14 +01:00
2021-03-10 17:48:56 +01:00
" Plugin config
"""""""""""""""
2020-11-02 11:50:14 +01:00
2021-03-10 17:48:56 +01:00
" Coc
2022-12-01 14:01:41 +01:00
" `.../sandwich` {{{
nmap s <Nop>
xmap s <Nop>
let g:sandwich#recipes = deepcopy(g:sandwich#default_recipes)
" }}}
2022-12-01 13:57:54 +01:00
" `neoclide/coc.nvim` {{{
2020-02-17 17:05:51 +01:00
let g:coc_global_extensions = [
2022-12-01 13:57:54 +01:00
\'coc-dictionary',
\'coc-syntax',
2020-02-17 17:05:51 +01:00
\'coc-eslint',
\'coc-prettier',
2020-02-19 10:26:20 +01:00
\'coc-tsserver',
2020-05-07 02:11:41 +02:00
\'coc-html',
\'coc-emmet',
\'coc-css',
\'coc-svg',
\'coc-svelte',
2022-12-01 13:57:54 +01:00
\'coc-jedi',
2020-05-07 02:11:41 +02:00
\'coc-json',
\'coc-yaml',
2022-05-11 01:03:16 +02:00
\'coc-snippets',
2022-12-01 13:57:54 +01:00
\'coc-clangd',
\'coc-bibtex'
2020-02-17 17:05:51 +01:00
\]
2021-03-10 17:48:56 +01:00
" Autocomplete
2022-12-01 13:57:54 +01:00
"
" `coc-snippets`
" TODO: is this block even necessary anymore?
"
" I use `coc-snippets-exand-jump` here as it is more flexible afaics
" As stated in the docs:
" `coc-snippets-expand` Expand snippet w/ current inserted text
" `coc-snippets-expand-jump` Expand snippet or jump to next placeholder of current snippet if possible
" Use tab for expansion in every context Don't use it for jumping as
" expansions have priority over jumping (which is not always what you want)
"
" E.g. You don't want to expand `time` to say `12:05` upon `<tab>`bing to go
" from arguments to body in a function snippet
inor <silent><expr> <TAB>
\ coc#pum#visible() ? coc#_select_confirm() :
\ coc#expandable() ? "\<C-r>=coc#rpc#request('doKeymap', ['snippets-expand-jump',''])\<CR>" :
\ "\<TAB>"
" Use <c-j> and <c-k> to move through suggestions
" Open suggestions if not yet open
inor <silent><expr> <c-j> coc#pum#visible() ? coc#pum#next(1) : coc#refresh()
" NOTE: As the followning interfered with digraphs, I replaced `coc#refresh`
" with `"\<C-g>u\<c-k>"` which afaik just does c-k when no completion menu is
" shown
" ```
" inor <silent><expr> <c-k> coc#pum#visible() ? coc#pum#prev(1) : coc#refresh()
" ```
inor <silent><expr> <c-k> coc#pum#visible() ? coc#pum#prev(1) : "\<C-g>u\<c-k>"
" NOTE: this is cutting text in visual mode, it is replaces `$VISUAL` on next
" expansion
"
" although I mapped it, I have yet to test this feature
vmap <tab> <Plug>(coc-snippets-select)
2021-03-10 17:48:56 +01:00
ino <expr><cr> complete_info()["selected"] != "-1" ? "\<c-y>" : "\<c-g>u\<CR>"
2022-12-01 13:57:54 +01:00
2021-08-31 14:23:13 +02:00
" Show doccumentation
fu! s:show_documentation()
if (index(['vim','help'], &filetype) >= 0)
execute 'h '.expand('')
else
call CocAction('doHover')
endif
endfunction
2022-12-01 13:57:54 +01:00
nn <leader>es :CocCommand snippets.editSnippets<cr>
2021-03-10 17:48:56 +01:00
" Code action on cursor position
nm <leader>do <Plug>(coc-codeaction)
2022-12-01 13:57:54 +01:00
" Commands
2021-03-10 17:48:56 +01:00
com! -nargs=0 Prettier :CocCommand prettier.formatFile
2022-12-01 13:57:54 +01:00
" }}}
2020-02-17 17:05:51 +01:00
2022-12-01 13:51:29 +01:00
" `.../copilot` {{{
let g:copilot_node_command = "/home/h/.config/nvm/versions/node/v16.18.0/bin/node"
let g:copilot_no_tab_map = v:true
imap <c-l> <Plug>(copilot-next)
imap <c-h> <Plug>(copilot-prev)
imap <silent><script><expr> <s-tab> copilot#Accept("\<CR>")
" Show Copilot node v16 as it does not work with v18 yet
2021-03-10 17:48:56 +01:00
" LaTex
let g:vimtex_view_method='zathura'
2021-08-31 14:22:15 +02:00
let g:tex_flavor='latex'
2021-03-10 17:48:56 +01:00
let g:tex_conceal='abdmg'
let g:vimtex_quickfix_mode=0
2020-09-19 22:07:29 +02:00
2021-08-31 14:22:15 +02:00
" Markdown
au FileType markdown setl tw=80 fo+=t " Wrap markdown to 80 characters
2021-03-10 17:48:56 +01:00
" Comments
xm <leader>c <Plug>Commentary
nm <leader>c <Plug>Commentary
nm <leader>cc <Plug>CommentaryLine
2020-09-19 22:07:29 +02:00
2021-03-10 17:48:56 +01:00
" FZF
2020-05-07 02:11:41 +02:00
let g:fzf_layout = {'window': { 'width': 0.62, 'height': 0.62}}
2020-03-19 14:28:07 +01:00
let g:ag_working_path_mode="r"
2021-03-10 17:48:56 +01:00
let $FZF_DEFAULT_COMMAND = 'ag --hidden --ignore .git -g ""' " respect gitignore
se wildignore+=*/node_modules/*,*/tmp/*,*.so,*.swp,*.zip " " ignore these
2020-09-19 22:07:29 +02:00
2021-08-31 14:23:54 +02:00
let g:fzf_colors =
\ { 'fg': ['fg', 'Normal'],
\ 'bg': ['bg', 'Normal'],
\ 'hl': ['fg', 'Comment'],
\ 'fg+': ['fg', 'CursorLine', 'CursorColumn', 'Normal'],
\ 'bg+': ['bg', 'CursorLine', 'CursorColumn'],
\ 'hl+': ['fg', 'Statement'],
\ 'info': ['fg', 'Comment'],
\ 'border': ['fg', 'Comment'],
\ 'prompt': ['fg', 'Conditional'],
\ 'pointer': ['fg', 'Exception'],
\ 'marker': ['fg', 'Keyword'],
\ 'spinner': ['fg', 'Label'], }
2022-11-27 23:24:25 +01:00
let g:ag_working_path_mode="r"
" }}}
" `vim-pandoc/vim-pandoc` {{{
" `vim-pandoc/vim-pandoc-syntax`
au FileType pandoc call pandoc#completion#Init()
let g:pandoc#filetypes#pandoc_markdown=0
let g:pandoc#spell#enabled=0
let g:pandoc#spell#default_langs=['en_us', 'nl_be']
let g:pandoc#syntax#conceal#urls=1
let g:pandoc#syntax#conceal#blacklist=[]
let g:pandoc#formatting#mode='a'
let g:pandoc#formatting#textwidth=90
let g:pandoc#modules#disabled = ["formatting", "dashes", "yaml", "metadata"]
" }}}
2023-04-07 22:21:22 +02:00
" `euclio/vim-markdown-composer` {{{
let g:markdown_composer_custom_css = ['file:///home/h/.wiki/pandoc.css']
let g:markdown_composer_external_renderer='pandoc -f markdown+latex_macros-yaml_metadata_block -t html5 --mathjax --bibliograph /home/h/.wiki/references.bib --citeproc --lua-filter=/home/h/.wiki/lua-filters/diagram-generator/diagram-generator.lua --lua-filter=/home/h/.wiki/filters/html-links.lua --lua-filter=/home/h/.wiki/filters/tikz.lua'
let g:markdown_composer_autostart = 0
" }}}
2022-11-27 23:24:25 +01:00
" `lervag/wiki.vim` {{{
" Only load wiki.vim for wiki directory
let g:wiki_global_load=0
let g:wiki_root='~/.wiki'
let g:wiki_index_name='index'
let g:wiki_zotero_root='~/doc/Zotero'
let g:wiki_filetypes=['md']
let g:wiki_completion_case_sensitive=0
" Mappings
" Remap <leader>p
2023-04-07 22:21:22 +02:00
" augroup filetype_pandoc
" autocmd!
" au BufRead,BufNewFile /home/h/.wiki/*.md nn <buffer><leader>p :WikiFzfPages<cr>
" au BufRead,BufNewFile /home/h/.wiki/*.md nnoremap <expr><buffer> sv empty(g:wiki#link#get()) ? ':vs<CR><c-w>w' : '<Plug>(wiki-link-follow-vsplit)'
" au BufRead,BufNewFile /home/h/.wiki/*.md nnoremap <expr><buffer> ss empty(g:wiki#link#get()) ? ':sp<CR><c-w>w' : '<Plug>(wiki-link-follow-split)'
" augroup END
2022-11-27 23:24:25 +01:00
" If we are on a wiki link
" let g:wiki_file_handlenmap r
" Links
let g:wiki_link_extension='.md'
" Do not automatically transform to link, use `<leader>wf` for this
let g:wiki_link_toggle_on_follow=0
let g:wiki_link_target_type='md'
let g:wiki_map_text_to_link='Slugify'
" E.g. transform `My link` into `[My link](my-link.md)`
function Slugify(text) abort
return [substitute(tolower(a:text), '\s\+', '-', 'g'), a:text]
endfunction
vmap <leader>wf <Plug>(wiki-link-toggle-visual)
" Automatically save when navigation
let g:wiki_write_on_nav=1
" }}}
" `tools-life/taskwiki` {{{
let g:taskwiki_taskrc_location='/home/h/.config/task/taskrc'
let g:taskwiki_disable_concealcursor=1
let g:taskwiki_dont_preserve_folds=1
let g:taskwiki_dont_fold=1
" }}}
2020-08-06 16:36:57 +02:00
2021-03-10 17:48:56 +01:00
" JS and TypeScript
2020-05-07 02:11:41 +02:00
let g:javascript_plugin_jsdoc = 1 " jsdoc syntax highlighting
let g:javascript_plugin_flow = 1 " flow syntax highlighting
let g:javascript_conceal_function = "ƒ"
2020-08-06 16:36:57 +02:00
let g:javascript_conceal_return = "⇖"
2020-05-13 19:08:38 +02:00
let g:svelte_indent_script = 0
let g:svelte_indent_style = 0
2022-05-11 01:02:08 +02:00
" JSONC (see https://github.com/neoclide/jsonc.vim/pull/9")
autocmd BufNewFile,BufRead */.vscode/*.json setlocal filetype=jsonc
2022-12-01 13:54:13 +01:00
" `.../quickscope` {{{
let g:qs_max_chars=80
let g:qs_lazy_highlight = 1
" }}}
2020-03-19 14:28:07 +01:00
" SuperCollider
2021-03-10 17:48:56 +01:00
au BufEnter,BufWinEnter,BufNewFile,BufRead *.sc,*.scd se filetype=supercollider
2020-03-19 14:28:07 +01:00
au Filetype supercollider packadd scvim
2021-03-10 17:48:56 +01:00
" Tidalcycles (sclang and vim-tidal)
2020-05-08 16:11:55 +02:00
let g:tidal_default_config = {"socket_name": "default", "target_pane": "tidal:1.1"}
2020-05-07 02:11:41 +02:00
2020-11-02 11:53:18 +01:00
2021-03-10 17:48:56 +01:00
" Plugin keybindings
""""""""""""""""""""
2020-09-19 22:07:29 +02:00
2021-03-10 17:48:56 +01:00
" FZF
nn <c-p> :FZF<cr>
nn <leader>p :FZF<cr>
nn <leader>b :Buffers<cr>
nn <leader>h :History<cr>
2020-09-19 22:07:29 +02:00
let g:fzf_action = {
\ 'ctrl-t': 'tab split',
\ 'ctrl-s': 'split',
\ 'ctrl-v': 'vsplit'
\}
2022-11-27 23:24:25 +01:00
" Insert path completion
ino <expr><c-f> fzf#vim#complete#path('rg --files --sort path')
2020-09-19 22:07:29 +02:00
2022-11-27 23:24:25 +01:00
" }}}
" Color theme & statusline {{{
"
2020-05-13 19:08:38 +02:00
2021-03-10 17:48:56 +01:00
se ls=2
se stl=\ %0*%n
se stl+=\ %m
2022-11-27 23:24:25 +01:00
se stl+=\ %y%0*
2021-03-10 17:48:56 +01:00
se stl+=\ %<%F
2022-11-27 23:24:25 +01:00
se stl+=\ %0*%=%5l%*
se stl+=%0*/%L%*
colo yang
" }}}
2020-11-02 11:54:10 +01:00
2022-11-27 23:24:25 +01:00
" Quick hacks {{{
"
2020-02-16 12:41:12 +01:00
2022-11-27 23:24:25 +01:00
fu! Compile()
if expand('%:e') == "md"
:silent exec "!pandoc % -s -o /tmp/op.pdf &"
endif
endfu
fu! Preview()
:call Compile()
:silent exec "!zathura /tmp/op.pdf &"
endfu
2020-08-06 16:36:57 +02:00
2021-03-10 17:48:56 +01:00
" VIM config hot reload
2022-11-27 23:24:25 +01:00
au! bufwritepost .vimrc source $HOME/.vimrc
" TODO: separate to filetype specific files
" JS
" Jump between `=` and `;`
au FileType javascript set mps+==:;
" JSONC (see https://github.com/neoclide/jsonc.vim/pull/9")
au BufNewFile,BufRead */.vscode/*.json setlocal filetype=jsonc
" Hacky way to pass on active note to script for automated for HTML preview
au BufEnter /home/h/.wiki/*.md silent exe '!echo %:t > /home/h/.local/share/nvim/plugged/bro/current-page'
" }}}
highlight QuickScopeSecondary cterm=underline
highlight QuickScopePrimary ctermbg=253 ctermfg=232 cterm=none
highlight Pmenu ctermfg=232
function! SynGroup()
let l:s = synID(line('.'), col('.'), 1)
echo synIDattr(l:s, 'name') . ' -> ' . synIDattr(synIDtrans(l:s), 'name')
endfun
com! -nargs=0 Syn :call SynGroup()
" Taken from /usr/share/vim/vim90/defaults.vim
augroup vimStartup
au!
" When editing a file, always jump to the last known cursor position.
" Don't do it when the position is invalid, when inside an event handler
" (happens when dropping a file on gvim) and for a commit message (it's
" likely a different one than last time).
autocmd BufReadPost *
\ if line("'\"") >= 1 && line("'\"") <= line("$") && &ft !~# 'commit'
\ | exe "normal! g`\""
\ | endif
augroup END
" Highlight todo's for every filetype
" https://stackoverflow.com/questions/11709965/vim-highlight-the-word-todo-for-every-filetype
augroup HiglightTODO
autocmd!
autocmd WinEnter,VimEnter * :silent! call matchadd('Todo', 'TODO', -1)
autocmd WinEnter,VimEnter * :silent! call matchadd('Todo', 'FIXME', -1)
autocmd WinEnter,VimEnter * :silent! call matchadd('Todo', 'QUESTION', -1)
augroup END