" force python3 if has('python3') | endif " space is leader let g:mapleader = " " " runtimepath {{{1 set runtimepath ^=$XDG_CONFIG_HOME/vim set runtimepath +=$XDG_CONFIG_HOME/vim/after " plugins {{{1 call plug#begin('$XDG_DATA_HOME/vim') " This does not update vim-plug, use PlugUpgrade instead Plug 'junegunn/vim-plug' if !has("nvim") Plug 'bling/vim-airline' " {{{2 let g:airline#extensions#whitespace#enabled = 1 let g:airline#extensions#tabline#enabled = 1 let g:airline#extensions#searchcount#enabled = 0 let g:airline_powerline_fonts = 1 let g:asyncrun_status = "stopped" " let g:airline_section_error = airline#section#create_right(['%{g:asyncrun_status}']) "}}} Plug 'raimondi/delimitmate' " {{{2 let delimitMate_expand_cr = 2 let g:delimitMate_expand_space = 1 "}}} Plug 'tpope/vim-surround' "{{{2 "}}} " Plug 'valloric/youcompleteme' {{{2 Plug 'valloric/youcompleteme', \{ 'do': './install.py --clangd-completer --clang-completer' } let g:ycm_clangd_binary_path = 'clangd' " use clangd in path let g:ycm_clangd_args = ['--clang-tidy'] let g:ycm_extra_conf_vim_data = ['getcwd()'] let g:ycm_add_preview_to_completeopt = 1 let g:ycm_complete_in_comments = 1 let g:ycm_complete_in_strings = 1 let g:ycm_autoclose_preview_window_after_insertion = 0 let g:ycm_language_server = \ [ \ { \ 'name': 'haskell', \ 'cmdline': [ 'haskell-language-server-wrapper', '--lsp' ], \ 'filetypes': [ 'haskell', 'lhaskell' ] \ }, \ ] " }}} Plug 'svermeulen/vim-yoink' " {{{2 ""}}} Plug 'arcticicestudio/nord-vim' " {{{2 let g:nord_bold = 1 let g:nord_italic = 1 let g:nord_italic_comments = 1 let g:nord_underline = 1 let g:nord_uniform_status_lines = 0 let g:nord_uniform_diff_background = 0 let g:nord_cursor_line_number_background = 0 let g:nord_bold_vertical_split_line = 0 "}}} Plug 'sirver/ultisnips' " replaced by lua-snip {{{2 Plug 'honza/vim-snippets' let g:UltiSnipsEditSplit = 'vertical' let g:UltiSnipsSnippetDirectories = [ expand("$XDG_CONFIG_HOME/vim/ultisnips") ] if has('fname_case') let g:UltiSnipsSnippetDirectories = ["UltiSnips", "ultisnips"] endif let g:UltiSnipsExpandTrigger = "" let g:UltiSnipsJumpForwardTrigger = "" let g:UltiSnipsJumpBackwardTrigger = "" " UltiSnips completion function that tries to expand a snippet. If there's no " snippet for expanding, it checks for completion window and if it's shown, " selects first element. If there's no completion window it tries to jump to " next placeholder. If there's no placeholder it just returns TAB key " https://github.com/Valloric/YouCompleteMe/issues/36#issuecomment-15451411 function! g:UltiSnips_Complete() call UltiSnips#ExpandSnippet() if g:ulti_expand_res == 0 if pumvisible() return "\" else call UltiSnips#JumpForwards() if g:ulti_jump_forwards_res == 0 return "\" endif endif endif return "" endfunction au InsertEnter * exec "inoremap " . g:UltiSnipsExpandTrigger . " =g:UltiSnips_Complete()" let g:UltiSnipsListSnippets="" "}}} Plug 'vim-utils/vim-man' " replaced by builtin {{{2 let g:man_width = 80 "}}} Plug 'airblade/vim-gitgutter' " replaced by gitsigns {{{ " prefer other signs such as ycm diags let g:gitgutter_sign_priority = 1 " don't clobber other signs let g:gitgutter_sign_allow_clobber = 0 "}}} Plug 'justinmk/vim-sneak' " replaced by leap {{{2 let g:sneak#streak = 1 let g:sneak#target_labels = "aoeuisnthdpylrcgfqjkxzmwvz" " dvorak let g:sneak#use_ic_scs = 1 " follow 'ignorecase' and 'smartcase' " sneaky f and t nmap f Sneak_f nmap F Sneak_F xmap f Sneak_f xmap F Sneak_F omap f Sneak_f omap F Sneak_F nmap t Sneak_t nmap T Sneak_T xmap t Sneak_t xmap T Sneak_T omap t Sneak_t omap T Sneak_T "}}} Plug 'shougo/unite.vim' " replaced by telescope {{{2 function! UniteSetup() call unite#filters#matcher_default#use(['matcher_fuzzy']) call unite#custom#profile('default', 'context', { \ 'winheight': 20, \ 'direction': 'botright' \ }) nnoremap [unite] nmap u [unite] nnoremap [unite]u :UniteResume nnoremap [u :UnitePrevious nnoremap ]u :UniteNext " unite-grep {{{3 " seems not respected let g:unite_source_grep_max_candidates = 2000 if executable('ag') " Use ag in unite grep source. let g:unite_source_grep_command = 'ag' let g:unite_source_grep_default_opts = '--smart-case --vimgrep --ignore ''.hg'' --ignore ''.svn'' --ignore ''.git'' --ignore ''.bzr''' let g:unite_source_grep_recursive_opt = '' end nnoremap [unite]a :Unite grep:.:: nnoremap [unite]A :Unite grep:.:-w: command! -nargs=+ Ag Unite grep:.:: " unite-file_rec {{{3 if executable('ag') " Use ag in unite rec source let g:unite_source_rec_async_command = ['ag', '--follow', '--nocolor', '--nogroup', '-g', ''] end nnoremap [unite]f :Unite -start-insert file_rec/async " unite-buffer {{{3 call unite#custom#default_action('buffer', 'open') nnoremap [unite]b :Unite buffer:- " unite-jumplist {{{3 nnoremap [unite]j :Unite output:jumps: " unite-menu {{{3 let g:unite_source_menu_menus = {} let g:unite_source_menu_menus.fugitive = { 'description' : 'fugitive menu'} let g:unite_source_menu_menus.fugitive.command_candidates = { \ 'Gstatus gs' : 'Gstatus', \ 'Gcommit -v gc' : 'Gcommit -v', \ 'Glog' : 'Glog', \} nnoremap gg :Unite menu:fugitive let g:unite_source_history_yank_enable = 1 nnoremap [unite]p :Unite history/yank endfunction augroup unit_setup autocmd VimEnter * ++once call UniteSetup() augroup END "}}}2 Plug 'shougo/vimproc.vim', {'do': 'make'} " {{{2 "}}}2 Plug 'tomtom/tcomment_vim' " replaced by comment.nvim {{{2 let g:tcomment_textobject_inlinecomment = 'gic' let g:tcomment#filetype#guess = 0 "let g:tcomment#options = {'whitespace' : 'no'} "}}}2 " colorschemes Plug 'morhetz/gruvbox' " {{{2 let g:gruvbox_contrast_dark = 'hard' let g:gruvbox_contrast_light = 'soft' " }}}2 " staging Plug 'puremourning/vimspector' " replaced by lsp {{{2 let g:vimspector_enable_mappings = 'HUMAN' " }}} Plug 'vim-scripts/syntaxrange' " replaced by treesitter {{{2 " }}} endif Plug 'alepez/vim-gtest' Plug 'alx741/vinfo' Plug 'andrewradev/sideways.vim' " {{{2 nnoremap ,h :SidewaysLeft:delmarks z nnoremap ,l :SidewaysRight:delmarks z "}}} Plug 'andrewradev/switch.vim' Plug 'chrisbra/checkattach' Plug 'derekwyatt/vim-fswitch' Plug 'elzr/vim-json' Plug 'firef0x/pkgbuild.vim' Plug 'junegunn/vim-easy-align' Plug 'kshenoy/vim-signature' " Plug 'majutsushi/tagbar' " TODO: delete? {{{2 " map :TagbarToggle " let g:tagbar_sort = 0 " let g:tagbar_compact = 1 " let g:tagbar_autoshowtag = 1 " let g:tagbar_width = 25 " let g:tagbar_iconchars = ['+', '-'] "}}} Plug 'octol/vim-cpp-enhanced-highlight' Plug 'sgeb/vim-diff-fold' Plug 'skywind3000/asyncrun.vim' " {{{2 command! -bang -nargs=* -complete=file Make AsyncRun -save=2 -program=make @ let g:asyncrun_open = 10 "}}} Plug 'sjl/gundo.vim' " Plug 'thinca/vim-qfreplace' " TODO: delete? Plug 'tpope/vim-abolish' Plug 'tpope/vim-characterize' " Plug 'tpope/vim-endwise' " TODO: delete? Plug 'tpope/vim-eunuch' Plug 'tpope/vim-fugitive' Plug 'tpope/vim-repeat' Plug 'tpope/vim-scriptease' Plug 'tpope/vim-speeddating' Plug 'tpope/vim-unimpaired' Plug 'tweekmonster/spellrotate.vim' " Plug 'vim-scripts/mediawiki.vim' " TODO: delete? Plug 'vim-scripts/replacewithregister' " FIXME: is overridden by lsp Plug 'wincent/loupe' " text objects Plug 'kana/vim-textobj-user' Plug 'julian/vim-textobj-variable-segment' Plug 'sgur/vim-textobj-parameter' Plug 'kana/vim-operator-user' " staging " Check LucHermites plugins: https://github.com/LucHermitte/lh-cpp Plug 'imsnif/kdl.vim' Plug 'ilyachur/cmake4vim' Plug 'ilyachur/gtest-vim' Plug 'junegunn/vim-peekaboo' "{{{2 " issue with having it at the bottom is that it doesn't leave much let g:peekaboo_window = 'bo 16new' let g:peekaboo_compact = 1 let g:peekaboo_delay = 500 "}}} " Plug 'vim-scripts/ansiesc.vim' " TODO: delete? {{{2 " nmap corwp RestoreWinPosn " nmap coswp SaveWinPosn " "}}} Plug 'neovimhaskell/haskell-vim' " {{{2 let g:haskell_enable_quantification = 1 " to enable highlighting of `forall` let g:haskell_enable_recursivedo = 1 " to enable highlighting of `mdo` and `rec` let g:haskell_enable_arrowsyntax = 1 " to enable highlighting of `proc` let g:haskell_enable_pattern_synonyms = 1 " to enable highlighting of `pattern` let g:haskell_enable_typeroles = 1 " to enable highlighting of type roles let g:haskell_enable_static_pointers = 1 " to enable highlighting of `static` let g:haskell_backpack = 1 " to enable highlighting of backpack keywords let g:haskell_indent_before_where = 2 " }}} Plug 'aklt/plantuml-syntax' Plug 'mtth/scratch.vim' " {{{2 let g:scratch_no_mappings = 1 let g:scratch_autohide = 0 "}}} " Plug 'jenterkin/vim-autosource' " TODO: delete? {{{2 " let g:autosource_hashdir = $XDG_CACHE_HOME . '/vim/vim-autosource' " let g:autosource_conf_names = ['.vimrc', '.vimrc.lua'] " "}}} call plug#end() filetype plugin indent on syntax on " colorscheme {{{1 set background=dark let &t_8f = "\[38;2;%lu;%lu;%lum" let &t_8b = "\[48;2;%lu;%lu;%lum" set termguicolors if !has('nvim') colorscheme $THEME endif "TODO see how I can integrate this into a theme that customises upstream Nord hi debugPC term=reverse ctermbg=8 " options {{{1 " moving around, searching and patterns {{{2 set incsearch " show match for partly typed search command set ignorecase " ignore case when using a search pattern set smartcase " override 'ignorecase' when pattern has upper case characters set hlsearch " highlight all matches for the last used search pattern set nostartofline " don't move the cursor to the first non-blank char of a line set path+=. set path+=include/ set path+=../include/ set path+=/usr/include/c++/* " displaying text {{{2 set nowrap " long lines wrap set linebreak " wrap long lines at a character in 'breakat' set showbreak=↪ " show these chars for wrapped lines set breakindent " preserve indentation in wrapped text set list " show chars defined in 'listchars' set listchars=tab:❭\ " list of strings used for list mode set listchars+=extends:❯,precedes:❮ set listchars+=nbsp:␣ " Only shown when not in insert mode set listchars+=trail:· augroup trailing au! au FileType qf setlocal listchars-=trail:· au InsertEnter * set listchars-=trail:· au InsertLeave * set listchars+=trail:· augroup END set scrolloff=5 " number of screen lines to show around the cursor set sidescroll=1 " number of collumns to scroll set sidescrolloff=1 " don't scroll over the listchars set display+=lastline " display as much as possible of last line set fillchars=diff:⣿,vert:│ set nonumber " show the line number for each line set norelativenumber " show the relative line number for each line " syntax, highlighting and spelling {{{2 set synmaxcol=800 " don't highlight long lines set dictionary=spell " list of dictionary files for keyword completion set colorcolumn=+1 " multiple windows {{{2 set laststatus=2 " 0, 1 or 2; when to use a status line for the last window set previewheight=20 " default height for the preview window set hidden " set splitbelow " a new window is put below of the current one set splitright " a new window is put right of the current one " terminal {{{2 set ttyfast " using the mouse {{{2 set mouse=rnv " list of flags for using the mouse if !has('nvim') set ttymouse=xterm " type of mouse endif " messages and info {{{2 set showcmd " Show (partial) command in status line. set ruler " show the cursor position all the time set confirm " Ask what to do when closing unsaved documents set shortmess+=a " all abbreviations set shortmess+=o " overwrite file-written message set shortmess+=O " file-read message overrides previous set shortmess+=t " truncate file message at start set shortmess+=T " truncate other messages in the middle set shortmess+=W " don't give 'written' or '[w]' when writing a file set shortmess+=A " ignore swapfile warning set shortmess+=I " no splash screen set shortmess+=F " don't give the file info when editing a file set shortmess+=c " don't give |ins-completion-menu| messages " editing text {{{2 set backspace=indent,eol,start " allow backspacing over everything in insert mode set showmatch " Show matching brackets. set nojoinspaces " don't use two spaces after '.' when joining a line set formatoptions+=j " Delete comment leader when joining lines set formatoptions+=c " Autowrap comments using textwidth set formatoptions+=r " Insert comment leader after hitting set formatoptions+=n " Recognize numbered lists set formatoptions+=q " Allow formatting of comments with "gq". set formatoptions+=l " do not wrap lines that have been longer when starting insert mode already set formatoptions+=t " Auto-wrap text using textwidth set formatoptions-=o " Do not insert comment leader after hitting o or O in normal mode set nrformats-=octal " don't inc/dec octal numbers with ^[AX] set nrformats+=unsigned " treat all numbers as unsigned set complete=. " scan the current buffer ( 'wrapscan' is ignored) set complete+=w " scan buffers from other windows set complete+=b " scan other loaded buffers that are in the buffer list set complete+=u " scan the unloaded buffers that are in the buffer list set complete+=t " scan tags set complete+=i " scan current and included files set complete+=kspell " use the currently active spell checking |spell| " whether to use a popup menu for Insert mode completion set completeopt=longest,menuone,preview " tabs and indent {{{2 set shiftwidth=4 " number of spaces used for each step of (auto)indent set smarttab " a in an indent inserts 'shiftwidth' spaces set softtabstop=4 " if non-zero, number of spaces to insert for a set shiftround " round to 'shiftwidth' for "<<" and ">>" set expandtab " expand to spaces in Insert mode set autoindent set pastetoggle= " key sequence to toggle paste mode " folding {{{2 set foldmethod=marker " folding type set foldlevelstart=0 " value for 'foldlevel' when starting to edit a file " open folds when jumping to line set foldopen+=jump set viewoptions=cursor " save cursor position set viewoptions+=folds " save folds " diff mode {{{2 set diffopt+=filler " show filler lines set diffopt+=vertical " always vertical split set diffopt+=context:10 " 10 lines context between changes set diffopt+=internal set diffopt+=algorithm:patience " reading and writing files {{{2 set modeline " read modelines set modelines=2 " only check first/last 2 lines set writebackup " write a backup file before overwriting a file set backup " keep a backup after owerwriting a file set backupdir=$XDG_CACHE_HOME/vim/backup// set backupskip+=.netrc " skip netrc set backupskip+=/dev/shm/pass* " skip passwordstore files set undofile " persistent undo history set undolevels=10000 " moar undos if !has('nvim') set undodir=$XDG_CACHE_HOME/vim/undo// endif augroup undoskip au! au BufWritePre .netrc setlocal noundofile au BufWritePre /dev/shm/pass* setlocal noundofile au BufWritePre /tmp/* setlocal noundofile augroup END set autowrite " automatically write a file when leaving a modified buffer set autoread " automatically read a file that has been modified " the swap file {{{2 set noswapfile set directory=$XDG_CACHE_HOME/vim/swap// " command line editing {{{2 set history=5000 " how many command lines are remembered set wildmenu " command-line completion shows a list of matches set wildmode=longest:full,full " specifies how command line completion works set wildignorecase " ignore case when completing file names set wildignore+=.hg,.git,.svn " Version control set wildignore+=*.aux,*.out,*.toc " LaTeX intermediate files set wildignore+=*.jpg,*.bmp,*.gif,*.png,*.jpeg " binary images set wildignore+=*.o,*.obj,*.exe,*.dll,*.manifest " compiled object files set wildignore+=*.spl " compiled spelling word lists set wildignore+=*.sw? " Vim swap files set wildignore+=*.luac " Lua byte code set wildignore+=*.pyc " Python byte code set wildignore+=*.orig " Merge resolution files " running make and jumping to errors {{{2 set makeprg=make\ -w " print changing directories set grepformat=%f:%l:%c:%m set grepprg=ag\ --vimgrep\ $* " language specific {{{2 set isfname-== " don't treat `=` as being part of filenames " various {{{2 set virtualedit+=block " let cursor move past last char in mode set virtualedit+=onemore " allow the cursor to move just past the end of the line if !has('nvim') " viminfo defaults but save file in .cache set viminfo='100,<50,s10,h,n$XDG_CACHE_HOME/vim/viminfo else " shada is the replacement format for viminfo " this setting is probably not needed as it's most likely the default " the default path is in XDG_DATA_HOME, which is fine set shada='100,<50,s10,h endif set viewdir=$XDG_CACHE_HOME/vim/view// set sessionoptions+=unix,slash " damn windows and it's silly ways " autocmds {{{1 " Resize splits when the window is resized {{{2 augroup resize_splits au! autocmd VimResized * :tabdo wincmd = augroup END " Only show cursorline in the current window and in normal mode {{{2 augroup cline au! au WinLeave,InsertEnter * set nocursorline au WinEnter,InsertLeave * set cursorline augroup END " Treat buffers from stdin (e.g.: echo foo | vim -) as scratch {{{2 augroup ft_stdin au! au StdinReadPost * :set buftype=nofile augroup END " Jump to last known cursor position {{{2 augroup last_loc au! " blacklist certain filetype let blacklist = ['gitcommit'] autocmd BufReadPost * \ if index(blacklist, &ft) < 0 && line("'\"") > 1 && line("'\"") <= line("$") | \ exe "normal! g`\"" | \ endif augroup END " Check for file modifications automatically {{{2 " (current buffer only) " Use :NoAutoChecktime to disable it (uses b:autochecktime) fun! MyAutoCheckTime() " only check timestamp for normal files if &buftype != '' | return | endif if ! exists('b:autochecktime') || b:autochecktime checktime % let b:autochecktime = 1 endif endfun augroup MyAutoChecktime au! au FocusGained,BufEnter,CursorHold,InsertEnter * call MyAutoCheckTime() augroup END command! NoAutoChecktime let b:autochecktime=0 command! ToggleAutoChecktime let b:autochecktime=!get(b:, 'autochecktime', 0) | echom "b:autochecktime:" b:autochecktime " bindings {{{1 " make function! MakeWithOpt() " TODO only do this if makeprg matches make " if &makeprg =~ "make" let l:make_dir = "" if exists("b:make_dir") let l:make_dir = "-C ".b:make_dir elseif exists("t:make_dir") let l:make_dir = "-C ".t:make_dir elseif exists("g:make_dir") let l:make_dir = "-C ".g:make_dir endif let l:make_targets = "" if exists("g:make_targets") let l:make_targets = g:make_targets endif execute "Make ".l:make_dir." ".l:make_targets endf nnoremap r :call MakeWithOpt() " unhighlight search nnoremap / :silent nohl " Tabs nnoremap [ :tabprev nnoremap ] :tabnext " paste from selection nnoremap p* :silent! set paste"*p:set nopaste " paste from clipboard nnoremap p+ :silent! set paste"+p:set nopaste " strip trailing whitespace function! StripWhitespace(line1, line2, ...) " {{{2 let s_report = &report let &report=0 let pattern = a:0 ? a:1 : '\s\+$' let oldview = winsaveview() exe 'keepjumps keeppatterns '.a:line1.','.a:line2.'substitute/'.pattern.'//e' if oldview != winsaveview() redraw endif call winrestview(oldview) let &report = s_report endfunction " }}}2 command! -range=% -nargs=0 -bar Untrail keepjumps call StripWhitespace(,) nnoremap ww :Untrail " Source vnoremap S y:execute @@:echo 'Sourced selection.' nnoremap S ^vg_y:execute @@:echo 'Sourced line.' " jump to last cursor position noremap ' ` " Select (charwise) the contents of the current line, excluding indentation. nnoremap vv ^vg_ " Unfuck my screen nnoremap U \ :syntax sync fromstart \ :AirlineRefresh \ :call popup_clear(1) \ :redraw! " Ranger " nnoremap r :silent !ranger %:h:redraw! " nnoremap R :silent !ranger:redraw! " display the number of matches for the last search nmap # :%s:/::gn " center cursor after search and open folds nnoremap n nzzzv nnoremap N Nzzzv " same when jumping around nnoremap g; g;zzzv nnoremap g, g,zzzv nnoremap zzzv nnoremap zzzv " Not using the default mappings of 'To line from top/bottom' noremap H ^ noremap L $ vnoremap H ^ vnoremap L g_ " Heresy, emacs insert bindings inoremap I inoremap A cnoremap cnoremap " proper movement when lines are wrapped noremap j (v:count == 0 ? 'gj' : 'j') noremap k (v:count == 0 ? 'gk' : 'k') " disable arrows noremap noremap noremap noremap inoremap inoremap inoremap inoremap cnoremap cnoremap cnoremap cnoremap cnoremap cnoremap cnoremap cnoremap " close all folds open fold in cursor nnoremap zx zMzxzt map :ls:b " move between windows (skip previewwindow) nnoremap w:if &previewwindow \| wincmd w \| endif nnoremap W:if &previewwindow \| wincmd W \| endif tnoremap w:if &previewwindow \| wincmd w \| endif tnoremap W:if &previewwindow \| wincmd W \| endif "xterm mouse with middleclick paste nnoremap i vnoremap s " fix legacy vi inconsistency nnoremap Y y$ " copy to clipboard xnoremap Y "+y " allow repeat operator on visual vnoremap . :normal . " add line without changing position or leaving mode noremap o :set pastem`o``:set nopaste noremap O :set pastem`O``:set nopaste " Don't use Ex mode, use Q for formatting map Q gq " break undo sequence before removing word inoremap u nnoremap coe :set =&expandtab ? 'noexpandtab' : 'expandtab' nnoremap [oe :set expandtab nnoremap ]oe :set noexpandtab for idt in range(1,8) exe 'nnoremap co'.idt.' :setlocal tabstop='.idt.' shiftwidth='.idt.' softtabstop='.idt.'' endfor " toggle auto format of text nnoremap coa :set =&formatoptions =~ "a" ? 'formatoptions-=a' : 'formatoptions+=a' nnoremap [oa :set formatoptions+=a nnoremap ]oa :set formatoptions-=a " space will toggle current fold in normal mode nnoremap za " create folds around visual selection vnoremap zf " save with sudo cabbrev w!! SudoWrite " uppercase previous word inoremap ugUiwgi " http://git.io/v3ZeU nmap qq :echo "hi<" . synIDattr(synID(line("."),col("."),1),"name") . '> trans<' . synIDattr(synID(line("."),col("."),0),"name") . "> lo<" . synIDattr(synIDtrans(synID(line("."),col("."),1)),"name") . ">" " plugins options {{{1 " checkattach {{{2 let g:checkattach_filebrowser = 'ranger' let g:checkattach_once = 'y' " close-another-window {{{2 nnoremap c nnoremap cc c nnoremap ch :CloseLeftWindow nnoremap cl :CloseRightWindow nnoremap cj :CloseBelowWindow nnoremap ck :CloseAboveWindow " fswitch {{{2 nnoremap ff :FSHere nnoremap fl :FSRight nnoremap fh :FSLeft nnoremap fj :FSBelow nnoremap fk :FSAbove nnoremap fL :FSSplitRight nnoremap fH :FSSplitLeft nnoremap fJ :FSSplitBelow nnoremap fK :FSSplitAbove " fugitive {{{2 nmap dd :tab split \| Gdiff \| wincmd h " delete fugitive buffers when closed autocmd BufReadPost fugitive://* set bufhidden=delete function! GitToggle() let l:status_buffer = bufname('^fugitive:///*/.git{/worktrees/*,}//$') if buflisted(l:status_buffer) execute 'bdelete '.l:status_buffer else execute 'Git' if !empty(FugitiveGitDir()) " only resize status if Git was sucessful 16wincmd_ endif endif endfunction command! GitToggle :call GitToggle() command! GToggle GitToggle nnoremap gs :GitToggle nnoremap gd :Gdiffsplit nnoremap gc :echohl WarningMsg \| echo "use \gcc instead" \| echohl None nnoremap gcc :tab G commit -v nnoremap gca :tab G commit -v --amend nnoremap gcf :tab G commit -v --fixup= nnoremap gp :echohl WarningMsg \| echo "use \gpp instead" \| echohl None nnoremap gpp :Git push \| copen nnoremap gpf :Git push --force-with-lease \| copen nnoremap gll :Git pull nnoremap gru :Git rebase --interactive @{upstream} nnoremap grp :Git rebase --interactive @{push} nnoremap ga :Gwrite nnoremap gb :G blame augroup fugitive_gstatus au! autocmd User FugitiveIndex setlocal winfixheight autocmd User FugitiveIndex nmap = augroup end " Gundo {{{2 nnoremap :GundoToggle let g:gundo_prefer_python3 = 1 " indent-guides {{{2 let g:indent_guides_default_mapping = 0 let g:indent_guides_guide_size = 1 nmap cog IndentGuidesToggle nmap [og IndentGuidesEnable nmap ]og IndentGuidesDisable " signature {{{2 " disable '[ mappings let g:SignatureMap = { \ 'GotoNextLineAlpha' : "", \ 'GotoPrevLineAlpha' : "", \ 'GotoNextSpotAlpha' : "", \ 'GotoPrevSpotAlpha' : "", \ } " switch let g:switch_mapping = "s" let g:switch_custom_definitions = [ \ ['yes', 'no'] \ ] " spellrotate nmap z] (SpellRotateForward) nmap z[ (SpellRotateBackward) vmap z] (SpellRotateForwardV) vmap z[ (SpellRotateBackwardV) " synastic {{{2 let g:syntastic_enable_highlighting = 0 let g:syntastic_error_symbol='E' let g:syntastic_style_error_symbol='S' let g:syntastic_warning_symbol='W' let g:syntastic_style_warning_symbol='S' let g:syntastic_always_populate_loc_list=1 nmap y :SyntasticCheck let g:syntastic_cpp_clang_tidy_post_args = "-p build*" if ! &diff let g:syntastic_check_on_open=1 endif " vim-easy-align {{{2 " start interactive EasyAlign in visual mode vmap :echohl WarningMsg \| echo "EasyAlign mapped to a now" \| echohl None vmap a (EasyAlign) nmap a (EasyAlign) " vim-gtest {{{2 let g:gtest#highlight_failing_tests = 0 nnoremap tt :GTestRun nnoremap tc :GTestCase nnoremap tn :GTestName nnoremap ta :GTestCase *:GTestName *:GTestRun nnoremap tu :GTestRunUnderCursor " vim-json {{{2 let g:vim_json_syntax_conceal = 0 " functions {{{1 " Convenient command to see the difference between the current buffer and the " file it was loaded from, thus the changes you made. " Only define it when not defined already. if !exists(":DiffOrig") command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis \ | wincmd p | diffthis endif " sort operator {{{2 function! SortLinesOpFunc(...) '[,']sort endfunction nnoremap gs :set operatorfunc=SortLinesOpFuncg@ vnoremap gs :sort " edit configs {{{2 " TODO: populate location list with both .vim and .lua files " TODO: create file if it doesn't exist in nvim or vim rtps function! EditConfig(what, ext = '.vim') if a:what == 'vimrc' || a:what == 'init.lua' let l:file = a:what elseif empty(&filetype) echoe 'filetype is empty!' return else let l:file = a:what.'/'.&filetype.a:ext endif execute ':Vvsplit! '.file endf nmap en :call EditConfig('init.lua') nmap ev :call EditConfig('vimrc') nmap ef :call EditConfig('ftplugin') nmap es :call EditConfig('syntax') nmap ei :call EditConfig('indent') nmap eu :call EditConfig('ultisnips', '.snippets') " spell check {{{2 " http://tex.stackexchange.com/a/52932 let g:myLangList=["en_gb","en_us","de","fr"] function! ToggleSpell() if !exists("b:myLang") let b:myLang=0 endif execute "setlocal spell!" if (&spell) echo "setlocal spelllang=" g:myLangList[b:myLang] endif endfunction function! SwitchSpell() if !exists("b:myLang") let b:myLang=0 endif if (&spell) let b:myLang=b:myLang+1 if b:myLang>=len(g:myLangList) | let b:myLang=0 | endif endif execute "setlocal spell spelllang=".get(g:myLangList, b:myLang) echo "setlocal spelllang=" g:myLangList[b:myLang] endfunction nnoremap coS :call SwitchSpell() " gitdir or home {{{2 " from derek wyatt: " http://git.io/v3GAV function! FindGitDirOrHome() let filedir = expand('%:p:h') if isdirectory(filedir) let cmd = 'bash -c "(cd ' . filedir . '; git rev-parse --show-toplevel 2>/dev/null)"' let gitdir = system(cmd) if strlen(gitdir) == 0 return '~' else return gitdir[:-2] endif else return '~' endif endfunction command! Cd cd %:h command! Cdr execute('cd ' . FindGitDirOrHome()) command! LCd lcd %:h command! LCdr execute('lcd ' . FindGitDirOrHome()) " vim:set et sw=2 ts=2 tw=78: