用Vim編程——配置與技巧

此頁由 Linux Wiki使用者Chenxing 於 2012年12月18日 (星期二) 08:12 的最後更改。 在lzhlzhBccd、Linux Wiki使用者Minux其他的工作基礎上。

出自Linux Wiki

(重定向自VI(VIM)编写程序技巧
提示:此文已超过 11 年(4358 天)未更新,如发现内容过时或有误,欢迎改进:)
Note.gif
謹慎轉載:
雖然您有在保留本文鏈接的條件下轉載本文的權利,但考慮到轉載不當可能破壞文檔排版,且難以實時展現文檔的最新版本,請在轉載前慎重考慮。如果您發現文本內容有錯誤或不足,可以登錄後直接更正或改進;如果不確認應如何改進,也可以使用 TODO 模板留下標記。

本文介紹如何用強大的文本編輯器 Vim編程。只要配置得當,效果堪比一個IDE。

Hint.gif
提示:
針對各具體語言,還有些針對性的設置方法,如配置基於Vim的Python編程環境

目錄

配置

基本配置[1] [2]

"开启语法高亮
syntax on
"依文件类型设置自动缩进
filetype indent plugin on
 
"显示当前的行号列号:
set ruler
"在状态栏显示正在输入的命令
set showcmd
 
"关闭/打开配对括号高亮
"NoMatchParen
DoMatchParen

行號的顯示與隱藏[3]

"显示行号:
set number
"为方便复制,用<F2>开启/关闭行号显示:
nnoremap <F2> :set nonumber!<CR>:set foldcolumn=0<CR>

啟用Modeline(即允許被編輯的文件以注釋的形式設置Vim選項,詳見Vim Wiki: Modeline magic[4]

set modeline

如果終端使用的是深色背景:

"为深色背景调整配色
set background=dark

插件管理

下文的配置很多都依賴於第三方開發的 Vim 插件。為了方便地安裝和維護這些插件,推薦先安裝一種插件管理工具,目前較為流行的是 Vundlepathogen。二者功能類似,但 Vundle 的配置更靈活, pathogen 則相對簡潔。二者都能很好地與Git結合,安裝插件十分方便。

如果你使用 Git 管理你的配置文件,那麼還可以將 Pathogen 或 Vundle 與 Git 的 Submodule 功能管理插件結合[5],使得在多台電腦間同步插件及在本地更新插件變得十分便捷。

# 在存放配置文件的主文件夹下,添加一个 submodule
git submodule add https://github.com/gmarik/vundle.git .vim/bundle/vundle
 
# 用类似的办法添加多个插件后,以后升级插件只需:
git submodule update
 
# 如果其它电脑 checkout 出配置文件后,要先:
git submodule init

插件管理工具無需通過系統的包管理系統安裝,只要將需要的文件放在 ~/.vim/ 目錄中即可。這樣,一套配置文件也可以方便地用在多個不同的系統環境中。

代碼補全

Vim 7已經內置了代碼補全功能[6],補全操作可分為兩種:

關鍵字補全
即簡單地補全到文檔中已有的詞,快捷鍵為 Ctrl-NCtrl-P
智能補全
Vim 7中引入 Omni Complete,可根據語義補全,快捷鍵為 Ctrl-X Ctrl-O

Vim的補全菜單操作方式與一般IDE的方式不同,可加入如下設置[7]

"让Vim的补全菜单行为与一般IDE一致(参考VimTip1228)
set completeopt+=longest
 
"离开插入模式后自动关闭预览窗口
autocmd InsertLeave * if pumvisible() == 0|pclose|endif
 
"回车即选中当前项
inoremap <expr> <CR>       pumvisible() ? "\<C-y>" : "\<CR>"
 
"上下左右键的行为
inoremap <expr> <Down>     pumvisible() ? "\<C-n>" : "\<Down>"
inoremap <expr> <Up>       pumvisible() ? "\<C-p>" : "\<Up>"
inoremap <expr> <PageDown> pumvisible() ? "\<PageDown>\<C-p>\<C-n>" : "\<PageDown>"
inoremap <expr> <PageUp>   pumvisible() ? "\<PageUp>\<C-p>\<C-n>" : "\<PageUp>"

如需自動補全,可安裝AutoComplPop插件,安裝後如需在補全是顯示文檔(預覽),可加入設置:

let g:acp_completeoptPreview = 1

注釋管理

經常要將一段代碼注釋掉或取消注釋,而尤其對於某些只支持單行注釋的語言來說,逐行加註釋很麻煩,這時快速注釋(或取消注釋)代碼的插件就顯得很有用了。

常見的注釋管理插件為The NERD Commenter,默認支持多種語言,使用方法也很簡單:只需在可視(V)模式中選擇一段代碼,按下\cc加逐行注釋,\cu取消注釋,\cm添加塊注釋。

如有其它需求,也可考慮commentsEnhCommentify等插件。

縮進

使用自動縮進可能需要設置,vim中對自動縮進的詳細設置辦法見Vim代碼縮進設置

在不同的模式中調整縮進的方法不同:

插入模式
Ctrl-T增加縮進,Ctrl-D減小縮進。
命令模式
>> 右縮進, << 左縮進,注意n<< n>>是縮進多行,如4>>
可視模式
< > 用於左右縮進, n< n> 可做多節縮進,如 2>

另外,= 可對選中的部分進行自動縮進;]p可以實現p的粘貼功能,並自動縮進。

代碼瀏覽與跳轉

代碼跳轉類似於IDE中的Ctrl+點擊功能。與代碼補全類似,代碼瀏覽工具亦可分為基於文本分析的和基於代碼理解的兩類。

簡單代碼跳轉

在命令模式下可直接使用下述指令:[8]

跳轉到定義
gd到局部變數的定義,gD到全局變數的定義
搜索
*, # 可對游標處的詞向前/向後做全詞搜索,g*, g# 做相對應的非全詞匹配搜索
代碼塊首尾
[[, ]] 可跳到當前代碼塊起始或結束的大括弧處。
括弧首尾
% 可在配對的括弧、塊首尾之前跳轉。
位置歷史
Ctrl-O 在歷史記錄中後台,Ctrl-I 則為前進。

基於代碼理解的跳轉

該功能依賴於ctags工具。[9]安裝好ctags後,在存放代碼的文件夾運行

ctags -R .

即可生成一個描述代碼結構的tags文件。

Hint.gif
提示:
ctags的功能很強大,更詳細的配置請參考其文檔。

建議在~/.vimrc中添加如下配置以使Vim在父目錄中尋找tags文件[10]

set tags=tags;/

設置好後,可在Vim中使用如下功能:Ctrl-]轉至最佳匹配的相應Tag,Ctrl-T返回上一個匹配。如果有多個匹配,g Ctrl-]可顯示所有備選的tags。如有需要,可互換Ctrl-]g Ctrl-] [11]

"在普通和可视模式中,将<c-]>与g<c-]>互换
nnoremap <c-]> g<c-]>
vnoremap <c-]> g<c-]>
 
nnoremap g<c-]> <c-]>
vnoremap g<c-]> <c-]>

就地編譯和錯誤處理

使用:make可調用make命令編譯程序,配合Vim內置的QuickFix功能,可以像IDE一樣打開一個窗口展示編譯錯誤和警告,通過它還可以方便地跳轉到各編譯錯誤的產生位置。

常用的命令有:cw[indow](如有錯誤打開quickfix窗口)、:cn(跳到下一個錯誤)、:cp(跳到前一個錯誤)等,具體可:help quickfix

如果想在有錯時自動打開quickfix窗口[12]

" 编译后,如有错误则打开quickfix窗口。(光标仍停留在源码窗口)
"
" 注意:需要开启netsting autocmd
autocmd QuickFixCmdPost [^l]* nested cwindow
autocmd QuickFixCmdPost    l* nested lwindow

默認情況下,:mak[e]會跳轉到第一個錯誤,如果不想啟用這個功能,請使用:make!

代碼摺疊

代碼較長時可啟用代碼摺疊功能,如按語法高亮元素摺疊:

set foldmethod=syntax
"默认情况下不折叠
set foldlevel=99

隨後即可使用z系列命令管理代碼摺疊。如za會翻轉當前位置的摺疊狀態,zA會遞歸翻轉當前層所有代碼的摺疊狀態等。當然也可以把功能鍵映射到za:

map <F3> za

查看文檔

K 鍵可用於查看當前函數的文檔。

其它插件

近來仍被積極維護的代碼託管在 GitHub 上的插件[13]

Fugitive
讓 Vim 更好地與 Git 整合。
Powerline
炫麗實用的狀態欄
Tagbar
taglist 更現代的代碼結構瀏覽工具
The NERD tree
以樹形結構瀏覽文件夾中的文件
Syntastic
語法檢查
surround.vim
快速刪除/修改游標周圍配對的括弧

其它常用插件[14]

Project
方便管理工程中的文件
snipmate.vim
在編輯中實現模板展開
a.vim
.cpp/.h等文件對中跳轉
matchit.zip
增強%的功能
winmanager
將文件管理窗口和taglist堆疊起來。

相關文檔

參考資料

  1. How to setup VIM properly for editing Python files - *.py (StackOverflow)
  2. amix的vimrc
  3. Python and vim: Make your own IDE (2009.2)
  4. Python官網上的Vim介紹
  5. Git Tools - Submodules
  6. 細說 Vim 7 之新特性-LinuxToy
  7. VimTip 1228: Improve completion popup menu
  8. Vim文檔
  9. Browsing programs with tags -- Vim Tips Wiki
  10. Vim and Ctags tips and tricks
  11. use :tjump instead of :tag vim on pressing ctrl-] (StackOverflow)
  12. Automatically open the quickfix window on :make
  13. LinuxTOY Xu Xiaodong 的VimEnv
  14. 手把手教你把Vim改裝成一個IDE編程環境(圖文)

本文对您有帮助?分享给更多朋友!

反馈与讨论

发现文档不全面、有错误却没时间编辑文档?想分享自己的经验或见解?欢迎在此留言、讨论。
简体繁体转换