X-Git-Url: https://git.rmz.io/dotfiles.git/blobdiff_plain/3b988e89bbc4154850b407f159b903a1e2835753..c6a94b49c00ea320c67909cbe0d2df2f95d4fbb9:/vim/vimrc?ds=sidebyside diff --git a/vim/vimrc b/vim/vimrc index c52eb6b..c8829a3 100644 --- a/vim/vimrc +++ b/vim/vimrc @@ -1,251 +1,619 @@ -" My vimrc file. +" My vimrc. " " Author: Samir Benmendil " -" use xdg -set runtimepath=$XDG_CONFIG_HOME/vim,$VIMRUNTIME,$XDG_CONFIG_HOME/vim/after - -filetype off -set rtp+=$XDG_DATA_HOME/vim/vundle -call vundle#rc('$XDG_DATA_HOME/vim') - -Bundle 'gmarik/vundle' -Bundle 'wincent/Command-T' -Bundle 'bling/vim-airline' -Bundle 'ctrlp.vim' -Bundle 'fugitive.vim' -Bundle 'Gundo' -Bundle 'The-NERD-tree' -Bundle 'surround.vim' -Bundle 'Syntastic' -Bundle 'Tagbar' -Bundle 'tComment' -Bundle 'Valloric/YouCompleteMe' -Bundle 'elzr/vim-json' +" runtimepath {{{1 +set runtimepath ^=$XDG_CONFIG_HOME/vim +set runtimepath +=$XDG_CONFIG_HOME/vim/after + +" force python3 +if has('python3') | endif + +" plugins {{{1 +" remove all autocommands +autocmd! + +call plug#begin('$XDG_DATA_HOME/vim') +" This does not update vim-plug, use PlugUpgrade instead +Plug 'junegunn/vim-plug' + +Plug 'airblade/vim-gitgutter' +Plug 'alepez/vim-gtest' +Plug 'alx741/vinfo' +Plug 'andrewradev/switch.vim' +Plug 'bling/vim-airline' +Plug 'chrisbra/checkattach' +Plug 'derekwyatt/vim-fswitch' +Plug 'elzr/vim-json' +Plug 'firef0x/pkgbuild.vim' +Plug 'junegunn/vim-easy-align' +Plug 'justinmk/vim-sneak' +Plug 'klen/python-mode' +Plug 'kshenoy/vim-signature' +Plug 'majutsushi/tagbar' +Plug 'octol/vim-cpp-enhanced-highlight' +Plug 'raimondi/delimitmate' +Plug 'vimwiki/vimwiki', { 'branch': 'dev' } +" Plug 'scrooloose/syntastic' +Plug 'sgeb/vim-diff-fold' +Plug 'shougo/unite.vim' +Plug 'shougo/vimproc.vim', {'do': 'make'} +Plug 'sjl/gundo.vim' +Plug 'thinca/vim-qfreplace' +Plug 'tomtom/tcomment_vim' +Plug 'tpope/vim-abolish' +Plug 'tpope/vim-endwise' +Plug 'tpope/vim-eunuch' +Plug 'tpope/vim-fugitive' +Plug 'tpope/vim-repeat' +Plug 'tpope/vim-scriptease' +Plug 'tpope/vim-speeddating' +Plug 'tpope/vim-surround' "investigate vim-sandwich +Plug 'tpope/vim-unimpaired' +Plug 'tweekmonster/spellrotate.vim' +Plug 'valloric/youcompleteme', { 'do': './install.py --clangd-completer --clang-completer' } +Plug 'vim-scripts/mediawiki.vim' +Plug 'vim-scripts/replacewithregister' +Plug 'vim-scripts/yankring.vim' +Plug 'wincent/loupe' + +" colorschemes +Plug 'morhetz/gruvbox' + +" snippets +Plug 'sirver/ultisnips' +Plug 'honza/vim-snippets' + +" 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 'dense-analysis/ale' " {{{2 +let g:ale_echo_msg_format = '[%linter%] %code: %%s' +let g:ale_c_parse_compile_commands = 1 +let g:ale_cpp_parse_compile_commands = 1 +" don't use loclist as it's being populated by ycm +" (might want to enable for other filetypes) +let g:ale_set_loclist = 0 +let g:ale_cpp_gcc_options = '' +let g:ale_linters_ignore = { 'cpp': ['clangd', 'clangtidy', 'clang'] } + +Plug 'git@github.com:/ram-z/vim-orgmode', { 'branch': 'dev' } " {{{2 +Plug 'vim-scripts/syntaxrange' + +let g:org_agenda_files = ['~/org/*.org'] + +call plug#end() filetype plugin indent on -" moving around, searching and patterns {{{1 +" colorscheme {{{1 +syntax on +set background=dark +let g:gruvbox_contrast_dark = 'hard' +let g:gruvbox_contrast_light = 'soft' +colorscheme gruvbox +" override the background to be black +highligh Normal ctermbg=None + +" 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 - -" use leader-n to unhighlight search -nmap n :silent nohl -" use leader-# to display the number of matches for the last search -nmap # :%s:/::gn -" center cursor after search -nnoremap n nzz -" disable arrows -inoremap -inoremap -inoremap -inoremap -noremap -noremap -noremap -noremap +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=.,** " current + subdirectory search for :find, :grep:, ... +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 {{{1 -set scrolloff=5 " number of screen lines to show around the cursor -set wrap " long lines wrap +" 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 showbreak=↪ " show these chars for wrapped lines +set breakindent " preserve indentation in wrapped text set lazyredraw " don't redraw while executing macros set list " show chars defined in 'listchars' -set listchars=tab:»·,trail:· " list of strings used for list mode - -set number " show the line number for each line -set relativenumber " show the relative line number for each line -" toggle relativenumber -nnoremap u :exe "set relativenumber!" - -if has("autocmd") - " When editing a file, always jump to the last known cursor position. - " Don't do it when the position is invalid or when inside an event handler - " (happens when dropping a file on gvim). - " Also don't do it when the mark is in the first line, that is the default - " position when opening a file. - " blacklist certain filetype, you can get a file type with :echo &ft - let blacklist = ['gitcommit'] - autocmd BufReadPost * - \ if index(blacklist, &ft) < 0 && line("'\"") > 1 && line("'\"") <= line("$") | - \ exe "normal! g`\"" | - \ endif -endif +set listchars=tab:❭\ " list of strings used for list mode +set listchars+=extends:❯,precedes:❮ +" Only shown when not in insert mode +set listchars+=trail:· +augroup trailing + au! + 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 -" syntax, highlighting and spelling {{{1 -set background=dark " Dark background, d'uh! -syntax on +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 spelllang=en,de,fr " list of accepted languages set dictionary=spell " list of dictionary files for keyword completion -" toggle spell-checking -map :set nospell!:set nospell? -if has("autocmd") - au Filetype * - \ if &omnifunc == "" | setl omnifunc=syntaxcomplete#Complete | endif -endif +set colorcolumn=+1 -" multiple windows {{{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 splitright " a new window is put right of the current one +set hidden -nmap j -nmap k -nmap h -nmap l +" set splitbelow " a new window is put below of the current one +set splitright " a new window is put right of the current one -map :ls:b +" terminal {{{2 +set ttyfast -" using the mouse {{{1 +" using the mouse {{{2 set mouse=rnv " list of flags for using the mouse set ttymouse=xterm " type of mouse -"xterm mouse with middleclick paste -nnoremap i -vnoremap s - -" messages and info {{{1 -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 - -" editing text {{{1 +" 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= " reset option +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 + +" 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 " remove comment leader when joining lines +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=hex " number formats recognized for CTRL-A and CTRL-X commands +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 -" Indent if we're at the beginning of a line. Else, do completion. -function! InsertTabWrapper() - let col = col('.') - 1 - if !col || getline('.')[col - 1] !~ '\k' - return "\" - else - return "\" -endif -endfunction -inoremap =InsertTabWrapper() -inoremap - -" fix legacy vi inconsistency -map Y y$ - -" allow repeat operator on visual -vnoremap . :normal . - -" add line without changing position or leaving mode -map o :set pastem`o``:set nopaste -map O :set pastem`O``:set nopaste - -" Don't use Ex mode, use Q for formatting -map Q gq - -" allow undoing in insert-mode -inoremap u -inoremap u - -" tabs and indent {{{1 +" 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 cindent " use smart C indenting (see :h C-indenting) -set cinoptions=l1,c4,(0,U1,w1,m1,j1,J1 +set autoindent set pastetoggle= " key sequence to toggle paste mode -nmap b :set expandtab tabstop=4 shiftwidth=4 softtabstop=4 -nmap B :set expandtab tabstop=8 shiftwidth=8 softtabstop=4 -nmap M :set noexpandtab tabstop=8 softtabstop=4 shiftwidth=4 -nmap m :set expandtab tabstop=2 shiftwidth=2 softtabstop=2 - -" folding {{{1 +" folding {{{2 set foldmethod=marker " folding type -set foldlevelstart=99 " value for 'foldlevel' when starting to edit a file +set foldlevelstart=0 " value for 'foldlevel' when starting to edit a file -" space will toggle current fold in normal mode -nnoremap @=(foldlevel('.')?'za':"\") -" create folds around visual selection -vnoremap zf +" open folds when jumping to line +set foldopen+=jump + +set viewoptions=cursor " save cursor position +set viewoptions+=folds " save folds -" save and restore folds -autocmd BufWinLeave *.* mkview -autocmd BufWinEnter *.* silent loadview +" diff mode {{{2 +set diffopt+=filler " show filler lines +set diffopt+=vertical " always vertical split +set diffopt+=context:10 " 10 lines context between changes + +" reading and writing files {{{2 +set modeline " read modelines +set modelines=2 " only check first/last 2 lines -" reading and writing files {{{1 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 +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 undodir=$XDG_CACHE_HOME/vim +set undodir=$XDG_CACHE_HOME/vim/undo// -set autowrite " automatically write a file when leaving a modified buffer +augroup undoskip + au! + au BufWritePre .netrc setlocal noundofile + au BufWritePre /dev/shm/pass* setlocal noundofile + au BufWritePre /tmp/* setlocal noundofile +augroup END -" save with sudo -cmap w!! w !sudo tee % > /dev/null +set autowrite " automatically write a file when leaving a modified buffer +set autoread " automatically read a file that has been modified -" the swap file {{{1 -set directory=$XDG_CACHE_HOME/vim,.,/var/tmp +" the swap file {{{2 +set noswapfile +set directory=$XDG_CACHE_HOME/vim/swap// -" command line editing {{{1 -set history=500 " how many command lines are remembered -set wildmode=longest:full " specifies how command line completion works +" 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 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 +set viminfo='100,<50,s10,h,n$XDG_CACHE_HOME/vim/viminfo " viminfo defaults but save file in .cache + +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 + au! + autocmd VimResized * :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 cursor_pos + 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 + +augroup terminal + au! + au TerminalOpen * if &buftype == 'terminal' | setlocal bufhidden=hide | endif +augroup END + +" bindings {{{1 + +" allow both and \ to be +map + +" make +function! Make() + let l:make_dir = "" + if exists("b:make_dir") + let l:make_dir = "-C ".b: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 Make() + +" 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:redraw! + +" Ranger +" nnoremap r :silent !ranger %:h:redraw! +" nnoremap R :silent !ranger:redraw! + +" Use sane regexes. +nnoremap / /\v +vnoremap / /\v +cnoremap s/ s/\v + +" display the number of matches for the last search +nmap # :%s:/::gn -" various {{{1 -set virtualedit=block " let cursor move past last char in mode -set viminfo='100,<50,s10,h,n$XDG_CACHE_HOME/vim/viminfo " viminfo defaults but save file in .vim +" center cursor after search and open folds +nnoremap n nzzzv +nnoremap N Nzzzv -set viewdir=$XDG_CACHE_HOME/vim +" same when jumping around +nnoremap g; g;zzzv +nnoremap g, g,zzzv +nnoremap zzzv +nnoremap zzzv -" plugins {{{1 +" 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 gUiwgi + +" 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 " airline {{{2 -let g:airline_detect_whitespace=2 -let g:airline_whitespace_symbol = 'Ξ' -let g:airline_linecolumn_prefix = '␊ ' -let g:airline_left_sep = '▶' -let g:airline_right_sep = '◀' +let g:airline#extensions#whitespace#enabled = 1 let g:airline#extensions#tabline#enabled = 1 +let g:airline_powerline_fonts = 1 + +" checkattach {{{2 +let g:checkattach_filebrowser = 'ranger' +let g:checkattach_once = 'y' + +" delimitmate {{{2 +let delimitMate_expand_cr = 2 +let g:delimitMate_expand_space = 1 + +" 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 -" Gundo {{{2 -nnoremap :GundoToggle " fugitive {{{2 nmap dd :tab split \| Gdiff \| wincmd h +" delete fugitive buffers when closed +autocmd BufReadPost fugitive://* set bufhidden=delete + +nnoremap gs :Gstatus +nnoremap gd :Gdiff +nnoremap gc :Gcommit -v +nnoremap ga :Gwrite +nnoremap gb :Gblame + +augroup fugitive_gstatus + au! + autocmd BufWinEnter */.git/index resize 16 +augroup end + +" Gundo {{{2 +nnoremap :GundoToggle -" NERDTree {{{2 -" open/close NERDTree with \e -nmap e :NERDTreeToggle -nmap :NERDTreeToggle -" to open files/dirs -let NERDTreeMapActivateNode='' -" open NERDTree if no files were selected -autocmd vimenter * if !argc() | NERDTree | endif -" close vim if only NERDTree is open -autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif +" 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 + +" close-another-window {{{2 +nnoremap c +nnoremap cc c +nnoremap ch :CloseLeftWindow +nnoremap cl :CloseRightWindow +nnoremap cj :CloseBelowWindow +nnoremap ck :CloseAboveWindow + +" python-mode {{{2 + +let g:pymode_rope_completion = 0 +let g:pymode_rope = 0 +let g:pymode_run = 0 +let g:pymode_folding = 1 +let g:pymode_lint_ignore = "E221,E266,E501" +let g:pymode_lint_cwindow = 0 " don't open cwindow when linting +let g:pymode_syntax_space_errors = 0 " don't bother me when I'm typing + +" signature {{{2 +" disable '[ mappings + +let g:SignatureMap = { + \ 'GotoNextLineAlpha' : "", + \ 'GotoPrevLineAlpha' : "", + \ 'GotoNextSpotAlpha' : "", + \ 'GotoPrevSpotAlpha' : "", + \ } + +" switch +let g:switch_mapping = "s" + +" spellrotate +nmap z] (SpellRotateForward) +nmap z[ (SpellRotateBackward) +vmap z] (SpellRotateForwardV) +vmap z[ (SpellRotateBackwardV) " synastic {{{2 let g:syntastic_enable_highlighting = 0 @@ -256,8 +624,10 @@ 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 + let g:syntastic_check_on_open=1 endif " tagbar {{{2 @@ -268,13 +638,161 @@ let g:tagbar_autoshowtag = 1 let g:tagbar_width = 25 let g:tagbar_iconchars = ['+', '-'] -" YouCompleteMe {{{2 -let g:ycm_extra_conf_globlist = ['/mnt/data/src/*'] +" tcomments {{{2 +let g:tcomment_textobject_inlinecomment = 'gic' +let g:tcomment#filetype#guess = 0 + +" ultisnips {{{2 +let g:UltiSnipsEditSplit = 'vertical' +let g:UltiSnipsSnippetsDir = 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="" + +" unite {{{2 +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=1 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 +call unite#custom#source('file_rec/async', 'sorters', 'sorter_selecta') + +" 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 + +" yankring {{{2 +nnoremap p :YRShow +let g:yankring_history_dir = expand('$XDG_CACHE_HOME/vim') +let g:yankring_replace_n_pkey = '' +let g:yankring_replace_n_nkey = '' + +" map Y to y$ for the yank ring +function! YRRunAfterMaps() + nnoremap Y :YRYankCount 'y$' +endfunction + +" youcompleteme {{{2 +let g:ycm_clangd_binary_path = 'clangd' " use clangd in path +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 + +" vim-easy-align {{{2 +" start interactive EasyAlign in visual mode +vmap (EasyAlign) +nmap ga (EasyAlign) + +" vim-gtest {{{2 +let g:gtest#highlight_failing_tests = 0 + +nnoremap tt :GTestRun +nnoremap ta :GTestCase *:GTestName *:GTestRun +nnoremap tu :GTestRunUnderCursor " vim-json {{{2 let g:vim_json_syntax_conceal = 0 +" vim-sneak {{{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 + +" vimviki {{{2 +let g:vimwiki_list = [{'path': '$XDG_DATA_HOME/vimwiki'}] +let g:vimwiki_auto_chdir = 1 +augroup myvimwiki + au! BufRead $XDG_DATA_HOME/vimwiki/index.wiki !git -C "%:p:h" pull -q + au! BufRead,BufNewFile $XDG_DATA_HOME/vimwiki/diary/*.wiki !git -C "%:p:h" pull -q + au! BufWritePost $XDG_DATA_HOME/vimwiki/*.wiki exe '!git add "";git commit -qm"' . strftime("%FT%R") . '";git push -q' +augroup END + " 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. @@ -282,3 +800,86 @@ 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 +function! EditConfig(what, ext = '.vim') + let l:dir = split(&runtimepath,',')[0] + if a:what == 'vimrc' + let l:file = expand($MYVIMRC) + elseif ! isdirectory(globpath(l:dir, a:what)) + echoe a:what." is not valid!" + elseif empty(&filetype) + echoe 'filetype is empty!' + else + let l:file = l:dir.'/'.a:what.'/'.&filetype.a:ext + endif + + execute ':vsplit '.file + execute ':lcd %:p:h' +endf +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() +" fix spelling with first choice +nnoremap f 1z= + +" 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: