天天看點

史上最強大vimrc

什麼我的vim這麼難用?不能文法高亮,沒有折行,不能打開多個視窗多個buffer,不能……

為什麼别人用幾個鍵就可以完成一個很複雜的功能,而我不能?

為什麼别人的vim看起來和我的很不一樣?

……

當你開始問這些問題的時候,是時候去檢查一下你的vimrc了。

當vim在啟動時,如果沒有找到vimrc或gvimrc,它預設工作VI相容的模式。這意味着,你隻能使用VI所具備的功能,而vim中的大量擴充功能将無法使用。也許這就是你的vim如此難用的原因。

vim中自帶了一個vimrc例子,讓我們從這個例子開始吧。

下面我以Linux下的vim為例,windows版本的vim,會在後面提到。

示例的vimrc(名為vimrc_example.vim)通常位于/usr/share/vim/vimXXX/目錄下,其中vimXXX與你所使用的vim版本有關。

首先把這個示例的vimrc拷貝到相應的目錄,在Linux下,應該把它拷貝到你的home目錄下,名字為”.vimrc”,下面是shell指令:

cp /usr/share/vim/vim70/vimrc_example.vim ~/.vimrc       

或者你在vim中執行下面的指令,和上面的shell指令完成相同的功能:

:!cp $vimRUNTIME/vimrc_example.vim ~/.vimrc       

現在,你退出vim後再進入,你的vim和剛才已經不一樣了。

你可以先讀一下你的vimrc,看看它都設定了什麼:

:e ~/.vimrc       

這是一個注釋良好的檔案,不需要多解釋。

我們可以直接寫一個vimrc放在~目錄下即可

vim ~/.vimrc

即可。

在http://www.amix.dk/vim/vimrc.html有一個非常強大的vimrc,有人戲稱為”史上最強的vimrc”,或許有些言過其實。不過,如果你通讀了這個vimrc,相信能從中學到很多……

這裡有一個redguardtoo修改過的版本,可以對照參考一下。

set nocompatible            " 關閉 vi 相容模式

syntax on                   " 自動文法高亮

colorscheme molokai         " 設定配色方案

set number                  " 顯示行号

set cursorline              " 突出顯示目前行

set ruler                   " 打開狀态欄标尺

set shiftwidth=4            " 設定 << 和 >> 指令移動時的寬度為 4

set softtabstop=4           " 使得按倒退鍵時可以一次删掉 4 個空格

set tabstop=4               " 設定 tab 長度為 4

set nobackup                " 覆寫檔案時不備份

set autochdir               " 自動切換目前目錄為目前檔案所在的目錄

filetype plugin indent on   " 開啟插件

set backupcopy=yes          " 設定備份時的行為為覆寫

set ignorecase smartcase    " 搜尋時忽略大小寫,但在有一個或以上大寫字母時仍保持對大小寫敏感

set nowrapscan              " 禁止在搜尋到檔案兩端時重新搜尋

set incsearch               " 輸入搜尋内容時就顯示搜尋結果

set hlsearch                " 搜尋時高亮顯示被找到的文本

set noerrorbells            " 關閉錯誤資訊響鈴

set novisualbell            " 關閉使用可視響鈴代替呼叫

set t_vb=                   " 置空錯誤鈴聲的終端代碼

" set showmatch               " 插入括号時,短暫地跳轉到比對的對應括号

" set matchtime=2             " 短暫跳轉到比對括号的時間

set magic                   " 設定魔術

set hidden                  " 允許在有未儲存的修改時切換緩沖區,此時的修改由 vim 負責儲存

set guioptions-=T           " 隐藏工具欄

set guioptions-=m           " 隐藏菜單欄

set smartindent             " 開啟新行時使用智能自動縮進

set backspace=indent,eol,start

                            " 不設定在插入狀态無法用倒退鍵和 Delete 鍵删除回車符

set cmdheight=1             " 設定指令行的行數為 1

set laststatus=2            " 顯示狀态欄 (預設值為 1, 無法顯示狀态欄)

set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ %c:%l/%L%)\ 

                            " 設定在狀态行顯示的資訊

set foldenable              " 開始折疊

set foldmethod=syntax       " 設定文法折疊

set foldcolumn=0            " 設定折疊區域的寬度

setlocal foldlevel=1        " 設定折疊層數為

" set foldclose=all           " 設定為自動關閉折疊                            

" nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR>

                            " 用空格鍵來開關折疊





" return OS type, eg: windows, or linux, mac, et.st..

function! MySys()

    if has("win16") || has("win32") || has("win64") || has("win95")

        return "windows"

    elseif has("unix")

        return "linux"

    endif

endfunction



" 使用者目錄變量$VIMFILES

if MySys() == "windows"

    let $VIMFILES = $VIM.'/vimfiles'

elseif MySys() == "linux"

    let $VIMFILES = $HOME.'/.vim'

endif



" 設定doc文檔目錄

let helptags=$VIMFILES.'/doc'



" 設定字型 以及中文支援

if has("win32")

    set guifont=Inconsolata:h12:cANSI

endif



" 配置多語言環境

if has("multi_byte")

    " UTF-8 編碼

    set encoding=utf-8

    set termencoding=utf-8

    set formatoptions+=mM

    set fencs=utf-8,gbk



    if v:lang =~? '^\(zh\)\|\(ja\)\|\(ko\)'

        set ambiwidth=double

    endif



    if has("win32")

        source $VIMRUNTIME/delmenu.vim

        source $VIMRUNTIME/menu.vim

        language messages zh_CN.utf-8

    endif

else

    echoerr "Sorry, this version of (g)vim was not compiled with +multi_byte"

endif



" Buffers操作快捷方式!

nnoremap <C-RETURN> :bnext<CR>

nnoremap <C-S-RETURN> :bprevious<CR>



" Tab操作快捷方式!

nnoremap <C-TAB> :tabnext<CR>

nnoremap <C-S-TAB> :tabprev<CR>



"關于tab的快捷鍵

" map tn :tabnext<cr>

" map tp :tabprevious<cr>

" map td :tabnew .<cr>

" map te :tabedit

" map tc :tabclose<cr>



"視窗分割時,進行切換的按鍵熱鍵需要連接配接兩次,比如從下方視窗移動

"光标到上方視窗,需要<c-w><c-w>k,非常麻煩,現在重映射為<c-k>,切換的

"時候會變得非常友善.

nnoremap <C-h> <C-w>h

nnoremap <C-j> <C-w>j

nnoremap <C-k> <C-w>k

nnoremap <C-l> <C-w>l



"一些不錯的映射轉換文法(如果在一個檔案中混合了不同語言時有用)

nnoremap <leader>1 :set filetype=xhtml<CR>

nnoremap <leader>2 :set filetype=css<CR>

nnoremap <leader>3 :set filetype=javascript<CR>

nnoremap <leader>4 :set filetype=php<CR>



" set fileformats=unix,dos,mac

" nmap <leader>fd :se fileformat=dos<CR>

" nmap <leader>fu :se fileformat=unix<CR>



" use Ctrl+[l|n|p|cc] to list|next|previous|jump to count the result

" map <C-x>l <ESC>:cl<CR>

" map <C-x>n <ESC>:cn<CR>

" map <C-x>p <ESC>:cp<CR>

" map <C-x>c <ESC>:cc<CR>





" 讓 Tohtml 産生有 CSS 文法的 html

" syntax/2html.vim,可以用:runtime! syntax/2html.vim

let html_use_css=1



" Python 檔案的一般設定,比如不要 tab 等

autocmd FileType python set tabstop=4 shiftwidth=4 expandtab

autocmd FileType python map <F12> :!python %<CR>



" 選中狀态下 Ctrl+c 複制

vmap <C-c> "+y



" 打開javascript折疊

let b:javascript_fold=1

" 打開javascript對dom、html和css的支援

let javascript_enable_domhtmlcss=1

" 設定字典 ~/.vim/dict/檔案的路徑

autocmd filetype javascript set dictionary=$VIMFILES/dict/javascript.dict

autocmd filetype css set dictionary=$VIMFILES/dict/css.dict

autocmd filetype php set dictionary=$VIMFILES/dict/php.dict



"-----------------------------------------------------------------

" plugin - bufexplorer.vim Buffers切換

" \be 全屏方式檢視全部打開的檔案清單

" \bv 左右方式檢視   \bs 上下方式檢視

"-----------------------------------------------------------------





"-----------------------------------------------------------------

" plugin - taglist.vim  檢視函數清單,需要ctags程式

" F4 打開隐藏taglist視窗

"-----------------------------------------------------------------

if MySys() == "windows"                " 設定windows系統中ctags程式的位置

    let Tlist_Ctags_Cmd = '"'.$VIMRUNTIME.'/ctags.exe"'

elseif MySys() == "linux"              " 設定windows系統中ctags程式的位置

    let Tlist_Ctags_Cmd = '/usr/bin/ctags'

endif

nnoremap <silent><F4> :TlistToggle<CR>

let Tlist_Show_One_File = 1            " 不同時顯示多個檔案的tag,隻顯示目前檔案的

let Tlist_Exit_OnlyWindow = 1          " 如果taglist視窗是最後一個視窗,則退出vim

let Tlist_Use_Right_Window = 1         " 在右側視窗中顯示taglist視窗

let Tlist_File_Fold_Auto_Close=1       " 自動折疊目前非編輯檔案的方法清單

let Tlist_Auto_Open = 0

let Tlist_Auto_Update = 1

let Tlist_Hightlight_Tag_On_BufEnter = 1

let Tlist_Enable_Fold_Column = 0

let Tlist_Process_File_Always = 1

let Tlist_Display_Prototype = 0

let Tlist_Compact_Format = 1





"-----------------------------------------------------------------

" plugin - mark.vim 給各種tags标記不同的顔色,便于觀看調式的插件。

" \m  mark or unmark the word under (or before) the cursor

" \r  manually input a regular expression. 用于搜尋.

" \n  clear this mark (i.e. the mark under the cursor), or clear all highlighted marks .

" \*  目前MarkWord的下一個     \#  目前MarkWord的上一個

" \/  所有MarkWords的下一個    \?  所有MarkWords的上一個

"-----------------------------------------------------------------





"-----------------------------------------------------------------

" plugin - NERD_tree.vim 以樹狀方式浏覽系統中的檔案和目錄

" :ERDtree 打開NERD_tree         :NERDtreeClose    關閉NERD_tree

" o 打開關閉檔案或者目錄         t 在标簽頁中打開

" T 在背景标簽頁中打開           ! 執行此檔案

" p 到上層目錄                   P 到根目錄

" K 到第一個節點                 J 到最後一個節點

" u 打開上層目錄                 m 顯示檔案系統菜單(添加、删除、移動操作)

" r 遞歸重新整理目前目錄             R 遞歸重新整理目前根目錄

"-----------------------------------------------------------------

" F3 NERDTree 切換

map <F3> :NERDTreeToggle<CR>

imap <F3> <ESC>:NERDTreeToggle<CR>





"-----------------------------------------------------------------

" plugin - NERD_commenter.vim   注釋代碼用的,

" [count],cc 光标以下count行逐行添加注釋(7,cc)

" [count],cu 光标以下count行逐行取消注釋(7,cu)

" [count],cm 光标以下count行嘗試添加塊注釋(7,cm)

" ,cA 在行尾插入 /* */,并且進入插入模式。 這個指令友善寫注釋。

" 注:count參數可選,無則預設為選中行或目前行

"-----------------------------------------------------------------

let NERDSpaceDelims=1       " 讓注釋符與語句之間留一個空格

let NERDCompactSexyComs=1   " 多行注釋時樣子更好看





"-----------------------------------------------------------------

" plugin - DoxygenToolkit.vim  由注釋生成文檔,并且能夠快速生成函數标準注釋

"-----------------------------------------------------------------

let g:DoxygenToolkit_authorName="Asins - asinsimple AT gmail DOT com"

let g:DoxygenToolkit_briefTag_funcName="yes"

map <leader>da :DoxAuthor<CR>

map <leader>df :Dox<CR>

map <leader>db :DoxBlock<CR>

map <leader>dc a /*  */<LEFT><LEFT><LEFT>





"-----------------------------------------------------------------

" plugin – ZenCoding.vim 很酷的插件,HTML代碼生成

" 插件最新版:http://github.com/mattn/zencoding-vim

" 常用指令可看:http://nootn.com/blog/Tool/23/

"-----------------------------------------------------------------





"-----------------------------------------------------------------

" plugin – checksyntax.vim    JavaScript常見文法錯誤檢查

" 預設快捷方式為 F5

"-----------------------------------------------------------------

let g:checksyntax_auto = 0 " 不自動檢查



"-----------------------------------------------------------------

" plugin - NeoComplCache.vim    自動補全插件

"-----------------------------------------------------------------

let g:AutoComplPop_NotEnableAtStartup = 1

let g:NeoComplCache_EnableAtStartup = 1

let g:NeoComplCache_SmartCase = 1

let g:NeoComplCache_TagsAutoUpdate = 1

let g:NeoComplCache_EnableInfo = 1

let g:NeoComplCache_EnableCamelCaseCompletion = 1

let g:NeoComplCache_MinSyntaxLength = 3

let g:NeoComplCache_EnableSkipCompletion = 1

let g:NeoComplCache_SkipInputTime = '0.5'

let g:NeoComplCache_SnippetsDir = $VIMFILES.'/snippets'

" <TAB> completion.

inoremap <expr><TAB> pumvisible() ? "\<C-n>" : "\<TAB>"

" snippets expand key

imap <silent> <C-e> <Plug>(neocomplcache_snippets_expand)

smap <silent> <C-e> <Plug>(neocomplcache_snippets_expand)

"-----------------------------------------------------------------

" plugin - matchit.vim   對%指令進行擴充使得能在嵌套标簽和語句之間跳轉

" % 正向比對      g% 反向比對

" [% 定位塊首     ]% 定位塊尾

"-----------------------------------------------------------------

"-----------------------------------------------------------------

" plugin - vcscommand.vim   對%指令進行擴充使得能在嵌套标簽和語句之間跳轉

" SVN/git管理工具

"-----------------------------------------------------------------


"-----------------------------------------------------------------

" plugin – a.vim

"-----------------------------------------------------------------           

(另外有一個關于tab的設定:

摘自 Vim 手冊:

選項:

1. tabstop:表示一個 tab 顯示出來是多少個空格,預設 8

2. softtabstop:在編輯的時候(比如按倒退或 tab 鍵)一個 tab 是多少個空格(有點不好了解。。。我也沒完全弄明白)

3. expandtab/noexpandtab:将 tab 擴充/不擴充成空格

4. shiftwidth:每一級縮進是多少個空格

5. smarttab:根據檔案中其他地方的縮進空格個數來确定一個 tab 是多少個空格

指令:

:[range]retab [new_tabstop]:應用新的 tabstop 值,替換所有的 tab,如果設定了expandtab,還會把檔案中 tab 都替換成空格。

幾種常見用法:

1. 保留 tab。讓 tabstop 保持預設,将 softtabstop 和 shiftwidth 設為 4,并設定 noexpandtab。這樣檔案中本來有 tab 的話會保留,新增的縮進處也會使用 tab。

2. 全部用空格。将 tabstop 和 shiftwidth 設定成相同的值,如 4,并設定 expandtab。這樣新增的縮進會用空格,你按下 tab 鍵,出來的也全是空格。如果檔案裡本來就有 tab 的話,可以再用一次 :retab 指令,将所有 tab 擴充成空格,這樣就完美了。

我一般在 .vimrc 中這樣設定:

set smarttab

set tabstop=4

set shiftwidth=4

set expandtab

相關日志:

Vim 的 tab 設定(2): 使用 autocmd 為不同的檔案類型應用不同的 tab 設定:javascript:void(0)

如何更改gnome-terminal下使用vim時不同模式下的光标形狀

buntu中文論壇上提到的設定Vim的guicursor好像隻對gui下的Vim有效,,有興趣的可以:help guicursor看看那眼花缭亂的英文說明, 最後在Vim的Wikia找到了正解:Change cursor shape in different modes(令人心動的标題啊)

将下面不同終端環境的代碼添加到你的 .vimrc 就好了:

For the Gnome-Terminal(version 2.26)

if

has(

"autocmd"

)

au InsertEnter * silent execute 

"!gconftool-2 --type string --set /apps/gnome-terminal/profiles/Default/cursor_shape ibeam"

au InsertLeave * silent execute 

"!gconftool-2 --type string --set /apps/gnome-terminal/profiles/Default/cursor_shape block"

au VimLeave * silent execute 

"!gconftool-2 --type string --set /apps/gnome-terminal/profiles/Default/cursor_shape ibeam"

endif

For Konsole in KDE4

let

&t_SI = 

"\]50;CursorShape=1\x7"

let

&t_EI = 

"\]50;CursorShape=0\x7"

對于Gnome-Terminal如果完全按照上面提供的代碼添加,可能會有些問題,比如我遇到的,修改之後運作Vim不同模式下滑鼠形狀切換正 常,但是退出Vim後會把終端預設到滑鼠形狀block改為ibeam,并且下次使用Vim的時候不同模式下到滑鼠形狀都是ibeam。

解決的方法是把 VimLeave那行去掉。

下一篇: curl指令

繼續閱讀