"***************************************************************************** "" Functions "***************************************************************************** function! GetBufferList() redir =>buflist silent! ls! redir END return buflist endfunction function! ToggleList(bufname, pfx) let buflist = GetBufferList() for bufnum in map(filter(split(buflist, '\n'), 'v:val =~ "'.a:bufname.'"'), 'str2nr(matchstr(v:val, "\\d\\+"))') if bufwinnr(bufnum) != -1 exec(a:pfx.'close') return endif endfor if a:pfx == 'l' && len(getloclist(0)) == 0 echohl ErrorMsg echo "Location List is Empty." return endif let winnr = winnr() exec(a:pfx.'open') if winnr() != winnr wincmd p endif endfunction "***************************************************************************** "" Basic Setup "*****************************************************************************" " General let no_buffers_menu=1 syntax on set ruler set number set mousemodel=popup set t_Co=256 set guioptions=egmrti set gfn=Monospace\ 10 " TODO: Testing if this works against automatically setting paste mode " Issue: https://github.com/neovim/neovim/issues/7994 au InsertLeave * set nopaste " undofile - This allows you to use undos after exiting and restarting " This, like swap and backups, uses .vim-undo first, then ~/.vim/undo " :help undo-persistence if exists("+undofile") if isdirectory($HOME . '/.vim/undo') == 0 :silent !mkdir -p ~/.vim/undo > /dev/null 2>&1 endif set undodir=./.vim-undo// set undodir+=~/.vim/undo// set undofile endif " Encoding set encoding=utf-8 set fileencoding=utf-8 set fileencodings=utf-8 set bomb set binary " Fix backspace indent set backspace=indent,eol,start " Tabs. May be overriten by autocmd rules set tabstop=4 set softtabstop=0 set shiftwidth=4 set expandtab " Map leader to , let mapleader=',' " Enable hidden buffers set hidden " Searching set hlsearch set incsearch set ignorecase set smartcase " Directories for swp files set nobackup set noswapfile set fileformats=unix,dos,mac " File overview set wildmode=list:longest,list:full set wildignore+=*.o,*.obj,.git,*.rbc,*.pyc,__pycache__ " Shell to emulate if exists('$SHELL') set shell=$SHELL else set shell=/bin/bash endif " Set color scheme colorscheme molokai "Show always Status bar set laststatus=2 " Use modeline overrides set modeline set modelines=10 " Set terminal title set title set titleold="Terminal" set titlestring=%F " search will center on the line it's found in. nnoremap n nzzzv nnoremap N Nzzzv "***************************************************************************** "" Abbreviations "***************************************************************************** " no one is really happy until you have this shortcuts cnoreabbrev W! w! cnoreabbrev Q! q! cnoreabbrev Qall! qall! cnoreabbrev Wq wq cnoreabbrev Wa wa cnoreabbrev wQ wq cnoreabbrev WQ wq cnoreabbrev W w cnoreabbrev Q q cnoreabbrev Qall qall " NERDTree configuration let g:NERDTreeChDirMode=2 let g:NERDTreeIgnore=['\.rbc$', '\~$', '\.pyc$', '\.db$', '\.sqlite$', '__pycache__'] let g:NERDTreeSortOrder=['^__\.py$', '\/$', '*', '\.swp$', '\.bak$', '\~$'] let g:NERDTreeShowBookmarks=1 let g:nerdtree_tabs_focus_on_files=1 let g:NERDTreeMapOpenInTabSilent = '' let g:NERDTreeWinSize = 50 set wildignore+=*/tmp/*,*.so,*.swp,*.zip,*.pyc,*.db,*.sqlite nnoremap :NERDTreeFind nnoremap :NERDTreeToggle " open terminal emulation nnoremap sh :terminal:startinsert "***************************************************************************** "" Autocmd Rules "***************************************************************************** "" The PC is fast enough, do syntax highlight syncing from start unless 200 lines augroup vimrc-sync-fromstart autocmd! autocmd BufEnter * :syntax sync maxlines=200 augroup END " Nasm filetype augroup nasm autocmd! autocmd BufRead,BufNewFile *.nasm set ft=nasm augroup END " Binary filetype augroup Binary au! au BufReadPre *.bin,*.exe,*.elf let &bin=1 au BufReadPost *.bin,*.exe,*.elf if &bin | %!xxd au BufReadPost *.bin,*.exe,*.elf set ft=xxd | endif au BufWritePre *.bin,*.exe,*.elf if &bin | %!xxd -r au BufWritePre *.bin,*.exe,*.elf endif au BufWritePost *.bin,*.exe,*.elf if &bin | %!xxd au BufWritePost *.bin,*.exe,*.elf set nomod | endif augroup END " Binary filetype augroup fasm au! au BufReadPost *.fasm set ft=fasm augroup END augroup deoplete-update autocmd! autocmd VimEnter * UpdateRemotePlugin augroup END "" Remember cursor position augroup vimrc-remember-cursor-position autocmd! autocmd BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif augroup END "" txt " augroup vimrc-wrapping " autocmd! " autocmd BufRead,BufNewFile *.txt call s:setupWrapping() " augroup END "" make/cmake augroup vimrc-make-cmake autocmd! autocmd FileType make setlocal noexpandtab autocmd BufNewFile,BufRead CMakeLists.txt setlocal filetype=cmake augroup END set autoread "***************************************************************************** "" Mappings "***************************************************************************** " Split noremap h :split noremap v :vsplit " Git noremap ga :Gwrite noremap gc :Gcommit noremap gsh :Gpush noremap gll :Gpull noremap gs :Gstatus noremap gb :Gblame noremap gd :Gvdiff noremap gr :Gremove " Tabs nnoremap gt nnoremap gT nnoremap :tabnew " Set working directory nnoremap . :lcd %:p:h " Opens an edit command with the path of the currently edited file filled in noremap e :e =expand("%:p:h") . "/" " Opens a tab edit command with the path of the currently edited file filled noremap te :tabe =expand("%:p:h") . "/" " Tagbar nmap :TagbarToggle let g:tagbar_autofocus = 1 " Copy/Paste/Cut set clipboard^=unnamed,unnamedplus noremap YY "+y noremap p "+gP noremap XX "+x " Enable mouse for vim set mouse=a " Buffer nav noremap z :bp noremap q :bp noremap x :bn noremap w :bn " Close buffer noremap c :bd " Clean search (highlight) nnoremap :noh " Switching windows noremap j noremap k noremap l noremap h " Vmap for maintain Visual Mode after shifting > and < vmap < >gv " Move visual block vnoremap J :m '>+1gv=gv vnoremap K :m '<-2gv=gv " Open current line on GitHub nnoremap o :.Gbrowse " Save on strg+s if not in paste mode nmap :w vmap gv imap " Quit on strg+q in normal mode nnoremap :q " Strg+d to replace word under cursor nnoremap :%s/\<\>//g " Strg+f ro find word under cursor nnoremap :/ " Remove unneccessary spaces nnoremap :let _s=@/ :%s/\s\+$//e :let @/=_s :nohl :unlet _s " Reindent whole file with F6 map mzgg=G`z " Toggle location list nmap :call ToggleList("Quickfix List", 'c') " Replacing text in visual mode doesn't copy it anymore xmap p ReplaceWithRegisterVisual xmap ReplaceWithRegisterVisual " ALE mappings nmap i (ale_hover) nmap d (ale_go_to_definition_in_tab) nmap rf (ale_find_references) nmap (ale_fix) " Vim-Go mappings au FileType go nmap i :GoDoc au FileType go nmap d :GoDef au FileType go nmap rf :GoReferrers "" Opens an edit command with the path of the currently edited file filled in noremap e :e =expand("%:p:h") . "/" " Use tab for navigatin in autocompletion window inoremap pumvisible() ? "\" : "\" inoremap pumvisible() ? "\" : "\" "***************************************************************************** "" Plugin settings "***************************************************************************** " vim-airline set statusline+=%{fugitive#statusline()} let g:airline_theme = 'powerlineish' let g:airline#extensions#syntastic#enabled = 1 let g:airline#extensions#branch#enabled = 1 let g:airline#extensions#tabline#enabled = 1 let g:airline#extensions#tagbar#enabled = 1 let g:airline_skip_empty_sections = 1 let g:airline#extensions#ale#enabled = 1 " show indent lines let g:indent_guides_enable_on_vim_startup = 1 let g:indent_guides_auto_colors = 0 hi IndentGuidesOdd ctermbg=235 hi IndentGuidesEven ctermbg=235 let g:indent_guides_guide_size = 1 let g:indent_guides_start_level = 2 " Enable autocompletion let g:deoplete#enable_at_startup = 1 set completeopt-=preview " Ale no preview on hover let g:ale_close_preview_on_insert = 0 let g:ale_cursor_detail = 0 " Ale skip if file size over 2G let g:ale_maximum_file_size = "2147483648" " Ale to loclist and quickfix let g:ale_set_quickfix = 1 " let g:ale_set_loclist = 1 " Ale language server let g:ale_linters = { \ 'python': ['pyls'], \ 'c': ['cquery'], \ 'cpp': ['cquery'], \ 'xml': ['xmllint'] \ } " ALE fixers let g:ale_fixers = { '*': ['remove_trailing_lines', 'trim_whitespace'] } let g:ale_fixers.python = ['black'] let g:ale_fixers.go = ['gofmt'] let g:ale_fixers.c = ['clang-format'] let g:ale_fixers.cpp = ['clang-format'] let g:ale_fixers.json = ['jq'] let g:ale_fixers.xml = ['xmllint'] let g:ale_completion_enabled = 1 let g:ale_sign_error = '⤫' let g:ale_sign_warning = '⚠' let g:ale_lint_on_insert_leave = 1 " Vim-Go Settings let g:go_auto_sameids = 1 let g:go_fmt_command = "goimports" let g:go_auto_type_info = 1 " Disable syntastic for langserver supported languages let g:syntastic_mode_map = { \ "mode": "active", \ "passive_filetypes": ["go", "python", "c", "cpp", "xml" ] \ } let g:syntastic_always_populate_loc_list = 1 let g:syntastic_auto_loc_list = 2 let g:syntastic_aggregate_errors = 1 let g:syntastic_check_on_open = 1 let g:syntastic_check_on_wq = 0 let g:syntastic_error_symbol='✗' let g:syntastic_warning_symbol='⚠' let g:syntastic_style_error_symbol = '✗' let g:syntastic_style_warning_symbol = '⚠' "***************************************************************************** "" Shortcuts overview "***************************************************************************** " Shortcuts overview " F1 --> Filetree find " F2 --> Filetree toggle " F3 --> Function overview " F4 --> Toggle error bar " F5 --> Remove trailing whitespaces " F6 --> Reindent whole file " F7 --> Format and lint file " ,i --> Information about function " ,d --> Jump to definition " ,r --> Rename in all occurences " ,rf --> Find references of function/variable " ,e --> Change current file " ,te --> Open file in new tab " strg+f --> Find current selected word " strg+d --> Replace current selected word " strg+s --> Save file " strg+q --> Close current file " space+, --> Stop highlighting words after search