X-Git-Url: https://git.rmz.io/dotfiles.git/blobdiff_plain/fe561a9969e304f16698d6b7fe2c2520256321f1..4322868924b51e28d1e5d0cd48043a09bee6b60e:/vimrc diff --git a/vimrc b/vimrc index 5ed5e5b..a9040f1 100644 --- a/vimrc +++ b/vimrc @@ -1,160 +1,251 @@ " My vimrc file. " -" Maintainer: Samir Benmendil +" Author: Samir Benmendil " -if v:progname =~? "evim" - finish -endif - -" Use Vim settings, rather than Vi settings (much better!). -" This must be first, because it changes other options as a side effect. -set nocompatible +filetype plugin indent on " pathogen.vim runtime path manipulation silent! call pathogen#infect() -" search {{{ -set incsearch -set ignorecase -set smartcase -set hlsearch -nmap q :nohl -" }}} +" moving around, searching and patterns {{{1 +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 nostartofline " don't move the cursor to the first non-blank char of a line +set path=.,** " current + subdirectory search for :find, :grep:, ... + +" displaying text {{{1 +set scrolloff=5 " number of screen lines to show around the cursor +set wrap " long lines wrap +set linebreak " wrap long lines at a character in 'breakat' +set showbreak=▒▒ " show these chars for wrapped lines + +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!" -" NERDTree {{{ -" open/close NERDTree with \e -nmap e :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 -" }}} +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 -" airline {{{ -let g:airline#extensions#tabline#enabled = 1 -" }}} - -" tabbing {{{ -: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 -" }}} - -" backup {{{ -if has("vms") - set nobackup " do not keep a backup file, use versions instead -else - set backup " keep a backup file - set backupdir=$HOME/.vim/backupdir + +" syntax, highlighting and spelling {{{1 +set background=dark " Dark background, d'uh! +syntax on + +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 -" }}} - -" appearance {{{ -set background=dark " Dark background, d'uh! -set number " show some linenumbers -set showmatch " Show matching brackets. -set showbreak=▒▒ " show these chars for wrapped lines -set list listchars=tab:»·,trail:· " show these chars for tabs and trailing spaces -" }}} - -" misc options {{{ -set history=500 " keep 500 lines of command line history -set ruler " show the cursor position all the time -set confirm " Ask what to do when closing unsaved documents -set showcmd " Show (partial) command in status line. -set autowrite " Automatically save before commands like :next and :make -"set hidden " Hide buffers when they are abandoned -set splitright " split right when using :vsp -set scrolloff=5 " keep at least n lines above/below -set backspace=indent,eol,start " allow backspacing over everything in insert mode -set viminfo='100,<50,s10,h,n~/.vim/viminfo " viminfo defaults but save file in .vim -" }}} +" multiple windows {{{1 +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 + +nmap j +nmap k +nmap h +nmap l + +map :ls:b + +" using the mouse {{{1 +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 +set backspace=indent,eol,start " allow backspacing over everything in insert mode -" tabs {{{ -set softtabstop=4 -set shiftwidth=4 -set expandtab -" }}} +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 nrformats=hex " number formats recognized for CTRL-A and CTRL-X commands + +" 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 -" misc bindings {{{ " Don't use Ex mode, use Q for formatting map Q gq -" CTRL-U in insert mode deletes a lot. Use CTRL-G u to first break undo, -" so that you can undo CTRL-U after inserting a line break. +" allow undoing in insert-mode inoremap u +inoremap u -" Press `` to toggle insert and replace mode (no key on Mac keyboard) -imap `` -" }}} - -" paste toggle {{{ -nmap :set paste! paste? -imap :set paste! -vmap :set paste!gv -set pastetoggle= -" }}} - -" mouse {{{ -" In many terminal emulators the mouse works just fine, thus enable it. -if has('mouse') - "xterm mouse with middleclick paste - nnoremap i - vnoremap s - set mouse=rnv - "choose either one - set ttymouse=xterm - "set ttymouse=xterm2 -endif -" }}} +" tabs and indent {{{1 +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 -" syntax {{{ -" Switch syntax highlighting on, when the terminal has colors -" Also switch on highlighting the last used search pattern. -if &t_Co > 2 || has("gui_running") - syntax on -endif -" }}} +set cindent " use smart C indenting (see :h C-indenting) +set cinoptions=l1,c4,(0,U1,w1,m1,j1,J1 -" autocmd {{{ -" Only do this part when compiled with support for autocommands. -if has("autocmd") - " Enable file type detection. - " Use the default filetype settings, so that mail gets 'tw' set to 72, - " 'cindent' is on in C files, etc. - " Also load indent files, to automatically do language-dependent indenting. - filetype plugin indent on +set pastetoggle= " key sequence to toggle paste mode - " Put these in an autocmd group, so that we can delete them easily. - augroup vimrcEx - au! +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 - " For all text files set 'textwidth' to 78 characters. - autocmd FileType text setlocal textwidth=78 +" folding {{{1 +set foldmethod=marker " folding type +set foldlevelstart=99 " value for 'foldlevel' when starting to edit a file - " 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 +" space will toggle current fold in normal mode +nnoremap @=(foldlevel('.')?'za':"\") +" create folds around visual selection +vnoremap zf + +" save and restore folds +autocmd BufWinLeave *.* mkview +autocmd BufWinEnter *.* silent loadview + +" 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=$HOME/.vim/backupdir + +set undofile " persistent undo history +set undodir=$HOME/.vim/backupdir + +set autowrite " automatically write a file when leaving a modified buffer + +" command line editing {{{1 +set history=500 " how many command lines are remembered +set wildmode=longest:full " specifies how command line completion works +set wildmenu " command-line completion shows a list of matches + +" various {{{1 +set virtualedit=block " let cursor move past last char in mode +set viminfo='100,<50,s10,h,n~/.vim/viminfo " viminfo defaults but save file in .vim + +" plugins {{{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#tabline#enabled = 1 + +" Gundo {{{2 +nnoremap :GundoToggle +" fugitive {{{2 +nmap dd :tab split \| Gdiff \| wincmd h + +" 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 + +" 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 + +if ! &diff + let g:syntastic_check_on_open=1 +endif + +" tagbar {{{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 = ['+', '-'] - augroup END -else - set autoindent " always set autoindenting on -endif " has("autocmd") }}} +" YouCompleteMe {{{2 +let g:ycm_extra_conf_globlist = ['/mnt/data/src/*'] -" DiffOrig {{{ +" 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. @@ -162,64 +253,3 @@ if !exists(":DiffOrig") command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis \ | wincmd p | diffthis endif -" }}} - -" fold {{{ -set foldmethod=marker -set foldlevelstart=99 -" space will toggle current fold in normal mode, if not in a fold, normal -" behaviour -nnoremap @=(foldlevel('.')?'za':"\") -vnoremap zf -" save and restore folds -autocmd BufWinLeave *.* mkview -autocmd BufWinEnter *.* silent loadview -" }}} - -function! NextIndent(exclusive, fwd, lowerlevel, skipblanks) " {{{ -" Jump to the next or previous line that has the same level or a lower -" level of indentation than the current line. -" -" exclusive (bool): true: Motion is exclusive -" false: Motion is inclusive -" fwd (bool): true: Go to next line -" false: Go to previous line -" lowerlevel (bool): true: Go to line with lower indentation level -" false: Go to line with the same indentation level -" skipblanks (bool): true: Skip blank lines -" false: Don't skip blank lines - let line = line('.') - let column = col('.') - let lastline = line('$') - let indent = indent(line) - let stepvalue = a:fwd ? 1 : -1 - while (line > 0 && line <= lastline) - let line = line + stepvalue - if ( ! a:lowerlevel && indent(line) == indent || - \ a:lowerlevel && indent(line) < indent) - if (! a:skipblanks || strlen(getline(line)) > 0) - if (a:exclusive) - let line = line - stepvalue - endif - exe line - exe "normal " column . "|" - return - endif - endif - endwhile -endfunction - -" Moving back and forth between lines of same or lower indentation. -nnoremap [l :call NextIndent(0, 0, 0, 1) -nnoremap ]l :call NextIndent(0, 1, 0, 1) -nnoremap [L :call NextIndent(0, 0, 1, 1) -nnoremap ]L :call NextIndent(0, 1, 1, 1) -vnoremap [l :call NextIndent(0, 0, 0, 1)m'gv'' -vnoremap ]l :call NextIndent(0, 1, 0, 1)m'gv'' -vnoremap [L :call NextIndent(0, 0, 1, 1)m'gv'' -vnoremap ]L :call NextIndent(0, 1, 1, 1)m'gv'' -onoremap [l :call NextIndent(0, 0, 0, 1) -onoremap ]l :call NextIndent(0, 1, 0, 1) -onoremap [L :call NextIndent(1, 0, 1, 1) -onoremap ]L :call NextIndent(1, 1, 1, 1) -" end of jump indent }}}