什麼我的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那行去掉。