aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRenken <renken@shione.net>2022-08-30 23:04:10 +0200
committerRenken <renken@shione.net>2022-08-30 23:16:11 +0200
commitd1188e4f42d96969828456e8a9a7f909cf52e0f3 (patch)
tree187ca9882244f1c1375e2bf5f9fffcae287307b9
parent4fc0a71aa718c3d4bbfd76e7c7743761f74db1b3 (diff)
downloadshione-d1188e4f42d96969828456e8a9a7f909cf52e0f3.tar.gz
shione-d1188e4f42d96969828456e8a9a7f909cf52e0f3.zip
home: configure neovim
-rw-r--r--nichijou/home/config/nvim/init.vim534
-rw-r--r--nichijou/home/nvim.scm27
2 files changed, 561 insertions, 0 deletions
diff --git a/nichijou/home/config/nvim/init.vim b/nichijou/home/config/nvim/init.vim
new file mode 100644
index 0000000..f4f684b
--- /dev/null
+++ b/nichijou/home/config/nvim/init.vim
@@ -0,0 +1,534 @@
+set runtimepath^=~/.guix-home/profile/share/vim/vimfiles/
+
+"-------------------------------------------------
+" General
+"-------------------------------------------------
+
+" Turn off vi compatibility.
+set nocompatible
+
+" Set the amount of lines of history to remember.
+set history=100
+
+" Set a mapleader key. This is used for extra key combinations.
+let mapleader = '\'
+map <Space> <leader>
+
+" Better command line completion.
+set wildmenu
+set wildmode=list:longest,full
+
+" Ignore compiled files.
+set wildignore=*.o,*~,*.pyc
+
+" Ignore binary files.
+set wildignore^=*.png,*.pdf
+
+" Filetypes
+autocmd BufRead,BufNewFile *.irst setfiletype rst
+autocmd BufRead,BufNewFile *.puml setfiletype plantuml
+autocmd BufRead,BufNewFile *.tikz setfiletype tex
+autocmd BufRead,BufNewFile *.tpp setlocal filetype=cpp
+
+" 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
+
+" Set the swap directory. The extra '/' suffix is required to make vim create
+" unique filenames.
+call mkdir(expand("~/.vim/swap"), "p", 0700)
+set dir=~/.vim/swap//
+
+" Use system clipboard by default
+set clipboard +=unnamedplus
+
+"-------------------------------------------------
+" User interface
+"-------------------------------------------------
+
+" Display line numbers.
+set number
+
+" Set the line numbers relative from the current line.
+set relativenumber
+
+" Show the (partial) command in status line.
+set showcmd
+
+" Always display the status line, even if only one window is displayed.
+set laststatus=2
+
+" Shows a dialogue asking if the file has to be saved,
+" instead of raising an error.
+set confirm
+
+" Keep the cursor in the centre of the buffer if possible.
+set scrolloff=10000
+
+" Toggle NERDTree.
+map <C-t> :NERDTreeToggle<CR>
+
+" Always show NERDTree on start if no files were specified.
+autocmd StdinReadPre * let s:std_in=1
+autocmd VimEnter * if argc() ==# 0 && !exists("s:std_in")
+ \ | exe 'NERDTreeToggle' | endif
+
+" Disable automatic folding.
+set nofoldenable
+
+" Add buffer switching with airline
+let g:airline#extensions#tabline#buffer_idx_mode = 1
+nmap <leader>1 <Plug>AirlineSelectTab1
+nmap <leader>2 <Plug>AirlineSelectTab2
+nmap <leader>3 <Plug>AirlineSelectTab3
+nmap <leader>4 <Plug>AirlineSelectTab4
+nmap <leader>5 <Plug>AirlineSelectTab5
+nmap <leader>6 <Plug>AirlineSelectTab6
+nmap <leader>7 <Plug>AirlineSelectTab7
+nmap <leader>8 <Plug>AirlineSelectTab8
+nmap <leader>9 <Plug>AirlineSelectTab9
+nmap <leader>bp <Plug>AirlineSelectPrevTab
+nmap <leader>bn <Plug>AirlineSelectNextTab
+nmap <S-Tab> <Plug>AirlineSelectPrevTab
+nmap <Tab> <Plug>AirlineSelectNextTab
+
+" Delete the current buffer without closing the windows
+map <leader>bd :Bdelete<CR>
+" Close window
+map <leader>wd :q<CR>
+" Vertical split
+map <leader>ws :vsplit<CR>
+" Horizontal split
+map <leader>wh :split<CR>
+" Exit vim
+map <leader>qq :qa<CR>
+
+" Invoke completion on : for ledger.
+autocmd FileType ledger imap <buffer> : :<C-x><C-o>
+
+" Easy vertical terminal split opening (why is this not built-in?)
+cnoreabbrev vterm vert term
+
+
+"-------------------------------------------------
+" Colours and fonts
+"-------------------------------------------------
+
+" Enable Doxygen syntax highlighting.
+let g:load_doxygen_syntax=1
+
+" Set the color scheme.
+" colorscheme wombat256mod
+
+" Set the airline theme and configure the tabline
+" let g:airline_theme='wombat'
+let g:airline#extensions#tabline#enabled = 1
+let g:airline#extensions#tabline#fnamecollapse = 1
+let g:airline#extensions#tabline#formatter = "default"
+
+" Use 24-bit colours in the terminal, requires 'advanced' terminal emulator.
+set termguicolors
+
+" Make the terminal background transparent.
+hi Normal guibg=NONE ctermbg=NONE
+
+" Set encoding.
+set encoding=utf8
+
+" Set filetype.
+set ffs=unix
+
+
+"-------------------------------------------------
+" Search
+"-------------------------------------------------
+
+" Highlights all matches of the search pattern.
+set hlsearch
+
+" Show all the matches while typing the search command.
+set incsearch
+
+" Ignores the case when searching.
+set ignorecase
+
+" Case insensitive search, except when capital letters are used.
+set smartcase
+
+" Redraw the screen when <C-L> is pressed.
+" This also turns off the search highlighting until the next search.
+nnoremap <C-L> :nohl<CR><C-L>
+
+" Set the manual page section order for keywordprg
+let $MANSECT="3p:3:2:1:n:l:8:0:5:4:9:6:7"
+
+"-------------------------------------------------
+" Text (tab, spaces, indent)
+"-------------------------------------------------
+
+" Tabsize of 8 (default).
+set shiftwidth=8 tabstop=8
+
+" Reset default behaviour to tabs instead of spaces for reStructuredText files.
+autocmd Filetype rst setlocal noexpandtab softtabstop=8
+
+" 2 spaces instead of a tab for YAML files.
+autocmd Filetype yaml setlocal expandtab shiftwidth=2 softtabstop=2
+
+" 4 spaces instead of a tab for Python and Haskell files.
+autocmd Filetype python,haskell,lhaskell,js setlocal expandtab shiftwidth=4
+ \ softtabstop=4
+
+" Copy indent from current line when starting a new line.
+set autoindent smartindent
+
+" Highlight tabs and trailing spaces
+set list listchars=tab:>\ ,trail:ยท
+
+" Removes trailing spaces when saving
+autocmd BufWrite * :call Delete_trailing_spaces()
+
+" Disable softwrapping on long lines
+set nowrap
+
+" Enable persistent undo if it is supported
+if has('persistent_undo')
+ let vundodir = expand('~/.vim/undo')
+ if !isdirectory(vundodir)
+ call mkdir(vundodir)
+ endif
+ let &undodir = vundodir
+ set undofile
+endif
+
+
+"-------------------------------------------------
+" Deletion
+"-------------------------------------------------
+
+" Delete without putting the deleted words into the register.
+map <leader>odw "_dw
+map <leader>odW "_dW
+map <leader>ode "_de
+map <leader>odE "_dE
+map <leader>odb "_db
+map <leader>odB "_dB
+map <leader>odd "_dd
+map <leader>od^ "_d^
+map <leader>od$ "_d$
+map <leader>od{ "_d{
+map <leader>od} "_d}
+map <leader>odi( "_di(
+map <leader>odi) "_di)
+map <leader>odi' "_di'
+map <leader>odi" "_di"
+map <leader>odi< "_di<
+map <leader>odi> "_di>
+map <leader>odf. "_df.
+map <leader>odf? "_df?
+map <leader>odf! "_df!
+map <leader>odt. "_dt.
+map <leader>odt? "_dt?
+map <leader>odt! "_dt!
+
+
+"-------------------------------------------------
+" Code
+" Compiling
+"-------------------------------------------------
+
+" Show warnings.
+set statusline=%#warningmsg#%{SyntasticStatuslineFlag()}%*
+
+" Set syntastic options.
+let g:syntastic_always_populate_loc_list = 1
+let g:syntastic_mode_map = {
+ \ "mode": "active",
+ \ "passive_filetypes": ["python"],
+ \}
+let g:syntastic_check_on_open = 0
+let g:syntastic_check_on_wq = 0
+
+let g:syntastic_check_on_wq = 0
+" Compiles the current file.
+map <leader>c :SyntasticCheck<cr>
+" Opens the location list that shows the errors.
+map <leader>co :lopen<cr><C-w><C-p>
+" Closes the location list that shows the errors.
+map <leader>cd :lclose<cr>
+
+" Close any preview window that is open
+map <leader>cf :pclose<cr>
+
+"" Completion framework.
+let g:deoplete#enable_at_startup = 1
+" Disable abbreviation of signatures (also causes issues with echodoc)
+call deoplete#custom#source('_', 'max_abbr_width', 0)
+" Disable auto-completion on backspace character.
+call deoplete#custom#option('refresh_backspace', v:false)
+" Disable preview window containing function documentation.
+set completeopt-=preview
+" Map arrow keys to <C-p> and <C-n> for better selection behaviour.
+:inoremap <expr><Up> pumvisible() ? "\<C-p>" : "\<Up>"
+:inoremap <expr><Down> pumvisible() ? "\<C-n>" : "\<Down>"
+" Allow selection of completion with tab and shift+tab.
+:inoremap <expr><S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
+:inoremap <expr><Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
+
+if executable('pyls')
+ " pip install python-language-server
+ au User lsp_setup call lsp#register_server({
+ \ 'name': 'pyls',
+ \ 'cmd': {server_info->['pyls']},
+ \ 'allowlist': ['python'],
+ \ })
+endif
+
+if executable('clangd')
+ au User lsp_setup call lsp#register_server({
+ \ 'name': 'clangd',
+ \ 'cmd': {server_info->['clangd', '-background-index']},
+ \ 'whitelist': ['c', 'cpp', 'objc', 'objcpp'],
+ \ })
+endif
+
+if executable('gopls')
+ au User lsp_setup call lsp#register_server({
+ \ 'name': 'gopls',
+ \ 'cmd': {server_info->['gopls', '-remote=auto']},
+ \ 'allowlist': ['go'],
+ \ })
+endif
+
+function! s:on_lsp_buffer_enabled() abort
+ " setlocal omnifunc=lsp#complete
+ " Do not use virtual text, they are far too obtrusive.
+ " let g:lsp_virtual_text_enabled = 0
+ " echo a diagnostic message at cursor position
+ " show diagnostic in floating window
+ " let g:lsp_diagnostics_float_cursor = 1
+ " whether to enable highlight a symbol and its references
+ " let g:lsp_highlight_references_enabled = 1
+ " let g:lsp_preview_max_width = 80
+ setlocal signcolumn=yes
+ if exists('+tagfunc') | setlocal tagfunc=lsp#tagfunc | endif
+ nmap <buffer> gd <plug>(lsp-definition)
+ nmap <buffer> gs <plug>(lsp-document-symbol-search)
+ nmap <buffer> gS <plug>(lsp-workspace-symbol-search)
+ nmap <buffer> gr <plug>(lsp-references)
+ nmap <buffer> gi <plug>(lsp-implementation)
+ nmap <buffer> gt <plug>(lsp-type-definition)
+ nmap <buffer> <leader>rn <plug>(lsp-rename)
+ nmap <buffer> [g <plug>(lsp-previous-diagnostic)
+ nmap <buffer> ]g <plug>(lsp-next-diagnostic)
+ nmap <buffer> K <plug>(lsp-hover)
+ inoremap <buffer> <expr><c-f> lsp#scroll(+4)
+ inoremap <buffer> <expr><c-d> lsp#scroll(-4)
+
+ let g:lsp_format_sync_timeout = 1000
+ let g:lsp_diagnostics_enabled = 1
+ let g:lsp_diagnostics_echo_cursor = 1
+ let g:lsp_diagnostics_float_cursor = 0
+ let g:lsp_diagnostics_highlights_enabled = 1
+ let g:lsp_diagnostics_virtual_text_enabled = 0
+ " TODO: Call this when vim-lsp is enabled else call clang-format.
+ "autocmd! BufWritePre *.c, *.cpp, *.h, *.hpp, *.rs, *.go call execute('LspDocumentFormatSync')
+ " autocmd BufWritePre *.c, *.cpp, *.h, *.hpp, *.rs, *.go LspDocumentFormatSync
+
+ " refer to doc to add more commands
+endfunction
+
+augroup lsp_install
+ au!
+ " call s:on_lsp_buffer_enabled only for languages that has the server registered.
+ autocmd User lsp_buffer_enabled call s:on_lsp_buffer_enabled()
+augroup END
+
+" Doxygen
+let g:DoxygenToolkit_briefTag_pre = ''
+let g:DoxygenToolkit_templateParamTag_pre = '\tparam '
+let g:DoxygenToolkit_templateParamTag_post = ' '
+let g:DoxygenToolkit_paramTag_pre = '\param '
+let g:DoxygenToolkit_paramTag_post = ' '
+let g:DoxygenToolkit_returnTag = '\return '
+let g:DoxygenToolkit_throwTag_pre = '\throw '
+let g:DoxygenToolkit_throwTag_post = ' '
+let g:DoxygenToolkit_fileTag = '\file '
+let g:DoxygenToolkit_authorTag = '\author '
+let g:DoxygenToolkit_dateTag = '\date '
+let g:DoxygenToolkit_versionTag = '\version '
+let g:DoxygenToolkit_blockTag = '\name '
+let g:DoxygenToolkit_classTag = '\class '
+" C is /** */, C++ is ///
+let g:DoxygenToolkit_commentType = 'C'
+" allow /** \brief Foo */ for e.g. enum doc.
+let g:DoxygenToolkit_compactOneLineDoc = 'yes'
+" No empty line between e.g. brief and param section.
+let g:DoxygenToolkit_compactDoc = 'yes'
+
+" use <leader>ENTER to generate Doxygen block
+map <leader><cr> :Dox<cr>
+
+
+"-------------------------------------------------
+" Code
+" Style
+"-------------------------------------------------
+
+" Tip: format paragraph with 'gq' in normal mode.
+" Line wrap: default to 80 chars, except for python.
+" TODO if everyone agrees to move to pyls, remove this bit as it's hard-coded.
+set tw=80
+autocmd Filetype python setlocal tw=79
+" Line wrap: recognise list alignment.
+set fo+=n
+" Line wrap: remove comment leader when joining lines.
+set fo+=j
+
+" Highlight the first 3 characters over 80 character limit.
+autocmd BufEnter * highlight OverLength ctermbg=darkgrey guibg=#501010
+autocmd BufEnter * match OverLength '\%<84v.\%>81v'
+
+" Set colour for the vertical line that shows the character limit.
+highlight ColorColumn ctermbg=Grey guibg=#2d2d2d
+
+" Toggle between the vertical line and the highlighting of characters.
+map <leader>cl :call Colorcolumn_highlighting()<cr>
+
+" Toggle between the vertical line and the highlighting of characters.
+func! Colorcolumn_highlighting()
+ if &l:colorcolumn ==# 81
+ setlocal colorcolumn&
+ match OverLength '\%<84v.\%>81v'
+ else
+ setlocal colorcolumn=81
+ match OverLength /\%1000v.\+/
+ endif
+endfunc
+
+" Configure cursor line.
+set cursorline
+
+" Disable checks for RST to avoid errors at unknown directives.
+let g:syntastic_rst_checkers = []
+
+" Set table mode settings for RST.
+let g:table_mode_corner_corner='+'
+let g:table_mode_header_fillchar='='
+
+
+"-------------------------------------------------
+" Code
+" Shortcuts
+"-------------------------------------------------
+
+" Open the quickfix window containing lc diagnostics
+map <leader>lco :copen<cr><C-w><C-p>
+" Close the quickfix window containing lc diagnostics
+map <leader>lcd :cclose<cr>
+
+"-------------------------------------------------
+" Code
+" Tags
+"-------------------------------------------------
+
+map <leader>t :TagbarToggle<cr>
+
+
+"-------------------------------------------------
+" Spell checking
+"-------------------------------------------------
+
+" Set spell checking.
+set spell spelllang=en_us
+
+" Disable spell check for some problematic filetypes.
+autocmd Filetype diff,gitrebase,plantuml,te,yaml setlocal nospell
+
+" Toggle spell checking.
+map <leader>ss :setlocal spell!<cr>
+map <leader>sl :call Spellcheck_cycle_lang()<cr>
+
+" Shortcuts for spell checking.
+map <leader>sn ]s " Next misspelled word.
+map <leader>sp [s " Previous mispelled word.
+map <leader>sa zg " Add word to dictionary.
+map <leader>s? z= " List alternative words.
+
+
+"-------------------------------------------------
+" Functions
+"-------------------------------------------------
+
+" Finds and set the dir containing C/C++ compilation database
+func! Compilation_database_build_dir_set()
+ let l:db_pre = expand('%:p:h')
+ let l:db_post = ''
+ while !filereadable(l:db_pre . l:db_post . '/compile_commands.json')
+ " probe a potential build dir
+ if filereadable(l:db_pre . l:db_post . '/build/compile_commands.json')
+ let l:db_post = l:db_post . '/build'
+ break
+ endif
+ " otherwise try a directory up
+ let l:db_post = l:db_post . '/..'
+ " Give up after after 10 dirs up (5 + 3 * 10).
+ if strlen(l:db_post) > 35
+ let l:db_pre = ''
+ let l:db_post = ''
+ break
+ endif
+ endwhile
+
+ " Simplify the dir path, changing /dir/src/../build to /dir/build
+ let l:db_dir = simplify(l:db_pre . l:db_post)
+
+ " Stop here if path hasn't changed to avoid language server restart.
+ if exists('s:compdb_dir') &&
+ \ s:compdb_dir ==# l:db_dir
+ return 0
+ endif
+ let s:compdb_dir = l:db_dir
+
+ " Syntastic.
+ " XXX Is this really needed? Remove and experiment.
+ " TODO vim-lsp already provides their own database-searching function, find if
+ " it can be used to replace this.
+ let g:syntastic_c_clang_tidy_args = '-p=''' . s:compdb_dir . ''''
+ let g:syntastic_cpp_clang_tidy_args = g:syntastic_c_clang_tidy_args
+endfunc
+
+" Removes trailing spaces when saving
+" http://amix.dk/vim/vimrc.html
+func! Delete_trailing_spaces()
+ " Do not execute for diff (patch) files, spaces are part of the context.
+ if &filetype ==# 'diff'
+ return 0
+ endif
+ exe "normal mz"
+ %s/\s\+$//ge
+ exe "normal `z"
+endfunc
+
+" Cycle between spellcheck languages
+func! Spellcheck_cycle_lang()
+ " If spellchecking is disabled, just enable it only
+ if &spell ==# 0
+ setlocal spell!
+ echo 'enabled spell checking'
+ return 0
+ endif
+
+ if &spelllang ==# 'en_us'
+ let l:lang = 'nl'
+ else
+ let l:lang = 'en_us'
+ endif
+ let &spelllang = l:lang
+ echo 'changed spell checking language to ' . l:lang
+endfunc
diff --git a/nichijou/home/nvim.scm b/nichijou/home/nvim.scm
new file mode 100644
index 0000000..27c8608
--- /dev/null
+++ b/nichijou/home/nvim.scm
@@ -0,0 +1,27 @@
+(define-module (nichijou home nvim)
+ #:use-module (gnu home services)
+ #:use-module (gnu packages vim)
+ #:use-module (gnu services)
+ #:use-module (guix gexp)
+ #:use-module (nichijou packages vim))
+
+(define-public packages
+ (list neovim
+ vim-airline
+ vim-airline-themes
+ vim-bbye
+ vim-ctrlp
+ vim-deoplete
+ vim-deoplete-vim-lsp
+ vim-detectindent
+ vim-doxygen-toolkit
+ vim-lsp
+ vim-nerdtree
+ vim-plantuml-syntax
+ vim-syntastic
+ vim-tagbar))
+
+(define-public services
+ (list (simple-service 'nichijou-nvim-config home-files-service-type
+ `((".config/nvim/init.vim" ,(local-file
+ "config/nvim/init.vim"))))))