" mReschke Personal Debian based Vimrc " 2015-03-02 " All system-wide defaults are set in $VIMRUNTIME/debian.vim and sourced by " the call to :runtime you can find below. If you wish to change any of those " settings, you should do it in this file (/etc/vim/vimrc), since debian.vim " will be overwritten everytime an upgrade of the vim packages is performed. " It is recommended to make changes after sourcing debian.vim since it alters " the value of the 'compatible' option. " This line should not be removed as it ensures that various options are " properly set to work with the Vim-related packages available in Debian. runtime! debian.vim " Uncomment the next line to make Vim more Vi-compatible " NOTE: debian.vim sets 'nocompatible'. Setting 'compatible' changes numerous " options, so any other options should be set AFTER setting 'compatible'. "set compatible " Source a global configuration file if available if filereadable("/etc/vim/vimrc.local") source /etc/vim/vimrc.local endif " Use pathogen to easily modify the runtime path to include all plugins under " the ~/.vim/bundle directory filetype off " force reloading *after* pathogen loaded call pathogen#infect() call pathogen#helptags() filetype plugin indent on " enable detection, plugins and indenting in one step syntax on " Change the mapleader from \ to , let mapleader="," let maplocalleader="\\" scriptencoding utf-8 set encoding=utf-8 " Editing behaviour {{{ set showmode " always show what mode we're currently editing in set nowrap " don't wrap lines set tabstop=4 " a tab is four spaces"set softtabstop=4 set softtabstop=4 " when hitting , pretend like a tab is removed, even if spaces set expandtab " expand tabs by default (overloadable per file type later) use expandtab or noexpandtab (ie tabs to spaces true/false) set shiftwidth=4 " number of spaces to use for autoindenting set shiftround " use multiple of shiftwidth when indenting with '<' and '>' set backspace=indent,eol,start " allow backspacing over everything in insert mode set autoindent " always set autoindenting on set copyindent " copy the previous indentation on autoindenting set number " always show line numbers set showmatch " set show matching parenthesis set ignorecase " ignore case when searching set smartcase " ignore case if search pattern is all lowercase, " case-sensitive otherwise set smarttab " insert tabs on the start of a line according to " shiftwidth, not tabstop set scrolloff=4 " keep 4 lines off the edges of the screen when scrolling "set virtualedit=all " allow the cursor to go in to "invalid" places set hlsearch " highlight search terms set incsearch " show search matches as you type set gdefault " search/replace "globally" (on a line) by default set listchars=tab:▸\ ,trail:·,extends:#,nbsp:· set nolist " don't show invisible characters by default, " but it is enabled for some file types (see later) set pastetoggle= " when in insert mode, press to go to " paste mode, where you can paste mass data " that won't be autoindented "set mouse=a " enable using the mouse if terminal emulator " supports it (xterm does) set fileformats="unix,dos,mac" set formatoptions+=1 " When wrapping paragraphs, don't end lines " with 1-letter words (looks stupid) set nrformats= " make and play well with " zero-padded numbers (i.e. don't consider " them octal or hex) set shortmess+=I " hide the launch screen set clipboard=unnamed " normal OS clipboard interaction set autoread " automatically reload files changed outside of Vim "set autowrite " automatically save file on buffer switch " Allow saving of files as sudo when I forgot to start vim using sudo. cmap w!! w !sudo tee > /dev/null % " Toggle show/hide invisible chars nnoremap i :set list! " Toggle line numbers nnoremap m :setlocal number! " Thanks to Steve Losh for this liberating tip " See http://stevelosh.com/blog/2010/09/coming-home-to-vim nnoremap / /\v vnoremap / /\v " Speed up scrolling of the viewport slightly nnoremap 2 nnoremap 2 " }}} " Folding rules {{{ set foldenable " enable folding set foldcolumn=2 " add a fold column set foldmethod=marker " detect triple-{ style fold markers set foldlevelstart=99 " start out with everything unfolded set foldopen=block,hor,insert,jump,mark,percent,quickfix,search,tag,undo " which commands trigger auto-unfold let php_folding=1 function! MyFoldText() let line = getline(v:foldstart) let nucolwidth = &fdc + &number * &numberwidth let windowwidth = winwidth(0) - nucolwidth - 3 let foldedlinecount = v:foldend - v:foldstart " expand tabs into spaces let onetab = strpart(' ', 0, &tabstop) let line = substitute(line, '\t', onetab, 'g') let line = strpart(line, 0, windowwidth - 2 -len(foldedlinecount)) let fillcharcount = windowwidth - len(line) - len(foldedlinecount) - 4 return line . ' …' . repeat(" ",fillcharcount) . foldedlinecount . ' ' endfunction set foldtext=MyFoldText() " Mappings to easily toggle fold levels nnoremap z0 :set foldlevel=0 nnoremap z1 :set foldlevel=1 nnoremap z2 :set foldlevel=2 nnoremap z3 :set foldlevel=3 nnoremap z4 :set foldlevel=4 nnoremap z5 :set foldlevel=5 nnoremap za vnoremap za " }}} " Editor layout {{{ set termencoding=utf-8 set encoding=utf-8 set lazyredraw " don't update the display while executing macros set laststatus=2 " tell VIM to always put a status line in, even " if there is only one window "set cmdheight=2 " use a status bar that is 2 rows high " }}} " Vim behaviour {{{ set hidden " hide buffers instead of closing them this " means that the current buffer can be put " to background without being written; and " that marks and undo history are preserved set switchbuf=useopen " reveal already opened files from the " quickfix window instead of opening new " buffers set history=1000 " remember more commands and search history set undolevels=1000 " use many muchos levels of undo if v:version >= 730 set undofile " keep a persistent backup file set undodir=~/.vim/.undo,~/tmp,/tmp endif set nobackup " do not keep backup files, it's 70's style cluttering set noswapfile " do not write annoying intermediate swap files, " who did ever restore from swap files anyway? set directory=~/.vim/.tmp,~/tmp,/tmp " store swap files in one of these directories " (in case swapfile is ever turned on) set viminfo='20,\"80 " read/write a .viminfo file, don't store more " than 80 lines of registers set wildmenu " make tab completion for files/buffers act like bash set wildmode=list:full " show a list when pressing tab and complete " first full match set wildignore=*.swp,*.bak,*.pyc,*.class set title " change the terminal's title set visualbell " don't beep set noerrorbells " don't beep set showcmd " show (partial) command in the last line of the screen " this also shows visual selection info set nomodeline " disable mode lines (security measure) "set ttyfast " always use a fast terminal "set cursorline " underline the current line, for quick orientation " }}} " Toggle the quickfix window {{{ " From Steve Losh, http://learnvimscriptthehardway.stevelosh.com/chapters/38.html nnoremap :call QuickfixToggle() let g:quickfix_is_open = 0 function! s:QuickfixToggle() if g:quickfix_is_open cclose let g:quickfix_is_open = 0 execute g:quickfix_return_to_window . "wincmd w" else let g:quickfix_return_to_window = winnr() copen let g:quickfix_is_open = 1 endif endfunction " }}} " Toggle the foldcolumn {{{ nnoremap f :call FoldColumnToggle() let g:last_fold_column_width = 4 " Pick a sane default for the foldcolumn function! FoldColumnToggle() if &foldcolumn let g:last_fold_column_width = &foldcolumn setlocal foldcolumn=0 else let &l:foldcolumn = g:last_fold_column_width endif endfunction " }}} " Highlighting {{{ if &t_Co > 2 || has("gui_running") syntax on " switch syntax highlighting on, when the terminal has colors endif " }}} " Shortcut mappings {{{ " Since I never use the ; key anyway, this is a real optimization for almost " all Vim commands, as I don't have to press the Shift key to form chords to " enter ex mode. nnoremap ; : nnoremap ; ; " Avoid accidental hits of while aiming for noremap! nnoremap Q :q " Quickly close the current window nnoremap q :bd " Quickly close the current buffer " Use Q for formatting the current paragraph (or visual selection) vnoremap Q gq nnoremap Q gqap " set breakindent on " keep paragraph indentation when re-wrapping text " Sort paragraphs vnoremap s !sort -fgv nnoremap s vip!sort -f " make p in Visual mode replace the selected text with the yank register vnoremap p :let current_reg = @"gvdi=current_reg " Shortcut to make nnoremap mk :make " Swap implementations of ` and ' jump to markers " By default, ' jumps to the marked line, ` jumps to the marked line and " column, so swap them nnoremap ' ` nnoremap ` ' " Use the damn hjkl keys "noremap "noremap "noremap "noremap " Remap j and k to act as expected when used on long, wrapped, lines nnoremap j gj nnoremap k gk " Easy window navigation noremap h noremap j noremap k noremap l nnoremap w vl "Resize vsplit nmap :vertical resize +5 nmap 25 :vertical resize 40 "Load the current buffer in Chrome "nmap o :!chromium " Complete whole filenames/lines with a quicker shortcut key in insert mode inoremap inoremap " Use ,d (or ,dd or ,dj or 20,dd) to delete a line without adding it to the " yanked stack (also, in visual mode) nnoremap d "_d vnoremap d "_d " Quick yanking to the end of the line nnoremap Y y$ " YankRing stuff let g:yankring_history_dir = '$HOME/.vim/.tmp' nnoremap r :YRShow " Edit the vimrc file nnoremap ev :e /etc/vim/vimrc nnoremap sv :so /etc/vim/vimrc " Clears the search register nnoremap / :nohlsearch " Pull word under cursor into LHS of a substitute (for quick search and " replace) nnoremap z :%s#\<=expand("")\># " Keep search matches in the middle of the window and pulse the line when moving " to them. nnoremap n n:call PulseCursorLine() nnoremap N N:call PulseCursorLine() " Quickly get out of insert mode without your fingers having to leave the " home row (either use 'jj' or 'jk') inoremap jj " Quick alignment of text " nnoremap al :left " nnoremap ar :right " nnoremap ac :center " Sudo to write cnoremap w!! w !sudo tee % >/dev/null " Ctrl+W to redraw "nnoremap :redraw! " Jump to matching pairs easily, with Tab nnoremap % vnoremap % " Strip all trailing whitespace from a file, using ,W " NO, makes toooo many edits to files "nnoremap W :%s/\s\+$//:let @/='' " Use The Silver Searcher over grep, iff possible if executable('ag') " Use ag over grep set grepprg=ag\ --nogroup\ --nocolor " Use ag in CtrlP for listing files. Lightning fast and respects .gitignore let g:ctrlp_user_command = 'ag %s -l --nocolor -g ""' " ag is fast enough that CtrlP doesn't need to cache let g:ctrlp_use_caching = 0 endif " grep/Ack/Ag for the word under cursor vnoremap a y:grep! "\b"\b":cw nnoremap a :grep! "\b\b" nnoremap K *N:grep! "\b\b":cw " Allow quick additions to the spelling dict nnoremap g :spellgood " Define "Ag" command command -nargs=+ -complete=file -bar Ag silent! grep! | cwindow | redraw! " bind \ (backward slash) to grep shortcut nnoremap \ :Ag " Creating folds for tags in HTML "nnoremap ft Vatzf " Reselect text that was just pasted with ,v nnoremap v V`] " Gundo.vim nnoremap :GundoToggle " }}} " NERDTree settings {{{ nnoremap n :NERDTreeTabsToggle "nnoremap n :NERDTree "nnoremap m :NERDTreeClose:NERDTreeFind "conflicts with toggle line numbers "nnoremap N :NERDTreeClose " Store the bookmarks file "let NERDTreeBookmarksFile=expand("$HOME/.vim/NERDTreeBookmarks") let NERDTreeBookmarksFile=expand("/etc/vim/NERDTreeBookmarks") " Show the bookmarks table on startup let NERDTreeShowBookmarks=1 " Show hidden files, too let NERDTreeShowFiles=1 let NERDTreeShowHidden=1 " Quit on opening files from the tree let NERDTreeQuitOnOpen=1 " Highlight the selected entry in the tree let NERDTreeHighlightCursorline=1 " Use a single click to fold/unfold directories and a double click to open " files let NERDTreeMouseMode=2 " Don't display these kinds of files let NERDTreeIgnore=[ '\.pyc$', '\.pyo$', '\.py\$class$', '\.obj$', \ '\.o$', '\.so$', '\.egg$', '^\.git$' ] " }}} " TagList settings {{{ nnoremap l :TlistClose:TlistToggle nnoremap L :TlistClose " quit Vim when the TagList window is the last open window let Tlist_Exit_OnlyWindow=1 " quit when TagList is the last open window let Tlist_GainFocus_On_ToggleOpen=1 " put focus on the TagList window when it opens "let Tlist_Process_File_Always=1 " process files in the background, even when the TagList window isn't open "let Tlist_Show_One_File=1 " only show tags from the current buffer, not all open buffers let Tlist_WinWidth=40 " set the width let Tlist_Inc_Winwidth=1 " increase window by 1 when growing " shorten the time it takes to highlight the current tag (default is 4 secs) " note that this setting influences Vim's behaviour when saving swap files, " but we have already turned off swap files (earlier) "set updatetime=1000 " the default ctags in /usr/bin on the Mac is GNU ctags, so change it to the " exuberant ctags version in /usr/local/bin let Tlist_Ctags_Cmd = '/usr/local/bin/ctags' " show function/method prototypes in the list let Tlist_Display_Prototype=1 " don't show scope info let Tlist_Display_Tag_Scope=0 " show TagList window on the right let Tlist_Use_Right_Window=1 " }}} " vim-flake8 default configuration let g:flake8_show_in_gutter=1 " Conflict markers {{{ " highlight conflict markers match ErrorMsg '^\(<\|=\|>\)\{7\}\([^=].\+\)\?$' " shortcut to jump to next conflict marker nnoremap c /^\(<\\|=\\|>\)\{7\}\([^=].\+\)\?$ " }}} " Restore or remember last cursor position upon reopening files {{{ "autocmd BufReadPost * " \ if line("'\"") > 0 && line("'\"") <= line("$") | " \ exe "normal! g`\"" | " \ endif " }}} " Extra vi-compatibility {{{ " set extra vi-compatible options set cpoptions+=$ " when changing a line, don't redisplay, but put a '$' at " the end during the change set formatoptions-=o " don't start new lines w/ comment leader on pressing 'o' au filetype vim set formatoptions-=o " somehow, during vim filetype detection, this gets set " for vim files, so explicitly unset it again " }}} " Ignore common directories let g:ctrlp_custom_ignore = { \ 'dir': 'node_modules\|bower_components', \ } " Invoke CtrlP, but CommandT style nnoremap t :CtrlP nnoremap b :CtrlPTag nnoremap . :CtrlPBuffer if has("gui_running") "colorscheme molokai "colorscheme mustang "colorscheme badwolf colorscheme jellybeans " Remove toolbar, left scrollbar and right scrollbar set guioptions-=T set guioptions-=l set guioptions-=L set guioptions-=r set guioptions-=R else set background=dark "colorscheme molokai "colorscheme mustang "colorscheme badwolf colorscheme jellybeans "colorscheme heroku-terminal "colorscheme benokai endif " Pulse ------------------------------------------------------------------- {{{ function! PulseCursorLine() let current_window = winnr() windo set nocursorline execute current_window . 'wincmd w' setlocal cursorline redir => old_hi silent execute 'hi CursorLine' redir END let old_hi = split(old_hi, '\n')[0] let old_hi = substitute(old_hi, 'xxx', '', '') hi CursorLine guibg=#3a3a3a redraw sleep 20m hi CursorLine guibg=#4a4a4a redraw sleep 30m hi CursorLine guibg=#3a3a3a redraw sleep 30m hi CursorLine guibg=#2a2a2a redraw sleep 20m execute 'hi ' . old_hi windo set cursorline execute current_window . 'wincmd w' endfunction " }}} " Powerline configuration ------------------------------------------------- {{{ " Dont have powerline, too much of a pain to install, to many dependencies "let g:Powerline_symbols = 'compatible' "let g:Powerline_symbols = 'fancy' " }}} " Use shift-H and shift-L for move to beginning/end nnoremap H 0 nnoremap L $ " Split previously opened file ('#') in a split window nnoremap sh :execute "leftabove vsplit" bufname('#') nnoremap sl :execute "rightbelow vsplit" bufname('#') " Abbreviations " ------------------------------------------------------------------------- {{{ "abbrev pv !php artisan " }}} " Laravel and PHP stuff --------------------------------------------------- {{{ " Auto-remove trailing spaces in PHP files autocmd BufWritePre *.php :%s/\s\+$//e " Laravel framework commons "nmap lr :e app/routes.php "nmap lca :e app/config/app.php81Gf(%O "nmap lcd :e app/config/database.php "nmap lc :e composer.json " I don't want to pull up these folders/files when calling CtrlP set wildignore+=*/vendor/** set wildignore+=*/node_modules/** "Auto change directory to match current file ,cd nnoremap ,cd :cd %:p:h:pwd " Prepare a new PHP class function! Class() let name = input('Class name? ') let namespace = input('Any Namespace? ') if strlen(namespace) exec "normal i\" else exec "normal i" endif " Open class exec "normal iclass " . name . " {\}\O\" exec "normal i\ public function __construct()\{\\}\" endfunction nmap ,1 :call Class() " }}}