什么是你的.vimrc?

Vi和Vim允许非常好的定制,通常存储在.vimrc文件中。 程序员的典型特征是语法高亮,智能缩进等等。

你有什么其他的高效编程技巧,藏在你的.vimrc中?

我主要对重构,自动类和类似的生产力macros感兴趣,特别是对于C#。

你自找的 :-)

 "{{{Auto Commands " Automatically cd into the directory that the file is in autocmd BufEnter * execute "chdir ".escape(expand("%:p:h"), ' ') " Remove any trailing whitespace that is in the file autocmd BufRead,BufWrite * if ! &bin | silent! %s/\s\+$//ge | endif " Restore cursor position to where it was before augroup JumpCursorOnEdit au! autocmd BufReadPost * \ if expand("<afile>:p:h") !=? $TEMP | \ if line("'\"") > 1 && line("'\"") <= line("$") | \ let JumpCursorOnEdit_foo = line("'\"") | \ let b:doopenfold = 1 | \ if (foldlevel(JumpCursorOnEdit_foo) > foldlevel(JumpCursorOnEdit_foo - 1)) | \ let JumpCursorOnEdit_foo = JumpCursorOnEdit_foo - 1 | \ let b:doopenfold = 2 | \ endif | \ exe JumpCursorOnEdit_foo | \ endif | \ endif " Need to postpone using "zv" until after reading the modelines. autocmd BufWinEnter * \ if exists("b:doopenfold") | \ exe "normal zv" | \ if(b:doopenfold > 1) | \ exe "+".1 | \ endif | \ unlet b:doopenfold | \ endif augroup END "}}} "{{{Misc Settings " Necesary for lots of cool vim things set nocompatible " This shows what you are typing as a command. I love this! set showcmd " Folding Stuffs set foldmethod=marker " Needed for Syntax Highlighting and stuff filetype on filetype plugin on syntax enable set grepprg=grep\ -nH\ $* " Who doesn't like autoindent? set autoindent " Spaces are better than a tab character set expandtab set smarttab " Who wants an 8 character tab? Not me! set shiftwidth=3 set softtabstop=3 " Use english for spellchecking, but don't spellcheck by default if version >= 700 set spl=en spell set nospell endif " Real men use gcc "compiler gcc " Cool tab completion stuff set wildmenu set wildmode=list:longest,full " Enable mouse support in console set mouse=a " Got backspace? set backspace=2 " Line Numbers PWN! set number " Ignoring case is a fun trick set ignorecase " And so is Artificial Intellegence! set smartcase " This is totally awesome - remap jj to escape in insert mode. You'll never type jj anyway, so it's great! inoremap jj <Esc> nnoremap JJJJ <Nop> " Incremental searching is sexy set incsearch " Highlight things that we find with the search set hlsearch " Since I use linux, I want this let g:clipbrdDefaultReg = '+' " When I close a tab, remove the buffer set nohidden " Set off the other paren highlight MatchParen ctermbg=4 " }}} "{{{Look and Feel " Favorite Color Scheme if has("gui_running") colorscheme inkpot " Remove Toolbar set guioptions-=T "Terminus is AWESOME set guifont=Terminus\ 9 else colorscheme metacosm endif "Status line gnarliness set laststatus=2 set statusline=%F%m%r%h%w\ (%{&ff}){%Y}\ [%l,%v][%p%%] " }}} "{{{ Functions "{{{ Open URL in browser function! Browser () let line = getline (".") let line = matchstr (line, "http[^ ]*") exec "!konqueror ".line endfunction "}}} "{{{Theme Rotating let themeindex=0 function! RotateColorTheme() let y = -1 while y == -1 let colorstring = "inkpot#ron#blue#elflord#evening#koehler#murphy#pablo#desert#torte#" let x = match( colorstring, "#", g:themeindex ) let y = match( colorstring, "#", x + 1 ) let g:themeindex = x + 1 if y == -1 let g:themeindex = 0 else let themestring = strpart(colorstring, x + 1, y - x - 1) return ":colorscheme ".themestring endif endwhile endfunction " }}} "{{{ Paste Toggle let paste_mode = 0 " 0 = normal, 1 = paste func! Paste_on_off() if g:paste_mode == 0 set paste let g:paste_mode = 1 else set nopaste let g:paste_mode = 0 endif return endfunc "}}} "{{{ Todo List Mode function! TodoListMode() e ~/.todo.otl Calendar wincmd l set foldlevel=1 tabnew ~/.notes.txt tabfirst " or 'norm! zMzr' endfunction "}}} "}}} "{{{ Mappings " Open Url on this line with the browser \w map <Leader>w :call Browser ()<CR> " Open the Project Plugin <F2> nnoremap <silent> <F2> :Project<CR> " Open the Project Plugin nnoremap <silent> <Leader>pal :Project .vimproject<CR> " TODO Mode nnoremap <silent> <Leader>todo :execute TodoListMode()<CR> " Open the TagList Plugin <F3> nnoremap <silent> <F3> :Tlist<CR> " Next Tab nnoremap <silent> <C-Right> :tabnext<CR> " Previous Tab nnoremap <silent> <C-Left> :tabprevious<CR> " New Tab nnoremap <silent> <Ct> :tabnew<CR> " Rotate Color Scheme <F8> nnoremap <silent> <F8> :execute RotateColorTheme()<CR> " DOS is for fools. nnoremap <silent> <F9> :%s/$//g<CR>:%s// /g<CR> " Paste Mode! Dang! <F10> nnoremap <silent> <F10> :call Paste_on_off()<CR> set pastetoggle=<F10> " Edit vimrc \ev nnoremap <silent> <Leader>ev :tabnew<CR>:e ~/.vimrc<CR> " Edit gvimrc \gv nnoremap <silent> <Leader>gv :tabnew<CR>:e ~/.gvimrc<CR> " Up and down are more logical with g.. nnoremap <silent> k gk nnoremap <silent> j gj inoremap <silent> <Up> <Esc>gka inoremap <silent> <Down> <Esc>gja " Good call Benjie (r for i) nnoremap <silent> <Home> i <Esc>r nnoremap <silent> <End> a <Esc>r " Create Blank Newlines and stay in Normal mode nnoremap <silent> zj o<Esc> nnoremap <silent> zk O<Esc> " Space will toggle folds! nnoremap <space> za " Search mappings: These will make it so that going to the next one in a " search will center on the line it's found in. map N Nzz map n nzz " Testing set completeopt=longest,menuone,preview inoremap <expr> <cr> pumvisible() ? "\<cy>" : "\<cg>u\<cr>" inoremap <expr> <cn> pumvisible() ? "\<lt>cn>" : "\<lt>cn>\<lt>cr>=pumvisible() ? \"\\<lt>down>\" : \"\"\<lt>cr>" inoremap <expr> <m-;> pumvisible() ? "\<lt>cn>" : "\<lt>cx>\<lt>co>\<lt>cn>\<lt>cp>\<lt>cr>=pumvisible() ? \"\\<lt>down>\" : \"\"\<lt>cr>" " Swap ; and : Convenient. nnoremap ; : nnoremap : ; " Fix email paragraphs nnoremap <leader>par :%s/^>$//<CR> "ly$O#{{{ "lpjjj_%A#}}}jjzajj "}}} "{{{Taglist configuration let Tlist_Use_Right_Window = 1 let Tlist_Enable_Fold_Column = 0 let Tlist_Exit_OnlyWindow = 1 let Tlist_Use_SingleClick = 1 let Tlist_Inc_Winwidth = 0 "}}} let g:rct_completion_use_fri = 1 "let g:Tex_DefaultTargetFormat = "pdf" let g:Tex_ViewRule_pdf = "kpdf" filetype plugin indent on syntax on 

这不是在我的.vimrc文件,但昨天我了解到]p命令。 它像p一样粘贴缓冲区的内容,但会自动调整缩进以匹配光标所在的行! 这对移动代码非常有用。

我使用以下内容将所有的临时和备份文件保存在一个地方:

 set backup set backupdir=~/.vim/backup set directory=~/.vim/tmp 

保存工作目录到处都是乱七八糟的。

你将不得不先创build这些目录,vim 不会为你创build它们。

有人(即Frew)上面贴有这样一行:

“自动cd到该文件所在的目录中:”

 autocmd BufEnter * execute "chdir ".escape(expand("%:p:h"), ' ') 

我自己也在做类似的事情,直到我发现同样的事情可以通过内置的设置完成:

 set autochdir 

我觉得在几次不同的时间里,我发生了类似的事情。 Vim拥有许多不同的内置设置和选项,有时比search文档的内置方式更快更容易。

我最近的补充是突出显示当前行

 set cul # highlight current line hi CursorLine term=none cterm=none ctermbg=3 # adjust color 

2012年更新 :我现在真的build议检查vim-powerline取代了我以前的statusline脚本,尽pipe目前缺less一些我想念的function。


我会说,在我的vimrc中的状态线的东西可能是最有趣/有用的(从这里的作者vimrc和相应的博客文章撕下来 )。

截图:

状态行http://img34.imageshack.us/img34/849/statusline.png

码:

 "recalculate the trailing whitespace warning when idle, and after saving autocmd cursorhold,bufwritepost * unlet! b:statusline_trailing_space_warning "return '[\s]' if trailing white space is detected "return '' otherwise function! StatuslineTrailingSpaceWarning() if !exists("b:statusline_trailing_space_warning") if !&modifiable let b:statusline_trailing_space_warning = '' return b:statusline_trailing_space_warning endif if search('\s\+$', 'nw') != 0 let b:statusline_trailing_space_warning = '[\s]' else let b:statusline_trailing_space_warning = '' endif endif return b:statusline_trailing_space_warning endfunction "return the syntax highlight group under the cursor '' function! StatuslineCurrentHighlight() let name = synIDattr(synID(line('.'),col('.'),1),'name') if name == '' return '' else return '[' . name . ']' endif endfunction "recalculate the tab warning flag when idle and after writing autocmd cursorhold,bufwritepost * unlet! b:statusline_tab_warning "return '[&et]' if &et is set wrong "return '[mixed-indenting]' if spaces and tabs are used to indent "return an empty string if everything is fine function! StatuslineTabWarning() if !exists("b:statusline_tab_warning") let b:statusline_tab_warning = '' if !&modifiable return b:statusline_tab_warning endif let tabs = search('^\t', 'nw') != 0 "find spaces that arent used as alignment in the first indent column let spaces = search('^ \{' . &ts . ',}[^\t]', 'nw') != 0 if tabs && spaces let b:statusline_tab_warning = '[mixed-indenting]' elseif (spaces && !&et) || (tabs && &et) let b:statusline_tab_warning = '[&et]' endif endif return b:statusline_tab_warning endfunction "recalculate the long line warning when idle and after saving autocmd cursorhold,bufwritepost * unlet! b:statusline_long_line_warning "return a warning for "long lines" where "long" is either &textwidth or 80 (if "no &textwidth is set) " "return '' if no long lines "return '[#x,my,$z] if long lines are found, were x is the number of long "lines, y is the median length of the long lines and z is the length of the "longest line function! StatuslineLongLineWarning() if !exists("b:statusline_long_line_warning") if !&modifiable let b:statusline_long_line_warning = '' return b:statusline_long_line_warning endif let long_line_lens = s:LongLines() if len(long_line_lens) > 0 let b:statusline_long_line_warning = "[" . \ '#' . len(long_line_lens) . "," . \ 'm' . s:Median(long_line_lens) . "," . \ '$' . max(long_line_lens) . "]" else let b:statusline_long_line_warning = "" endif endif return b:statusline_long_line_warning endfunction "return a list containing the lengths of the long lines in this buffer function! s:LongLines() let threshold = (&tw ? &tw : 80) let spaces = repeat(" ", &ts) let long_line_lens = [] let i = 1 while i <= line("$") let len = strlen(substitute(getline(i), '\t', spaces, 'g')) if len > threshold call add(long_line_lens, len) endif let i += 1 endwhile return long_line_lens endfunction "find the median of the given array of numbers function! s:Median(nums) let nums = sort(a:nums) let l = len(nums) if l % 2 == 1 let i = (l-1) / 2 return nums[i] else return (nums[l/2] + nums[(l/2)-1]) / 2 endif endfunction "statusline setup set statusline=%f "tail of the filename "display a warning if fileformat isnt unix set statusline+=%#warningmsg# set statusline+=%{&ff!='unix'?'['.&ff.']':''} set statusline+=%* "display a warning if file encoding isnt utf-8 set statusline+=%#warningmsg# set statusline+=%{(&fenc!='utf-8'&&&fenc!='')?'['.&fenc.']':''} set statusline+=%* set statusline+=%h "help file flag set statusline+=%y "filetype set statusline+=%r "read only flag set statusline+=%m "modified flag "display a warning if &et is wrong, or we have mixed-indenting set statusline+=%#error# set statusline+=%{StatuslineTabWarning()} set statusline+=%* set statusline+=%{StatuslineTrailingSpaceWarning()} set statusline+=%{StatuslineLongLineWarning()} set statusline+=%#warningmsg# set statusline+=%{SyntasticStatuslineFlag()} set statusline+=%* "display a warning if &paste is set set statusline+=%#error# set statusline+=%{&paste?'[paste]':''} set statusline+=%* set statusline+=%= "left/right separator function! SlSpace() if exists("*GetSpaceMovement") return "[" . GetSpaceMovement() . "]" else return "" endif endfunc set statusline+=%{SlSpace()} set statusline+=%{StatuslineCurrentHighlight()}\ \ "current highlight set statusline+=%c, "cursor column set statusline+=%l/%L "cursor line/total lines set statusline+=\ %P "percent through file set laststatus=2 

除此之外,它还会在通常的标准文件信息的状态行上进行通知,但是还包括诸如以下内容的其他内容:设置粘贴,混合缩进,尾随空白等。如果您特别关注代码格式,那么该代码非常有用。

此外,如屏幕截图所示,将其与syntastic相结合,可以突出显示任何语法错误(假设您select的语言包含关联的语法检查器)。

我的迷你版本:

 syntax on set background=dark set shiftwidth=2 set tabstop=2 if has("autocmd") filetype plugin indent on endif set showcmd " Show (partial) command in status line. set showmatch " Show matching brackets. set ignorecase " Do case insensitive matching set smartcase " Do smart case matching set incsearch " Incremental search set hidden " Hide buffers when they are abandoned 

从各地收集的大版本:

 syntax on set background=dark set ruler " show the line number on the bar set more " use more prompt set autoread " watch for file changes set number " line numbers set hidden set noautowrite " don't automagically write on :next set lazyredraw " don't redraw when don't have to set showmode set showcmd set nocompatible " vim, not vi set autoindent smartindent " auto/smart indent set smarttab " tab and backspace are smart set tabstop=2 " 6 spaces set shiftwidth=2 set scrolloff=5 " keep at least 5 lines above/below set sidescrolloff=5 " keep at least 5 lines left/right set history=200 set backspace=indent,eol,start set linebreak set cmdheight=2 " command line two lines high set undolevels=1000 " 1000 undos set updatecount=100 " switch every 100 chars set complete=.,w,b,u,U,t,i,d " do lots of scanning on tab completion set ttyfast " we have a fast terminal set noerrorbells " No error bells please set shell=bash set fileformats=unix set ff=unix filetype on " Enable filetype detection filetype indent on " Enable filetype-specific indenting filetype plugin on " Enable filetype-specific plugins set wildmode=longest:full set wildmenu " menu has tab completion let maplocalleader=',' " all my macros start with , set laststatus=2 " searching set incsearch " incremental search set ignorecase " search ignoring case set hlsearch " highlight the search set showmatch " show matching bracket set diffopt=filler,iwhite " ignore all whitespace and sync " backup set backup set backupdir=~/.vim_backup set viminfo=%100,'100,/100,h,\"500,:100,n~/.viminfo "set viminfo='100,f1 " spelling if v:version >= 700 " Enable spell check for text files autocmd BufNewFile,BufRead *.txt setlocal spell spelllang=en endif " mappings " toggle list mode nmap <LocalLeader>tl :set list!<cr> " toggle paste mode nmap <LocalLeader>pp :set paste!<cr> 

有时最简单的东西是最有价值的。 我的.vimrc中的两行是完全不可或缺的:

 nore;  :
 nore,;

杂项。 设置:

  1. closures恼人的错误钟声:

     set noerrorbells set visualbell set t_vb= 
  2. 使光标按预期使用包装线移动:

     inoremap <Down> <Co>gj inoremap <Up> <Co>gk 
  3. 查找ctags “标签”文件上的目录,直到find一个:

     set tags=tags;/ 
  4. 用Python语法显示SCons文件:

     autocmd BufReadPre,BufNewFile SConstruct set filetype=python autocmd BufReadPre,BufNewFile SConscript set filetype=python 

我不是世界上最先进的vim'er,但这里有几个我拾起

 function! Mosh_Tab_Or_Complete() if col('.')>1 && strpart( getline('.'), col('.')-2, 3 ) =~ '^\w' return "\<CN>" else return "\<Tab>" endfunction inoremap <Tab> <CR>=Mosh_Tab_Or_Complete()<CR> 

使标签自动完成的数字是否要在那里放置一个字或实际的选项卡(4个空格)。

 map cc :.,$s/^ *//<CR> 

从这里删除所有打开的空白到文件的末尾。 出于某种原因,我觉得这很有用。

 set nu! set nobackup 

显示行号,不要创build那些恼人的备份文件。 无论如何,我从来没有从旧的备份恢复任何东西。

 imap ii <C-[> 

在插入时,按i两次进入命令模式。 我从来没有碰到一个字或variables,连续2个我,这样,我不必让我的手指离开主排或按多个键来回切换。

我严重评论vimrc,readline-esque(emacs)键绑定:

 if version >= 700 "------ Meta ------" " clear all autocommands! (this comment must be on its own line) autocmd! set nocompatible " break away from old vi compatibility set fileformats=unix,dos,mac " support all three newline formats set viminfo= " don't use or save viminfo files "------ Console UI & Text display ------" set cmdheight=1 " explicitly set the height of the command line set showcmd " Show (partial) command in status line. set number " yay line numbers set ruler " show current position at bottom set noerrorbells " don't whine set visualbell t_vb= " and don't make faces set lazyredraw " don't redraw while in macros set scrolloff=5 " keep at least 5 lines around the cursor set wrap " soft wrap long lines set list " show invisible characters set listchars=tab:>·,trail:· " but only show tabs and trailing whitespace set report=0 " report back on all changes set shortmess=atI " shorten messages and don't show intro set wildmenu " turn on wild menu :e <Tab> set wildmode=list:longest " set wildmenu to list choice if has('syntax') syntax on " Remember that rxvt-unicode has 88 colors by default; enable this only if " you are using the 256-color patch if &term == 'rxvt-unicode' set t_Co=256 endif if &t_Co == 256 colorscheme xoria256 else colorscheme peachpuff endif endif "------ Text editing and searching behavior ------" set nohlsearch " turn off highlighting for searched expressions set incsearch " highlight as we search however set matchtime=5 " blink matching chars for .x seconds set mouse=a " try to use a mouse in the console (wimp!) set ignorecase " set case insensitivity set smartcase " unless there's a capital letter set completeopt=menu,longest,preview " more autocomplete <Ctrl>-P options set nostartofline " leave my cursor position alone! set backspace=2 " equiv to :set backspace=indent,eol,start set textwidth=80 " we like 80 columns set showmatch " show matching brackets set formatoptions=tcrql " t - autowrap to textwidth " c - autowrap comments to textwidth " r - autoinsert comment leader with <Enter> " q - allow formatting of comments with :gq " l - don't format already long lines "------ Indents and tabs ------" set autoindent " set the cursor at same indent as line above set smartindent " try to be smart about indenting (C-style) set expandtab " expand <Tab>s with spaces; death to tabs! set shiftwidth=4 " spaces for each step of (auto)indent set softtabstop=4 " set virtual tab stop (compat for 8-wide tabs) set tabstop=8 " for proper display of files with tabs set shiftround " always round indents to multiple of shiftwidth set copyindent " use existing indents for new indents set preserveindent " save as much indent structure as possible filetype plugin indent on " load filetype plugins and indent settings "------ Key bindings ------" " Remap broken meta-keys that send ^[ for n in range(97,122) " ASCII az let c = nr2char(n) exec "set <M-". c .">=\e". c exec "map \e". c ." <M-". c .">" exec "map! \e". c ." <M-". c .">" endfor """ Emacs keybindings " first move the window command because we'll be taking it over noremap <Cx> <Cw> " Movement left/right noremap! <Cb> <Left> noremap! <Cf> <Right> " word left/right noremap <Mb> b noremap! <Mb> <Co>b noremap <Mf> w noremap! <Mf> <Co>w " line start/end noremap <Ca> ^ noremap! <Ca> <Esc>I noremap <Ce> $ noremap! <Ce> <Esc>A " Rubout word / line and enter insert mode noremap <Cw> i<Cw> noremap <Cu> i<Cu> " Forward delete char / word / line and enter insert mode noremap! <Cd> <Co>x noremap <Md> dw noremap! <Md> <Co>dw noremap <Ck> Da noremap! <Ck> <Co>D " Undo / Redo and enter normal mode noremap <C-_> u noremap! <C-_> <Co>u<Esc><Right> noremap! <Cr> <Co><Cr><Esc> " Remap <C-space> to word completion noremap! <Nul> <Cn> " OS X paste (pretty poor implementation) if has('mac') noremap √ :r!pbpaste<CR> noremap! √ <Esc>√ endif """ screen.vim REPL: http://github.com/ervandew/vimfiles " send paragraph to parallel process vmap <Cc><Cc> :ScreenSend<CR> nmap <Cc><Cc> mCvip<Cc><Cc>`C imap <Cc><Cc> <Esc><Cc><Cc><Right> " set shell region height let g:ScreenShellHeight = 12 "------ Filetypes ------" " Vimscript autocmd FileType vim setlocal expandtab shiftwidth=4 tabstop=8 softtabstop=4 " Shell autocmd FileType sh setlocal expandtab shiftwidth=4 tabstop=8 softtabstop=4 " Lisp autocmd Filetype lisp,scheme setlocal equalprg=~/.vim/bin/lispindent.lisp expandtab shiftwidth=2 tabstop=8 softtabstop=2 " Ruby autocmd FileType ruby setlocal expandtab shiftwidth=2 tabstop=2 softtabstop=2 " PHP autocmd FileType php setlocal expandtab shiftwidth=4 tabstop=4 softtabstop=4 " X?HTML & XML autocmd FileType html,xhtml,xml setlocal expandtab shiftwidth=2 tabstop=2 softtabstop=2 " CSS autocmd FileType css setlocal expandtab shiftwidth=4 tabstop=4 softtabstop=4 " JavaScript " autocmd BufRead,BufNewFile *.json setfiletype javascript autocmd FileType javascript setlocal expandtab shiftwidth=2 tabstop=2 softtabstop=2 let javascript_enable_domhtmlcss=1 "------ END VIM-500 ------" endif " version >= 500 
 syntax on set cindent set ts=4 set sw=4 set backspace=2 set laststatus=2 set nohlsearch set modeline set modelines=3 set ai map Q gq set vb t_vb= set nowrap set ss=5 set is set scs set ru map <F2> <Esc>:w<CR> map! <F2> <Esc>:w<CR> map <F10> <Esc>:qa<CR> map! <F10> <Esc>:qa<CR> map <F9> <Esc>:wqa<CR> map! <F9> <Esc>:wqa<CR> inoremap <s-up> <Esc><cw>W<Ins> inoremap <s-down> <Esc><cw>w<Ins> nnoremap <s-up> <cw>W nnoremap <s-down> <cw>w " Fancy middle-line <CR> inoremap <C-CR> <Esc>o nnoremap <C-CR> o " This is the way I like my quotation marks and various braces inoremap '' ''<Left> inoremap "" ""<Left> inoremap () ()<Left> inoremap <> <><Left> inoremap {} {}<Left> inoremap [] []<Left> inoremap () ()<Left> " Quickly set comma or semicolon at the end of the string inoremap ,, <End>, inoremap ;; <End>; au FileType python inoremap :: <End>: au FileType perl,python set foldlevel=0 au FileType perl,python set foldcolumn=4 au FileType perl,python set fen au FileType perl set fdm=syntax au FileType python set fdm=indent au FileType perl,python set fdn=4 au FileType perl,python set fml=10 au FileType perl,python set fdo=block,hor,mark,percent,quickfix,search,tag,undo,search au FileType perl,python abbr sefl self au FileType perl abbr sjoft shift au FileType perl abbr DUmper Dumper function! ToggleNumberRow() if !exists("g:NumberRow") || 0 == g:NumberRow let g:NumberRow = 1 call ReverseNumberRow() else let g:NumberRow = 0 call NormalizeNumberRow() endif endfunction " Reverse the number row characters function! ReverseNumberRow() " map each number to its shift-key character inoremap 1 ! inoremap 2 @ inoremap 3 # inoremap 4 $ inoremap 5 % inoremap 6 ^ inoremap 7 & inoremap 8 * inoremap 9 ( inoremap 0 ) inoremap - _ inoremap 90 ()<Left> " and then the opposite inoremap ! 1 inoremap @ 2 inoremap # 3 inoremap $ 4 inoremap % 5 inoremap ^ 6 inoremap & 7 inoremap * 8 inoremap ( 9 inoremap ) 0 inoremap _ - endfunction " DO the opposite to ReverseNumberRow -- give everything back function! NormalizeNumberRow() iunmap 1 iunmap 2 iunmap 3 iunmap 4 iunmap 5 iunmap 6 iunmap 7 iunmap 8 iunmap 9 iunmap 0 iunmap - "------ iunmap ! iunmap @ iunmap # iunmap $ iunmap % iunmap ^ iunmap & iunmap * iunmap ( iunmap ) iunmap _ inoremap () ()<Left> endfunction "call ToggleNumberRow() nnoremap <Mn> :call ToggleNumberRow()<CR> " Add use <CWORD> at the top of the file function! UseWord(word) let spec_cases = {'Dumper': 'Data::Dumper'} let my_word = a:word if has_key(spec_cases, my_word) let my_word = spec_cases[my_word] endif let was_used = search("^use.*" . my_word, "bw") if was_used > 0 echo "Used already" return 0 endif let last_use = search("^use", "bW") if 0 == last_use last_use = search("^package", "bW") if 0 == last_use last_use = 1 endif endif let use_string = "use " . my_word . ";" let res = append(last_use, use_string) return 1 endfunction function! UseCWord() let cline = line(".") let ccol = col(".") let ch = UseWord(expand("<cword>")) normal mu call cursor(cline + ch, ccol) endfunction function! GetWords(pattern) let cline = line(".") let ccol = col(".") call cursor(1,1) let temp_dict = {} let cpos = searchpos(a:pattern) while cpos[0] != 0 let temp_dict[expand("<cword>")] = 1 let cpos = searchpos(a:pattern, 'W') endwhile call cursor(cline, ccol) return keys(temp_dict) endfunction " Append the list of words, that match the pattern after cursor function! AppendWordsLike(pattern) let word_list = sort(GetWords(a:pattern)) call append(line("."), word_list) endfunction nnoremap <F7> :call UseCWord()<CR> " Useful to mark some code lines as debug statements function! MarkDebug() let cline = line(".") let ctext = getline(cline) call setline(cline, ctext . "##_DEBUG_") endfunction " Easily remove debug statements function! RemoveDebug() %g/#_DEBUG_/d endfunction au FileType perl,python inoremap <Md> <Esc>:call MarkDebug()<CR><Ins> au FileType perl,python inoremap <F6> <Esc>:call RemoveDebug()<CR><Ins> au FileType perl,python nnoremap <F6> :call RemoveDebug()<CR> " end Perl settings nnoremap <silent> <F8> :TlistToggle<CR> inoremap <silent> <F8> <Esc>:TlistToggle<CR><Esc> function! AlwaysCD() if bufname("") !~ "^scp://" && bufname("") !~ "^sftp://" && bufname("") !~ "^ftp://" lcd %:p:h endif endfunction autocmd BufEnter * call AlwaysCD() function! DeleteRedundantSpaces() let cline = line(".") let ccol = col(".") silent! %s/\s\+$//g call cursor(cline, ccol) endfunction au BufWrite * call DeleteRedundantSpaces() set nobackup set nowritebackup set cul colorscheme evening autocmd FileType python set formatoptions=wcrq2l autocmd FileType python set inc="^\s*from" autocmd FileType python so /usr/share/vim/vim72/indent/python.vim autocmd FileType c set si autocmd FileType mail set noai autocmd FileType mail set ts=3 autocmd FileType mail set tw=78 autocmd FileType mail set shiftwidth=3 autocmd FileType mail set expandtab autocmd FileType xslt set ts=4 autocmd FileType xslt set shiftwidth=4 autocmd FileType txt set ts=3 autocmd FileType txt set tw=78 autocmd FileType txt set expandtab " Move cursor together with the screen noremap <cj> j<ce> noremap <ck> k<cy> " Better Marks nnoremap ' ` 

Some fixes for common typos have saved me a surprising amount of time:

 :command WQ wq :command Wq wq :command W w :command Q q iab anf and iab adn and iab ans and iab teh the iab thre there 

I didn't realize how many of my 3200 .vimrc lines were just for my quirky needs and would be pretty uninspiring to list here. But maybe that's why Vim is so useful…

 iab AlP ABCDEFGHIJKLMNOPQRSTUVWXYZ iab MoN January February March April May June July August September October November December iab MoO Jan Feb Mar Apr May Jun Jul Aug Sep Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec iab NuM 12345678901234567890123456789012345678901234567890123456789012345678901234567890 iab RuL ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0 " Highlight every other line map ,<Tab> :set hls<CR>/\\n.*\\n/<CR> " This is for working across multiple xterms and/or gvims " Transfer/read and write one block of text between vim sessions (capture whole line): " Write nmap ;w :. w! ~/.vimxfer<CR> " Read nmap ;r :r ~/.vimxfer<CR> " Append nmap ;a :. w! >>~/.vimxfer<CR> 

My 242-line .vimrc is not that interesting, but since nobody mentioned it, I felt like I must share the two most important mappings that have enhanced my workflow besides the default mappings:

 map <Cj> :bprev<CR> map <Ck> :bnext<CR> set hidden " this will go along 

Seriously, switching buffers is the thing to do very often. Windows, sure, but everything doesn't fit the screen so nicely.

Similar set of maps for quick browsing of errors (see quickfix) and grep results:

 map <Cn> :cn<CR> map <Cm> :cp<CR> 

Simple, effortless and efficient.

 set nobackup set nocp set tabstop=4 set shiftwidth=4 set et set ignorecase set ai set ruler set showcmd set incsearch set dir=$temp " Make swap live in the %TEMP% directory syn on " Load the color scheme colo inkpot 

I use cscope from within vim (making great use of the multiple buffers). I use control-K to initiate most of the commands (stolen from ctags as I recall). Also, I've already generated the .cscope.out file.

if has("cscope")

 set cscopeprg=/usr/local/bin/cscope set cscopetagorder=0 set cscopetag set cscopepathcomp=3 set nocscopeverbose cs add .cscope.out set csverb " " cscope find " " 0 or s: Find this C symbol " 1 or d: Find this definition " 2 or g: Find functions called by this function " 3 or c: Find functions calling this function " 4 or t: Find assignments to " 6 or e: Find this egrep pattern " 7 or f: Find this file " 8 or i: Find files #including this file " map ^Ks :cs find 0 <CR>=expand("<cword>")<CR><CR> map ^Kd :cs find 1 <CR>=expand("<cword>")<CR><CR> map ^Kg :cs find 2 <CR>=expand("<cword>")<CR><CR> map ^Kc :cs find 3 <CR>=expand("<cword>")<CR><CR> map ^Kt :cs find 4 <CR>=expand("<cword>")<CR><CR> map ^Ke :cs find 6 <CR>=expand("<cword>")<CR><CR> map ^Kf :cs find 7 <CR>=expand("<cfile>")<CR><CR> map ^Ki :cs find 8 <CR>=expand("%")<CR><CR> 

万一

I keep my vimrc file up on github. 你可以在这里find它:

http://github.com/developernotes/vim-setup/tree/master

I'm on OS X, so some of these might have better defaults on other platforms, but regardless:

 syntax on set tabstop=4 set expandtab set shiftwidth=4 
 map = }{!}fmt^M} map + }{!}fmt -p '> '^M} set showmatch 

= is for reformatting normal paragraphs. + is for reformatting paragraphs in quoted emails. showmatch is for flashing the matching parenthesis/bracket when I type a close parenthesis or bracket.

Use the first available 'tags' file in the directory tree:

 :set tags=tags;/ 

Left and right are for switching buffers, not moving the cursor:

 map <right> <ESC>:bn<RETURN> map <left> <ESC>:bp<RETURN> 

Disable search highlighting with a single keypress:

 map - :nohls<cr> 
 set tabstop=4 softtabstop=4 shiftwidth=4 expandtab autoindent cindent set encoding=utf-8 fileencoding=utf-8 set nobackup nowritebackup noswapfile autoread set number set hlsearch incsearch ignorecase smartcase if has("gui_running") set lines=35 columns=140 colorscheme ir_black else colorscheme darkblue endif " bash like auto-completion set wildmenu set wildmode=list:longest inoremap <Cj> <Esc> " for lusty explorer noremap glr \lr noremap glf \lf noremap glb \lb " use ctrl-h/j/k/l to switch between splits map <cj> <cw>j map <ck> <cw>k map <cl> <cw>l map <ch> <cw>h " Nerd tree stuff let NERDTreeIgnore = ['\.pyc$', '\.pyo$'] noremap gn :NERDTree<Cr> " cd to the current file's directory noremap gc :lcd %:h<Cr> 

Put this in your vimrc:

 imap <Cl> <Space>=><Space> 

and never think about typing a hashrocket again. Yes, I know you don't need to in Ruby 1.9. But never mind that.

My full vimrc is here .

Well, you'll have to scavenge my configs yourself. 玩的开心。 Mostly it's just my desired setup, including mappings and random syntax-relevant stuff, as well as folding setup and some plugin configuration, a tex-compilation parser etc.

BTW, something I found extremely useful is "highlight word under cursor":

  highlight flicker cterm=bold ctermfg=white au CursorMoved <buffer> exe 'match flicker /\V\<'.escape(expand('<cword>'), '/').'\>/' 

Note that only cterm and termfg are used, because I don't use gvim . If you want that to work in gvim just replac them with gui and guifg , respectively.

I've tried to keep my .vimrc as generally useful as possible.

A handy trick in there is a handler for .gpg files to edit them securely:

 au BufNewFile,BufReadPre *.gpg :set secure vimi= noswap noback nowriteback hist=0 binary au BufReadPost *.gpg :%!gpg -d 2>/dev/null au BufWritePre *.gpg :%!gpg -e -r 'name@email.com' 2>/dev/null au BufWritePost *.gpg u 

1) I like a statusline (with the filename, ascii value (decimal), hex value, and the standard lines, cols, and %):

 set statusline=%t%h%m%r%=[%b\ 0x%02B]\ \ \ %l,%c%V\ %P " Always show a status line set laststatus=2 "make the command line 1 line high set cmdheight=1 

2) I also like mappings for split windows.

 " <space> switches to the next window (give it a second) " <space>n switches to the next window " <space><space> switches to the next window and maximizes it " <space>= Equalizes the size of all windows " + Increases the size of the current window " - Decreases the size of the current window :map <space> <cW>w :map <space>n <cW>w :map <space><space> <cW>w<cW>_ :map <space>= <cW>= if bufwinnr(1) map + <cW>+ map - <cW>- endif 

There isn't much actually in my .vimrc (even if it has 850 lines). Mostly settings and a few common and simple mappings that I was too lazy to extract into plugins.

If you mean "template-files" by "auto-classes", I'm using a template-expander plugin — on this same site, you'll find the ftplugins I've defined for C&C++ editing, some may be adapted to C# I guess.

Regarding the refactoring aspect, there is a tip dedicated to this subject on http://vim.wikia.com ; IIRC the example code is for C#. It inspired me a refactoring plugin that still needs of lot of work (it needs to be refactored actually).

You should have a look at the archives of vim mailing-list, specially the subjects about using vim as an effective IDE. Don't forget to have a look at :make, tags, …

HTH,

My .vimrc includes (among other, more usefull things) the following line:

 set statusline=%2*%n\|%<%*%-.40F%2*\|\ %2*%M\ %3*%=%1*\ %1*%2.6l%2*x%1*%1.9(%c%V%)%2*[%1*%P%2*]%1*%2B 

I got bored while learning for my high school finals.

Here is my .vimrc. I use Gvim 7.2

 set guioptions=em set showtabline=2 set softtabstop=2 set shiftwidth=2 set tabstop=2 " Use spaces instead of tabs set expandtab set autoindent " Colors and fonts colorscheme inkpot set guifont=Consolas:h11:cANSI "TAB navigation like firefox :nmap <CS-tab> :tabprevious<cr> :nmap <C-tab> :tabnext<cr> :imap <CS-tab> <ESC>:tabprevious<cr>i :imap <C-tab> <ESC>:tabnext<cr>i :nmap <Ct> :tabnew<cr> :imap <Ct> <ESC>:tabnew<cr>i :map <Cw> :tabclose<cr> " No Backups and line numbers set nobackup set number set nuw=6 " swp files are saved to %Temp% folder set dir=$temp " sets the default size of gvim on open set lines=40 columns=90 

What's in my .vimrc ?

 ngn@macavity:~$ cat .vimrc " This file intentionally left blank 

The real config files lie under ~/.vim/ :)

And most of the stuff there is parasiting on other people's efforts, blatantly adapted from vim.org to my editing advantage.