""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " -> Vim-Plug """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" call plug#begin('~/.config/nvim/plugged') Plug 'jremmen/vim-ripgrep' Plug 'stefandtw/quickfix-reflector.vim' Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' } Plug 'buoto/gotests-vim' Plug 'w0rp/ale' Plug 'vim-scripts/DrawIt' let $NVIM_TUI_ENABLE_TRUE_COLOR=1 " Rust settings Plug 'rust-lang/rust.vim' " Autocomplete Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' } " LSP Plug 'nvim-lua/lsp-status.nvim' Plug 'neovim/nvim-lspconfig' Plug 'nvim-lua/lsp_extensions.nvim' Plug 'nvim-lua/completion-nvim' " Diagnostics in QuickFix/LocList Plug 'onsails/diaglist.nvim' call plug#end() """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " -> General """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Sets how many lines of history VIM has to remember set history=500 " Enable filetype plugins filetype plugin on "filetype indent on " Set to auto read when a file is changed from the outside set autoread au FocusGained,BufEnter * checktime " :Ws sudo saves the file " (useful for handling the permission-denied error) command! Ws execute 'w !sudo tee % > /dev/null' edit! " Limit what can be done in the VIMRC set secure """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " -> VIM user interface """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Set 7 lines to the cursor - when moving vertically using j/k set so=7 " Avoid garbled characters in Chinese language windows OS let $LANG='en' set langmenu=en source $VIMRUNTIME/delmenu.vim source $VIMRUNTIME/menu.vim " Turn on the Wild menu set wildmenu " Display wildmenu with specific options set wildmode=list:longest,full " Ignore compiled files set wildignore=*.o,*~,*.pyc if has("win16") || has("win32") set wildignore+=.git\*,.hg\*,.svn\* else set wildignore+=*/.git/*,*/.hg/*,*/.svn/*,*/.DS_Store endif "Always show current position set ruler " Height of the command bar set cmdheight=1 " A buffer becomes hidden when it is abandoned set hid " Configure backspace so it acts as it should act set backspace=eol,start,indent set whichwrap+=<,>,h,l " Ignore case when searching set ignorecase " When searching try to be smart about cases set smartcase " Highlight search results set hlsearch " Makes search act like search in modern browsers set incsearch " Don't redraw while executing macros (good performance config) set lazyredraw " For regular expressions turn magic on set magic " Show matching brackets when text indicator is over them set showmatch " How many tenths of a second to blink when matching brackets set mat=2 " No annoying sound on errors set noerrorbells set novisualbell set t_vb= set tm=500 " time waited for key press(es) to complete. It makes for a faster key response set ttyfast set ttimeout set ttimeoutlen=50 " Properly disable sound on errors on MacVim if has("gui_macvim") autocmd GUIEnter * set vb t_vb= endif " Add a bit extra margin to the left set foldcolumn=1 " new splits will be at the bottom or to the right side of the screen set splitbelow set splitright set showcmd " Show previous commands set showmode " Display NORMAL/INSERT/VISUAL mode below statusline set number " We like line numbers """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " -> Colors and Fonts """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Enable syntax highlighting "syntax enable " Disable syntax for now, but keep colors for the rest of the UI syntax off " Enable 256 colors palette in Gnome Terminal if $COLORTERM == 'gnome-terminal' set t_Co=256 endif try colorscheme peachpuff catch endtry set background=light " Set extra options when running in GUI mode if has("gui_running") set guioptions-=T set guioptions-=e set t_Co=256 set guitablabel=%M\ %t endif " Set utf8 as standard encoding and en_US as the standard language set encoding=utf8 " Use Unix as the standard file type set ffs=unix,dos,mac set colorcolumn=250 "Disable formatting past 250 chars """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " -> Files, backups and undo """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Turn backup off, since most stuff is in SVN, git etc. anyway... set nobackup set nowb set noswapfile set shortmess+=I """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " -> Text, tab and indent related """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Use spaces instead of tabs set expandtab " Be smart when using tabs ;) set smarttab " 1 tab == 4 spaces set shiftwidth=4 set tabstop=4 " Linebreak on 500 characters set lbr set tw=500 set ai "Auto indent set si "Smart indent set wrap "Wrap lines set shiftround " When shifting lines, round indentation to nearest shiftwidth """""""""""""""""""""""""""""" " -> Status line """""""""""""""""""""""""""""" " Always show the status line set laststatus=2 " Statusline definition set statusline= set statusline+=%7*\[%n] "buffernr set statusline+=%1*\ %<%t\ "File+path set statusline+=%3*\ %y\ "FileType set statusline+=%4*\ %{''.(&fenc!=''?&fenc:&enc).''} "Encoding set statusline+=%5*\ %{(&bomb?\",BOM\":\"\")}\ "Encoding2 set statusline+=%6*\ %{&ff}\ "FileFormat (dos/unix..) set statusline+=%7*\ %=\ row:%l/%L\ (%03p%%)\ "Rownumber/total (%) set statusline+=%9*\ col:%03c\ "Colnr set statusline+=%0*\ %m%r%w\ "Modified? Readonly? Top/bot. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " -> Misc """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Remove the Windows ^M - when the encodings gets messed up noremap m mmHmt:%s///ge'tzt'm " Toggle paste mode on and off map pp :setlocal paste! set pastetoggle= " Disable mouse automatic mode set mouse-=a " Enable line numbers toggle noremap n :set invnumber " jump to the last position when reopening a file if has("autocmd") au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif endif """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " -> Helper functions """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Trim whitespace at end of lines nnoremap s :%s/\s\+$//e """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " -> General Code Settings """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" let g:deoplete#enable_at_startup = 1 " Fix weird JSON quotation issue let g:vim_json_syntax_conceal = 0 " Enable Ripgrep formatting for vim let g:rg_command = 'rg --vimgrep -S' " Code folding set foldmethod=syntax set foldlevel=1 set foldnestmax=1 " -- Text wrap and expand spaces for yaml, css, js, etc if has("autocmd") " Syntax of these languages is fussy over tabs Vs spaces autocmd FileType make setlocal ts=8 sts=8 sw=8 noexpandtab autocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab " Customisations based on house-style (arbitrary) autocmd FileType html setlocal ts=2 sts=2 sw=2 expandtab autocmd FileType css setlocal ts=2 sts=2 sw=2 expandtab autocmd FileType javascript setlocal ts=4 sts=4 sw=4 noexpandtab " Treat .rss files as XML autocmd BufNewFile,BufRead *.rss setfiletype xml endif " Persistent Undo if has('persistent_undo') set undolevels=5000 set undodir=$HOME/.vim_undofiles set undofile endif " Put LSP stuff in the quickfix window "lua vim.diagnostic.setqflist() " Enable diagnostic list in qfix/loclist lua << EOF require("diaglist").init({ -- optional settings -- below are defaults -- increase for noisy servers debounce_ms = 50, -- list in quickfix only diagnostics from clients -- attached to a current buffer -- if false, all buffers' clients diagnostics is collected buf_clients_only = true, }) EOF """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " -> ALE Settings """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" let g:LanguageClient_serverCommands = { \ 'rust': ['rust-analyzer'], \ } let g:ale_linters = {'rust': ['rust-analyzer']} let g:ale_markdown_markdownlint_options = "--config ~/.mdlrc" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " -> Golang Settings """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" let g:go_def_mode='gopls' let g:go_info_mode='gopls' let g:go_gopls_gofumpt=1 let g:go_metalinter_command = 'golangci-lint' let g:go_fmt_command="gopls" " By default syntax-highlighting for Functions, Methods and Structs is disabled let g:go_highlight_build_constraints = 1 let g:go_highlight_fields = 1 let g:go_highlight_functions = 1 let g:go_highlight_interfaces = 1 let g:go_highlight_methods = 1 let g:go_highlight_operators = 1 let g:go_highlight_structs = 1 " Auto-space Go files autocmd BufNewFile,BufRead *.go setlocal noexpandtab tabstop=4 shiftwidth=4 " vim-go mappings au FileType go nmap b (go-build) au FileType go nmap c (go-coverage) "au FileType go nmap r (go-run) au FileType go nmap t (go-test) au FileType go nmap d (go-def) " Go implements (interfaces under cursor) "au FileType go nmap s (go-implements) " Go show type info under cursor au FileType go nmap i (go-info) " Go rename "au FileType go nmap e (go-rename) " Go vet au FileType go nmap v (go-vet) " Godoc under cursor au FileType go nmap k (go-doc) """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " -> Rust Settings """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" let g:rustfmt_autosave = 1 if has('nvim') " Rust LSP support for rust-analyzer lua << EOF local nvim_lsp = require'lspconfig' local on_attach = function(client) require'completion'.on_attach(client) end -- Auto-imports nvim_lsp.rust_analyzer.setup({ on_attach=on_attach, settings = { ["rust-analyzer"] = { assist = { importGranularity = "module", importPrefix = "by_self", }, cargo = { loadOutDirsFromCheck = true }, procMacro = { enable = true }, } } }) -- Enable diagnostics vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with( vim.lsp.diagnostic.on_publish_diagnostics, { virtual_text = true, signs = true, update_in_insert = true, } ) EOF endif """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""