Align
一個對齊的插件,用來排版,面對一堆亂七八糟的代碼時,用來對齊代碼,功能強大,不過用到
的機會不多
http://www.vim.org/scripts/script.php?script_id=521
Mru
http://www.vim.org/scripts/script.php?script_id=521
給vim增加MRU功能,也就是保留最近打開的文件記錄,:MRU打開,q退出,很方便,有過一個支持
菜單的類似的插件
不過對于我這樣的不用菜單的用戶,還是這個命令行的好用一點,因為經常使用,所以我映射
到了F2
功能強大的代碼注釋工具,用來注釋或者取消注釋,支持很多語言,可以對文本塊操作,寫代碼
NERD_comments
功能強大的代碼注釋工具,用來注釋或者取消注釋,支持很多語言,可以對文本塊操作,寫代碼
離不了,呵呵
最常用到的快捷鍵是"c
a.vim
在.c/.h之間切換,寫代碼必備
bufexplorer.vim
列出當前打開的buffer,可以很容易的切換到和刪除選定的buffer,必備插件之一
c.vim
c/c++ support,讓你用編寫c/c++程序時如虎添翼,有很多貼心的功能,每個功能都有快捷鍵
,不過一部分和NERD_comments沖突
如果經常編寫一些單文件的c程序,但是不想寫makefile,用這個,他幫你完成,F9編譯并鏈接,
ctrl-F9運行
calendar.vim
日歷插件,有了它,用vim來寫日記很方便
csExplorer.vim
color theme瀏覽插件,列出所有的vim color theme到一個列表中,選中后按回車即可應用相
應的color theme,試驗color theme時再也不用一次次輸入:colo theme_name了,從上百個
color theme中選擇自己喜歡的theme時有用
cscope_maps.vim
cscope的vim插件,提供快捷鍵操縱cscope,好東東,如果你在用cscope的話
favex.vim
FavEx : Favorite file and directory explorer ,可以添加目錄和文件到收藏夾,可以把
經常編輯的文件添加到收藏夾來,在文件打開以后,"ff新增文件到收藏夾,"fd新增目錄到
收藏夾
lookupfile.vim
五星級推薦的好插件!我覺得它是vim上最偉大的插件之一,提供多種方式查找文件,讓你在復
雜的目?樹中也能輕松自如找到你要的文件
matchit.vim
擴展了vim的%功能,讓%可以匹配的,不再僅僅是括號,支持多種語言.必備插件之一
parenquote.vim
給選中的文字加上引號,支持( { [ < ' " `,選中后,"加上你想要添加的符號,比如選中abc
后,"(,得到(abc)
snippetEmu.vim
擴展了vim的abbr縮寫功能,支持占位符,支持變量替換,強烈推薦
taglist.vim
vim的代碼瀏覽器,生成函數列表,支持跳轉,可以根據光標λ置查詢到當前的函數名,使用
vim的程序員必備!個人認為是最偉大的插件之一
utl.vim
給vim增加url的識別功能,但是功能遠不只是支持url,還有更多,詳情見utl的幫助
vcscommand.vim
給vim整合了cvs/subversion功能,不用離開vim環境也能執行常用的cvs/subversion操作了
viki.vim
vim的wiki,沒怎么用過,據說很好用,詳情可以看滇狐的主頁
http://edyfox.codecarver.org/html/viki.html
vis.vim
可以對選中的文本塊執行ex操作,尤其是visual block模式下,vim自己是不支持的.選中后,
:B 加上ex命令
visincr.vim
給vim增加生成遞增或者遞減數列的功能,支持十進制,十六進制,日期,星期等,功能強大靈活
winmanager.vim
給vim增加IDE的功能,提供目錄瀏覽和buffer瀏覽功能,因為顯示器太小,感覺太占空間,所以
單獨使用bufexplorer,而且現在vim7的netrw功能也夠強大,所以感覺比較雞肋,而且貌似很
久沒有更新,所以基本不用
yankring.vim
類似emacs的king ring,給vim的yank也增加緩沖,vim本身只緩沖刪除的字符串,不緩沖yank
的內容
Posted by 1+1=2 at 6:24 AM 0 comments ?
Labels: vim
Tuesday, October 10, 2006
VIM 新手指南(zz)
術語約定: 如果沒有特殊說明, 本文中提到的 VIM 指的是圖形界面的 gvim 與字符界面的 vim 的統稱, gvim 專指圖形界面, vim 專指字符界面。
1.從官方網站(http://www.vim.org/download.php)下載windows版本的gvim安裝。
2.下載中文幫助文檔安裝文件(http://vimcdoc.sourceforge.net/),這個(http://vcd.gro.clinux.org/)是簡體中文的鏡像站點。
注意:如果安裝vim的中文幫助,安裝完成后第一次自動啟動時可以使用中文的,但退出后又還原為英文了,如果出現這種情況,只要把"vim"vimfiles"doc下的tags-cn另存為tags,再試試吧,中文出現了。
1 讓 gvim 正常工作
VIM 是一個非常強大的編輯器, 可惜的是, 無論是 Windows 還是 Linux, gvim 都存在一些小故障,令第一眼看到它的初學者感到非常不愉快。 為了不讓更多的初學者在第一次接觸 gvim 時被它嚇跑, 我在這份教程中首先解決 gvim 令人感到不快的一些小問題, 希望能讓更多的用戶平滑地過渡到 gvim 的環境中來。
VIM 的安裝很簡單, Windows 下只要雙擊安裝程序, 一路 next 下去就可以了 (注意到選擇安裝組件的時候請選擇全部組件, 默認安裝方式下會少裝幾個有用的小東西)。 Linux 下各個發行版安裝方式都不一樣, 但總體來說都不難裝。 因此, 本文假設你已經成功地安裝了一份 VIM, 不再介紹 VIM 的安裝步驟。
1.1 屏蔽系統自帶的 .vimrc
VIM 是一個高度可定制的編輯器, 它通過配置文件 .vimrc (Windows 下是 _vimrc)來定制程序的各種行為。 如果你沒有編寫 .vimrc 的話, 它會使用系統自帶的一份默認配置文件。 可惜的是, 系統默認的配置文件存在種種很令人不快的問題。 例如 Windows 下加載 mswin.vim 帶來的困惑, 和 Linux 下無法處理中文等等故障。 因此, 我們在安裝了 VIM 之后, 第一件要做的事情就是創建自己的 .vimrc。 只要編寫一份你自己的配置文件, VIM 便不會再加載系統自帶的配置文件。
如果你是 Linux 用戶, 請在你的 $HOME 目錄下放置一個空文件, 文件名叫 .vimrc, 方法如下:
$ cd??????????????????????????? # 使用不帶參數的 cd 命令,切換到 $HOME 目錄
$ touch .vimrc????????????????? # 使用 touch 命令創建一個空白文件
如果你是 Windows 用戶, 請在你的 %HOME% 目錄下放置一個空文件, 文件名叫 _vimrc。 步驟如下:
?? 1. 在資源管理器中切換到 %HOME% 目錄;
?? 2. 右鍵單擊文件列表的空白位置, 選擇“新建”→“文本文件”;
?? 3. 將“新建文本文件.txt”重命名為“_vimrc”, 注意顯示擴展名的問題。
現在, 我們已經創建了一份自己的 .vimrc。 在之后的部分里, 我們將逐漸往 .vimrc 里添加一些屬于我們自己的內容, 得到一份真正屬于自己的配置。
1.2 Linux 下的中文處理
這一節是為 Linux 用戶準備的, 如果你是 Windows 用戶, 請直接跳過這一節。
在 許多 Linux 發行版里, gvim 默認是不支持漢字的, 這給許多初學者留下了非常不好的印象。 其實, VIM 支持的語言非常之多,遠遠超乎我們想象。 之所以不能處理中文, 只是因為我們沒有正確地配置它。 在正式開始工作以前, 我們首先將中文處理問題解決。這段里面會出現一些如“Normal 模式”、 “Insert 模式”等術語, 看不明白也不要緊, vimtutor 里面會詳細解釋,在這章內只要照著做就可以了, 不用深究這些詞的含義。
打開 gvim, 在鍵盤上按“i”進入 Insert 模式,然后試著輸入一段中文。 如果正常的話, 恭喜, 你可以跳過本段, 直接進入下一段。 如果不能正常輸入, 也不要氣餒, 先按 ESC, 回到 Normal 狀態。 然后在鍵盤上輸入“:set encoding=cp936”, 然后回車。 注意, 當你按下“:”的時候, VIM 就會自動切換到“Command 模式”, 光標會跳到窗口最下方。 冒號“:”之后的部分就是命令的正文。 回車之后, 這條命令就被 VIM 執行了。 這時再按下字母 i 進入 Insert 模式, 輸入一段漢字, 如果不出意外的話, 漢字顯示應該已經正常。 如果還不正常的話,請與滇狐聯系。
現在你的 gvim 應該能夠正常輸入漢字了, 接下來請看一下 gvim 的菜單能不能正常地顯示漢字,如果能的話, 恭喜, 請繼續跳過這一節。 如果不能的話, 我們繼續進行下面的操作。 首先按三次 ESC 鍵, 確認 VIM 已經處在 Normal 模式下, 然后在鍵盤上輸入“:so $VIMRUNTIME/delmenu.vim”, 回車后會發現, gvim 的菜單沒有了。繼續輸入“:so $VIMRUNTIME/menu.vim”, 回車, 這時 gvim 的菜單又回來了, 而且菜單中文顯示也正常了。
1.3 選擇自己喜歡的字體
如果覺得 gvim 的字體顯示效果不好的話, 不妨重新選擇一個你喜歡的字體。 點“編輯”→“選擇字體”,然后在字體列表中選擇一個你最中意的字體和字號, 確認后就可以了。 由于 gvim 只能使用等寬字體,因此對話框中列出的字體可能比你系統里安裝的字體要少得多, 請慢慢選擇, 耐心選, 直到選出最滿意的字體為止。 選擇完畢后, 先按幾下 ESC 確認處在 Normal 模式下, 然后輸入這條命令:“:set guifont?” (這里的問號代表詢問, 不要漏寫), 回車后 gvim 屏幕最下方會顯示出你當前所用的字體的名稱, 例如在滇狐這里輸入這條命令后出來的結果如下:
? guifont=Courier 9
請記住這里輸出的字體名稱, 如果必要的話請先暫時把它寫下來備用, 之后我們需要將它寫入配置文件。
1.4 將配置寫入 .vimrc
之 前我們通過一系列命令, 將 gvim 調整為一個比較適合我們使用的編輯環境。 然而, gvim 是不會自動記住我們這次所做的調整的。下次再打開 gvim 時, 它又變回了原先的模樣。 如果我們能夠把剛才所輸入的命令記錄下來, 下次再打開 gvim 的時候把那些命令再執行一遍, 不就可以讓 gvim 每次都保持我們調整過的最佳工作狀態了么? 對, 這就是配置文件 .vimrc 的作用。
剛才我們已經創建了一 個全空的配置文件 .vimrc, 現在我們往配置文件中寫下我們的自己的配置代碼。 .vimrc 的格式很簡單,只要將剛才輸入的所有冒號開頭的命令, 依次寫入 .vimrc 即可, 寫到配置文件里的時候就不要寫冒號了。 VIM 啟動的時候會依次執行這些命令。 另外, 配置文件中雙引號開頭的行表示注釋, 在 VIM 讀入 .vimrc 的時候, 這些行不會被執行。因此你可以使用注釋在 .vimrc 中寫上一些說明文字, 為自己將來閱讀配置文件提供方便。 再次復習一下前幾節的內容, 然后寫下自己的 .vimrc, 你現在的 .vimrc 可能是這個樣子的:
" Windows 下建議也加上這句
set encoding=cp936
" 這兩句只在 Linux 下需要
so $VIMRUNTIME/delmenu.vim
so $VIMRUNTIME/menu.vim
" 設置字體。
" 字體名稱可以通過前一節介紹的語句獲得,
" 如果字體名稱中含有空格,
" 需要在空格前面加上一個反斜杠,如下:
set guifont=Courier" 9
提示: 如果對 VIM 的基本操作一無所知的話, 現在你可以不妨先使用其它文本編輯器編寫 .vimrc, 如記事本等。 當然, 如果你愿意現在就嘗試著使用 gvim 編輯這個文件的話, 也是非常值得鼓勵的。
2 入門學習
2.1 vimtutor
vimtutor 是一個非常適合初學者學習 VIM 的簡易教程。 教程中說閱讀一遍這個教程需要 25 到 30 分鐘, 其實很少有人需要這么長時間。一般情況下, 如果精力集中的話, 15 到 20 分鐘足以將這份教程從頭到尾閱讀一遍。 每天花 15 分鐘時間將這份教程從頭到尾看一遍,平時進行純文本編輯的時候, 盡量“逼迫”自己多使用 gvim, 花一周時間, 就可以比較熟悉 gvim, 能夠用它完成普通的編輯工作了。
Linux 下的 vimtutor 是在終端中打開的, 如果終端字體配置正常, 一般情況下不會出現什么太大問題。 Windows 下的 vimtutor 會彈出一個 gvim 窗口, 大部分情況下也沒有什么大問題, 在少部分機器上漢字會出現亂碼。 如果 vimtutor 在你機器上顯示不正常的話, 請先輸入“:set encoding=cp936”, 回車, 然后再點擊“編輯”→“選擇字體”,選擇一個支持中文的字體, 如“新宋體”等, 確認后, 教程的顯示應該就恢復正常了。
如果你以前從來沒有使用過 VIM 的話, 請先花 15 分鐘時間閱讀一遍 vimtutor, 然后再繼續往后閱讀滇狐教程。 之后的部分再出現 vimtutor 里介紹過的術語時, 滇狐將不再作解釋。
注意: 為了保證 vimtutor 在任何機器上運行效果都相同, 不會被本地設置的鍵綁定所干擾, vimtutor 運行時不會讀取任何用戶自定義的配置文件 .vimrc。 因此如果你之前做的設置在 vimtutor 里沒有效果的話, 請不要太過于驚慌。
2.2 VIM 快速編輯示例
學習 VIM 其實是一件比較辛苦的事情, 剛開始的時候可能比用記事本還慢。 因此, 在學會 VIM 之前, 我們有必要先通過一些例子堅定一下信心。
VIM 的一大特點就是“快”。 這里列舉了一些使用 VIM 能夠快速完成, 而一些其它編輯器難以勝任的功能, 體現 VIM 的優越性。
3 編寫自己的 .vimrc
作為一個高度可定制的編輯器, 為 VIM 編寫適合自己使用的 .vimrc 是有必要的。 這里給出了一個適合初學者使用的 .vimrc 框架, 以及每一項設置的詳細解釋, 希望能給大家帶來一些幫助。
這里是滇狐自己的 .vimrc, 里面有很多根據滇狐自己的習慣所做的設置。 如果你希望在自己機器上使用的話, 需要根據你的習慣做一些修改。
4 VIM 進階
通 過一個星期的努力, 把 vimtutor 中的基本命令都熟練掌握后, 使用 VIM 進行簡單快速的編輯應該已經沒有什么問題了。 接下來,可以每天抽出半個小時時間, 在半個月左右內把 VIM 用戶手冊大概閱讀一遍。 在 VIM 中 Normal 模式下輸入“:help usr_toc”即可看到用戶手冊, 如果更習慣看中文版的話, 可以到這里下載。
記住, 沒有必要記住手冊中的所有命令, 只要大概知道有哪些命令, 需要用的之后知道到哪一章去查就可以了。 常用的命令查過幾次之后自然而然就能夠記住, 不常用的命令記下來也沒有什么意義。
另外, 可以根據自己的需要, 下載一些常用的 VIM 插件, 方便自己的日常生活與工作。 這里有滇狐整理的 VIM 常用插件推薦, 感興趣的話可以看看。
如果對 VIM 還有更加濃厚的興趣的話, 可以試著自己編寫 VIM 插件, 不過那些內容就不是這篇文章能夠涉及的了。 祝大家好運! Happy VIMming~
VIM參數解釋
VIM 中可供用戶定制的選項非常非常多, 作為初學者, 我們沒有必要了解這么多東西。
下面, 滇狐簡單列出了一些最常用的配置項, 大家可以根據自己的需要將這些內容添加到自己的
.vimrc 中。
1 基本設置
??? *
????? set nocp
????? 該命令指定讓 VIM 工作在不兼容模式下。 在 VIM 之前, 出現過一個非常流行的編輯器叫
????? vi。 VIM 許多操作與 vi 很相似, 但也有許多操作與 vi 是不一樣的。 如果使用“:set
????? cp”命令打開了兼容模式開關的話, VIM 將盡可能地模仿 vi 的操作模式。
????? 也許有許多人喜歡“最正統的 vi”的操作模式, 對于初學者來說, vi 里許多操作是比較不方便的。
????? 舉一個例子, VIM 里允許在 Insert 模式下使用方向鍵移動光標, 而 vi 里在
????? Insert 模式下是不能移動光標的, 必須使用 ESC 退回到 Normal 模式下才行。
????? 再舉一個例子, vi 里使用 u 命令可以撤消一次先前的操作, 再次按下 u
????? 時, 將撤消“撤消”這個動作本身, 也就是我們常說的“重復”(redo)。
????? 而 VIM 里可以使用 u 命令撤消多步操作, “重復”使用的快捷鍵是 Ctrl
????? + R。
????? 使用兼容模式后, VIM 將放棄這些新的功能, 盡量模仿 vi 的各種操作方式。
????? 只有在不兼容模式下, 才能更好地發揮 VIM 自身的特點。 Bram 爺爺強烈推薦大家使用
????? VIM 的不兼容模式, 滇狐也是這樣推薦的。 請務必在你的 .vimrc 中的第一行寫上:
????? “set nocp”。
??? *
????? set ru
????? 該命令打開 VIM 的狀態欄標尺。 默認情況下, VIM 的狀態欄標尺在屏幕底部,
????? 它能即時顯示當前光標所在位置在文件中的行號、列號, 以及對應的整個文件的百分比。
????? 打開標尺可以給文件的編輯工作帶來一定方便。
??? *
????? set hls
????? 搜索時高亮顯示被找到的文本。 該指令的功能在 vimtutor 中已經有過介紹,
????? 這里就不多說了。 其實似乎許多人并不喜歡這個功能。
??? *
????? set is
????? 搜索時在未完全輸入完畢要檢索的文本時就開始檢索。 vimtutor 對該命令也有過介紹,
????? 滇狐并不喜歡這個功能, 因此滇狐自己的配置文件里是沒有這條命令的。 但是周圍有朋友很喜歡這個,
????? 因此滇狐還是將它列在這里。
??? *
????? syntax on
????? 打開關鍵字上色。 進行程序設計的朋友應該都知道關鍵字上色是什么東西,
????? 因此這里就不多說了。 不進行程序設計的朋友不妨也打開這個功能, 雖然不一定能夠用得著,
????? 但這個功能其實也是很好玩的。
??? *
????? set backspace=indent,eol,start
????? 設想這樣一個情況: 當前光標前面有若干字母, 我們按下 i 鍵進入了 Insert
????? 模式, 然后輸入了 3 個字母, 再按 5 下刪除(Backspace)。 默認情況下,
????? VIM 僅能刪除我們新輸入的 3 個字母, 然后喇叭“嘟嘟”響兩聲。 如果我們“set
????? backspace=start”, 則可以在刪除了新輸入的 3 個字母之后, 繼續向前刪除原有的兩個字符。
????? 再設想一個情況: 有若干行文字, 我們把光標移到中間某一行的行首, 按
????? i 鍵進入 Insert 模式, 然后按一下 Backspace。 默認情況下, 喇叭會“嘟”一聲,
????? 然后沒有任何動靜。 如果我們“set backspace=eol”, 則可以刪除前一行行末的回車,
????? 也就是說將兩行拼接起來。
????? 當我們設置了自動縮進后, 如果前一行縮進了一定距離, 按下回車后, 下一行也會保持相同的縮進。
????? 默認情況下, 我們不能在 Insert 模式下直接按 Backspace 刪除行首的縮進。
????? 如果我們“set backspace=indent”, 則可以開啟這一項功能。
????? 上述三項功能, 你可以根據自己的需要, 選擇其中一種或幾種, 用逗號分隔各個選項。
????? 建議把這三個選項都選上。
??? *
????? set whichwrap=b,s,<,>,[,]
????? 默認情況下, 在 VIM 中當光標移到一行最左邊的時候, 我們繼續按左鍵,
????? 光標不能回到上一行的最右邊。 同樣地, 光標到了一行最右邊的時候, 我們不能通過繼續按右跳到下一行的最左邊。
????? 但是, 通過設置 whichwrap 我們可以對一部分按鍵開啟這項功能。 如果想對某一個或幾個按鍵開啟到頭后自動折向下一行的功能,
????? 可以把需要開啟的鍵的代號寫到 whichwrap 的參數列表中, 各個鍵之間使用逗號分隔。
????? 以下是 whichwrap 支持的按鍵名稱列表:
????????? o
??????????? b
??????????? 在 Normal 或 Visual 模式下按刪除(Backspace)鍵。
????????? o
??????????? s
??????????? 在 Normal 或 Visual 模式下按空格鍵。
????????? o
??????????? h
??????????? 在 Normal 或 Visual 模式下按 h 鍵。
????????? o
??????????? l
??????????? 在 Normal 或 Visual 模式下按 l 鍵。
????????? o
??????????? <
??????????? 在 Normal 或 Visual 模式下按左方向鍵。
????????? o
??????????? >
??????????? 在 Normal 或 Visual 模式下按右方向鍵。
????????? o
??????????? ~
??????????? 在 Normal 模式下按 ~ 鍵(翻轉當前字母大小寫)。
????????? o
??????????? [
??????????? 在 Insert 或 Replace 模式下按左方向鍵。
????????? o
??????????? ]
??????????? 在 Insert 或 Replace 模式下按右方向鍵。
??? *
????? set encoding=cp936
????? 設置當前字符編碼為簡體中文。 這里還有一段能夠自動判斷文件的 encoding,
????? 自動選擇合適的編碼的 .vimrc 代碼, 感興趣的話可以放到自己的配置文件中使用:
" Encoding settings
if has("multi_byte")
??? " Set fileencoding priority
?? if getfsize(expand("%")) > 0
?????? set fileencodings=ucs-bom,utf-8,cp936,big5,euc-jp,euc-kr,latin1
?? else
?????? set fileencodings=cp936,big5,euc-jp,euc-kr,latin1
?? endif
??? " CJK environment detection and corresponding setting
?? if v:lang =~ "^zh_CN"
??????? " Use cp936 to support GBK, euc-cn == gb2312
?????? set encoding=cp936
?????? set termencoding=cp936
?????? set fileencoding=cp936
?? elseif v:lang =~ "^zh_TW"
??????? " cp950, big5 or euc-tw
??????? " Are they equal to each other?
?????? set encoding=big5
?????? set termencoding=big5
?????? set fileencoding=big5
?? elseif v:lang =~ "^ko"
??????? " Copied from someone's dotfile, untested
?????? set encoding=euc-kr
?????? set termencoding=euc-kr
?????? set fileencoding=euc-kr
?? elseif v:lang =~ "^ja_JP"
??????? " Copied from someone's dotfile, unteste
?????? set encoding=euc-jp
?????? set termencoding=euc-jp
?????? set fileencoding=euc-jp
?? endif
??? " Detect UTF-8 locale, and replace CJK setting if needed
?? if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
?????? set encoding=utf-8
?????? set termencoding=utf-8
?????? set fileencoding=utf-8
?? endif
else
?? echoerr "Sorry, this version of (g)vim was not compiled with multi_byte"
endif
2 文本編輯設置
??? *
????? set sw=4
????? 自動縮進的時候, 縮進尺寸為 4 個空格。
??? *
????? set ts=4
????? Tab 寬度為 4 個字符。
??? *
????? set et
????? 編輯時將所有 Tab 替換為空格。
????? 該選項只在編輯時將 Tab 替換為空格, 如果打開一個已經存在的文件, 并不會將已有的
????? Tab 替換為空格。 如果希望進行這樣的替換的話, 可以使用這條命令“:retab”。
3 斷行設置
??? *
????? set lbr
????? 不在單詞中間斷行。 設置了這個選項后, 如果一行文字非常長, 無法在一行內顯示完的話,
????? 它會在單詞與單詞間的空白處斷開, 盡量不會把一個單詞分成兩截放在兩個不同的行里。
??? *
????? set fo+=mB
????? 打開斷行模塊對亞洲語言支持。 m 表示允許在兩個漢字之間斷行, 即使漢字之間沒有出現空格。
????? B 表示將兩行合并為一行的時候, 漢字與漢字之間不要補空格。 該命令支持的更多的選項請參看用戶手冊。
4 C/C++ 編碼設置
??? *
????? set sm
????? 顯示括號配對情況。 打開這個選項后, 當輸入后括號 (包括小括號、中括號、大括號)
????? 的時候, 光標會跳回前括號片刻, 然后跳回來, 以此顯示括號的配對情況。
??? *
????? set cin
????? 打開 C/C++ 風格的自動縮進。 打開了自動縮進后, 在編碼的時候我們可以使用“V”命令選中一段文本后,
????? 按“=”將這段文本重新調整縮進格式, 在一定程度上起到代碼美化的作用。
????? 另外, 打開了自動縮進后, 在使用 TERM 下的 vim 的時, 粘貼代碼時常常會出現版式混亂的現象。
????? 那是因為 TERM 并不知道你現在正在粘貼代碼, 它直接“粘貼”動作向 vim
????? 解釋為鍵入, 因此 vim 便按照設置的自動縮進格式為你的代碼調整了縮進。
????? 不幸的是, 粘貼進去的代碼中本身已經包含了縮進, 因此便出現了版式混亂的情況。
????? 在 gvim 中就不會出現這個問題, 因為它能夠知道你現在正在粘貼。
????? 知道了這個癥狀的來由, 解決方案也就顯而易見了: 在粘貼的時候把所有自動縮進都關閉,
????? 粘貼完畢之后再打開。 一個個手工關閉自動縮進未免過于繁瑣, vim 為我們提供了一個很好用的命令,
????? 只要輸入“:set paste”, 就可以關閉所有自動縮進。 粘貼完畢后再輸入“:set
????? nopaste”就可以重新打開原有的自動縮進設置了。
??? *
????? set cino=:0g0t0(sus
????? 設定 C/C++ 風格自動縮進的選項, 這里簡要介紹一下這段代碼里用到的選項的含義,
????? cino 支持的選項還很多, 更多選項請看用戶手冊。
// :0
//
// switch 語句之下的 case 語句縮進 0 個空格,也就是說不縮進,與 switch 塊平
// 齊,使用這樣風格:
switch (x)
{
case 1:
?? a = b;
?? break;
default:
}
// g0
//
// class、struct 等之下的訪問權限控制語句,如 public、protected、private 等,
// 相對 class、struct 等所在的塊縮進 0 個空格,與 class 等塊平齊,使用這樣的
// 風格:
class foo
{
public:
?? int a;
private:
?? int b;
};
// t0
//
// 如果函數返回值與函數名不在同一行,則返回值縮進 0 個空格,也就是說不縮進,如
// 下所示:
// set cino=t4
?? int
func1()
{
}
// set cino=t0
int
func()
{
}
// (sus
//
// 當一對括號跨越多行時,其后的行縮進前面 sw 指定的距離,效果如下:
int a = (1 + 2 + 3
?? + 4 + 5 + 6
?? + 7 + 8) * 9;
??? *
????? set ai
????? 打開普通文件類型的自動縮進。 該自動縮進不如 cindent 智能, 但它可以為你編輯非
????? C/C++ 文件提供一定幫助。
5 其它設置
??? *
????? set selectmode=
????? 不使用 selectmode。
??? *
????? set mousemodel=popup
????? 當右鍵單擊窗口的時候, 彈出快捷菜單。
??? *
????? set keymodel=
????? 不使用“Shift + 方向鍵”選擇文本, “Shift + 方向鍵”代表向指定方向跳一個單詞。
????? 如果你喜歡這項功能的話, 可以使用“set keymodel=startsel,stopsel”打開它。
??? *
????? set selection=inclusive
????? 指定在選擇文本時, 光標所在位置也屬于被選中的范圍。 如果指定 selection=exclusive
????? 的話, 可能會出現某些文本無法被選中的情況。
??? *
????? colo torte
????? 選擇 torte 配色方案。 VIM 里內置了許多關鍵字上色的配色方案, 另外你還可以到網上下載更多配色方案,
????? 或是自己編寫。 點擊“編輯”→“調色板”, 就能列出所有支持的配色方案。
????? 你可以把“調色板”子菜單剪下來, 然后慢慢選擇, 挑出一個你最喜歡的配色方案來。
6 圖形界面設置
??? *
????? set nowrap
????? 指定不折行。 如果一行太長, 超過屏幕寬度, 則向右邊延伸到屏幕外面。
????? 如果使用圖形界面的話, 指定不折行視覺效果會好得多。
??? *
????? set guioptions+=b
????? 添加水平滾動條。 如果你指定了不折行, 那為窗口添加一個水平滾動條就非常有必要了。
??? *
????? set guifont=Courier" 9
????? 設置圖形界面下的字體。 你可以點“編輯”→“選擇字體”, 然后在對話框中選出你喜歡的字體與字號,
????? 選擇完畢后, 先按幾下 ESC 確認處在 Normal 模式下, 然后輸入這條命令:“:set
????? guifont?” 回車后 gvim 屏幕最下方會顯示出你當前所用的字體的名稱與字號。
????? 將獲得的結果寫到配置文件里面就可以了, 需要注意一點, 如果字體名稱里面含有空格的話,
????? 在抄的時候需要在所有空格前面加一個斜杠。
7 條件選擇
同一個配色方案, 在 gvim 下和字符界面的 vim 下效果大相徑庭, 滇狐個人的習慣是,
在 gvim 下使用 torte 配色方案, 在 vim 下使用 ron 配色方案。 因此我們有必要針對
gvim 和 vim 進行不同的設置。
另外, 前面我們在 gvim 下不使用折行, 開啟水平滾動條, 但在 vim 下,
是沒有滾動條可用的, 因此還是有必要為 vim 保留自動折行。
條件選擇設置的格式如下:
if (has("gui_running"))
" 圖形界面下的設置
?? set nowrap
?? set guioptions+=b
?? colo torte
else
" 字符界面下的設置
?? set wrap
?? colo ron
endif
以下是滇狐自己的 .vimrc, 有許多根據滇狐自己的習慣做的設置, 如果你要在自己機器上使用的話,
請根據你自己的習慣作出相應修改。
另外, 這份 .vimrc 里面有許多設置是針對插件的, 只有安裝了相應插件后,
這些配置才會起作用。 這里有滇狐使用的全部插件打包,
如果需要的話可以直接下載, Linux 用戶將該壓縮包解壓到 $HOME 目錄下即可使用,
Windows 用戶可以將壓縮包解壓后, 將解壓得到的 .vim 文件夾改名為 vimfiles,
然后復制到 VIM 的安裝路徑下, 覆蓋原有文件。
"=============================================================================
" General settings
"=============================================================================
set nocp
set ru
set cin
set sm
set ai
set sw=4
set ts=4
set et
set cino=:0g0t0(sus
set lbr
set hls
set backspace=indent,eol,start
set whichwrap=b,s,<,>,[,]
set fo+=mB
set selectmode=
set mousemodel=popup
set keymodel=
set selection=inclusive
set matchpairs+=<:>
" for gdbvim
set noshowcmd
" Encoding settings
if has("multi_byte")
??? " Set fileencoding priority
?? if getfsize(expand("%")) > 0
?????? set fileencodings=ucs-bom,utf-8,cp936,big5,euc-jp,euc-kr,latin1
?? else
?????? set fileencodings=cp936,big5,euc-jp,euc-kr,latin1
?? endif
??? " CJK environment detection and corresponding setting
?? if v:lang =~ "^zh_CN"
??????? " Use cp936 to support GBK, euc-cn == gb2312
?????? set encoding=cp936
?????? set termencoding=cp936
?????? set fileencoding=cp936
?? elseif v:lang =~ "^zh_TW"
??????? " cp950, big5 or euc-tw
??????? " Are they equal to each other?
?????? set encoding=big5
?????? set termencoding=big5
?????? set fileencoding=big5
?? elseif v:lang =~ "^ko"
??????? " Copied from someone's dotfile, untested
?????? set encoding=euc-kr
?????? set termencoding=euc-kr
?????? set fileencoding=euc-kr
?? elseif v:lang =~ "^ja_JP"
??????? " Copied from someone's dotfile, unteste
?????? set encoding=euc-jp
?????? set termencoding=euc-jp
?????? set fileencoding=euc-jp
?? endif
??? " Detect UTF-8 locale, and replace CJK setting if needed
?? if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
?????? set encoding=utf-8
?????? set termencoding=utf-8
?????? set fileencoding=utf-8
?? endif
else
?? echoerr "Sorry, this version of (g)vim was not compiled with multi_byte"
endif
" Cursor movement
nnoremap <Down> gj
nnoremap <Up> gk
vnoremap <Down> gj
vnoremap <Up> gk
inoremap <Down> <C-o>gj
inoremap <Up> <C-o>gk
nnoremap <End> g$
nnoremap <Home> g0
vnoremap <End> g$
vnoremap <Home> g0
inoremap <End> <C-o>g$
inoremap <Home> <C-o>g0
nmap <C-F4> :confirm bd<CR>
vmap <C-F4> <ESC>:confirm bd
omap <C-F4> <ESC>:confirm bd
map! <C-F4> <ESC>:confirm bd
" Move lines
nmap <C-Down> :<C-u>move .+1<CR>
nmap <C-Up> :<C-u>move .-2<CR>
imap <C-Down> <C-o>:<C-u>move .+1<CR>
imap <C-Up> <C-o>:<C-u>move .-2<CR>
vmap <C-Down> :move '>+1<CR>gv
vmap <C-Up> :move '<-2<CR>gv
" Toggle line number
nmap <C-F12> :set nu!<CR>
imap <C-F12> <C-o>:set nu!<CR>
" Toggle spell check
" For VIM7 only
nmap <C-F11> :set spell!<CR>
imap <C-F11> <C-o>:set spell!<CR>
syntax on
if (has("gui_running"))
?? set nowrap
?? set guioptions+=b
?? colo torte
else
?? set wrap
?? colo ron
endif
" ============================================================================
" Plugins settings
" ============================================================================
" Sketch
command -nargs=0 ToggleSketch call ToggleSketch()
" WinManager
" let g:winManagerWindowLayout = "FileExplorer"
" Tlist
let Tlist_Use_Right_Window=1
let Tlist_File_Fold_Auto_Close=1
" A
let g:alternateNoDefaultAlternate=1
" VIM7 doesn't support this.
"let g:alternateExtensions_{"aspx"} = "aspx.cs,aspx.CS"
"let g:alternateExtensions_{"aspx.cs"} = "aspx,ASPX"
" LateXSuite
filetype plugin on
set grepprg=grep" -nH" $*
" Viki
let g:vikiNameSuffix=".viki"
augr viki
au!
au BufRead,BufNewFile *.viki set filetype=viki
augr END
"=============================================================================
" Functions
"=============================================================================
function TextWork()
?? set nocin
?? set nosm
?? set noai
?? set tw=78
?? set sw=8
?? set ts=8
?? set nowrap
endfunction
function NoTextWork()
?? set cin
?? set sm
?? set ai
?? set tw=0
?? set sw=4
?? set ts=4
?? if (!has("gui_running"))
?????? set wrap
?? endif
endfunction
function CodeWork()
?? call NoTextWork()
?? WManager
?? Tlist
endfunction
function TimeStamp()
?? let curposn= SaveWinPosn()
?? %s/"$Date: .*"$/"=strftime("$Date: %Y-%m-%d %H:%M:%S$")/ge
?? %s/Last Change: .*$/"=strftime("Last Change: %Y-%m-%d %H:%M:%S")/ge
?? %s/Last Modified: .*$/"=strftime("Last Modified: %Y-%m-%d %H:%M:%S")/ge
??? " Replace once and never update.
?? %s/Created: *$/"=strftime("Created: %Y-%m-%d %H:%M:%S")/ge
?? call RestoreWinPosn(curposn)
endfunction
function AutoTimeStamp()
?? augr tagdate
?? au!
?? au BufWritePre,FileWritePre * call TimeStamp()
?? augr END
endfunction
call AutoTimeStamp()
function NoAutoTimeStamp()
?? augr tagdate
?? au!
?? augr END
endfunction
"=============================================================================
" Commands
"=============================================================================
command -nargs=0 TextWork call TextWork()
command -nargs=0 NoTextWork call NoTextWork()
command -nargs=0 CodeWork call CodeWork()
command -nargs=0 TimeStamp call TimeStamp()
command -nargs=0 AutoTimeStamp call AutoTimeStamp()
command -nargs=0 NoAutoTimeStamp call NoAutoTimeStamp()
"=============================================================================
" Platform dependent settings
"=============================================================================
"-----------------------------------------------------------------------------
" Common
"-----------------------------------------------------------------------------
" Calender
let g:calendar_diary="/home/edward/document/diary"
" Spell Check
" VIM7 supports built-in spell check.
"function SpellCheck()
"??? !aspell --lang=en -c %
"endfunction
"command -nargs=0 SpellCheck call SpellCheck()
" Mail Template
function MailWork()
?? 0r ~/document/text/mailtemp.txt
?? %s/%%date%%/"=strftime("%Y-%m-%d")/ge
?? %s/%%cursor%%//ge
?? call TextWork()
endfunction
command -nargs=0 MailWork call MailWork()
" Use kittiemake as the default compiler
function Kittie()
?? set makeprg=kittiemake
endfunction
command -nargs=0 Kittie call Kittie()
" Don't use kittiemake as the default compiler
function NoKittie()
?? set makeprg=make
endfunction
command -nargs=0 NoKittie call NoKittie()
"-----------------------------------------------------------------------------
" Win32
"-----------------------------------------------------------------------------
"if (has("gui_running"))
"??? set guifont=新宋體:h9:cGB2312
"endif
" For LaTeX Suite
"let g:Tex_CompileRule_dvi="latex -src-specials -interaction=nonstopmode $*"
"set shellslash
" For tee
"set shellpipe=2>&1"|" tee
" VimTweak
"if (has("gui_running"))
"??? command -nargs=1 SetAlpha call libcallnr("vimtweak.dll",
"??????? ""SetAlpha", )
"??? command -nargs=0 TopMost call libcallnr("vimtweak.dll",
"??????? ""EnableTopMost", 1)
"??? command -nargs=0 NoTopMost call libcallnr("vimtweak.dll",
"??????? ""EnableTopMost", 0)
"endif
"-----------------------------------------------------------------------------
" Linux
"-----------------------------------------------------------------------------
"For LaTeX Suite
"function RemoteLaTeX()
"??? let g:Tex_ViewRule_dvi="xdvi -editor 'gvim --servername """
"??????? ".expand("%:p").""" --remote-silent'"
"??? augr remotelatex
"??? au!
"??? augr END
"endfunction
"augr remotelatex
"au!
"au BufRead * call RemoteLaTeX()
"augr END
let g:Tex_CompileRule_dvi
??? "="latex -src-specials -interaction=nonstopmode $*"
let g:Tex_ViewRule_dvi
??? "="xdvi -editor 'gvim --servername latex-suite --remote-silent'"
if (has("gui_running"))
?? set guifont=Bitstream" Vera" Sans" Mono" 9
?? source $VIMRUNTIME/delmenu.vim
?? source $VIMRUNTIME/menu.vim
endif
Posted by 1+1=2 at 10:00 PM 0 comments ?
Labels: vim
Monday, October 09, 2006
標題: vim + ctags + taglist + cscope + cppcomplete + global 使用初探(zz)
由于本人比較喜歡在終端狀態下的vim,所以gvim下的擴展使用的不多。這里介紹的也是我簡單的使用以上擴展的一點點體會。請大家指正。 emacs 不會用,也沒有比較過拉。
1、大體感覺,(因為使用時間不長,不全面)
總體使用的感覺定位查找類型定義基本可以用,但自動補全類型方面由于ctags的功能有限,感覺在大工程時,不一定很好用。
大型程序一定要global的參與,它的分析比較全面,但在vim中的提示信息有限。
taglist 精干,需要ctags的支撐 ,直接可以在左邊列出函數列表,全局參數列表。(可以排序)
cscope 比較強大,可以對函數以及部分類型定義進行跳轉,但有些BUG,好像在某些條件下無法正確找到分析枚舉的定義。
cppcomplete 需要ctags的支撐,可以補全類型或者函數名(可不是普通Ctrl+P/N的那種)
global 新版本可以嵌入vim使用,提供比較完整解析和類型索引,和cscope比,稍微差些的就是對類型引用的打印列表中沒有標識這個引用在什么函數中進行的。 其實我的感覺global可能不是為vim所生,它的主要目的是用html的方式進行表達相關的關聯關系和索引,使用起來感覺沒有cscope的那么貼 切。
2、相關的擴展的安裝
代碼:
apt-get install exuberant-ctags cscope global
cppcomplete 和 taglist 要到www.vim.org的擴展列表中下載。
taglist 的下載地址:
http://www.vim.org/scripts/script.php?script_id=273
cppcomplete 的下載地址:
http://www.vim.org/scripts/script.php?script_id=527
然后在 建立目錄
代碼:
$HOME/.vim/plugin
將下載的cppcomplete.vim 和 taglist.vim拷貝到$HOME/.vim/plugin中。
安裝了global后,最新4.8.6 以上版本有帶vim的擴展,將它也拷貝到 $HOME/.vim/plugin
debian sid 版本global安裝后擴展文件在
代碼:
/usr/share/doc/global/examples/gtags.vim.gz
需要拷貝到$HOME/.vim/plugin后解壓,解壓方法:
代碼:
gzip -d gtags.vim.gz
3、使用這些工具
1)準備工作,先修改一下$HOME/.vimrc文件
為了更好的使用cscope請添加如下內容,這樣Ctrl-]的跳轉將由cscope的tags進行分析。
代碼:
if has("cscope")
set csprg=/usr/bin/cscope
set csto=0
set cst
set nocsverb
" add any database in current directory
if filereadable("cscope.out")
cs add cscope.out
" else add database pointed to by environment
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
set csverb
set cscopetag
set cscopequickfix=s-,g-,c-,d-,t-,e-,f-,i-
endif
2)使用cscope
cscope的tag生成最簡單的方法是:
在你的開發工程的最上層目錄執行cscope-indexer,它會遍歷下面的所有目錄,生成兩個文件,一個是cscope.files,這個文件記錄需要生成tags的文件名,可以手工修改,另一個是cscope格式的tags文件cscope.out。
完成后,你在生成了cscope.out的目錄打開工程的任意文件,就可以使用Ctrl-]跳轉查找類型定義了。
代碼:
cs f s xxxx 查找xxxx出現的地方,它能詳細列出哪些文件的哪行的哪個函數引用,以及該行的內容,比較不錯。 :)
它的所有命令的使用請參考:
代碼:
help cscope
3)使用taglist
taglist的功能是即時生成當前文件的函數列表和全局變量列表,便于索引。
在vim中命令模式下使用
Tlist 打開或者關閉當前文件的索引;
TlistSync 立即在打開的索引窗口中定位當前的光標所在位置屬于哪個函數或者結構定義中。
還有其他命令,請參考它的幫助文件。
4)ctags的使用
其實cscope是用來替代ctags功能的,ctags的應用廣泛,還有其他很多的軟件依賴它。
例如要生成cppcomplete需要的tags文件的話,需要運行下面的命令:
代碼:
ctags -n -f cppcomplete.tags --fields=+ai --C++-types=+p * -L cscope.files
注意,我在最后使用了參數"-L cscope.files" 這僅僅是借用拉cscope生成的文件索引來幫助ctags去查詢相關工程文件生成tags。
5)使用cppcomplete
cppcomplete的使用我只是簡單的發現它可以根據上述方法生成的tags文件來自動補全類型成員。
使用很簡單,就是在你需要補全類型成員時,按F8鍵就可以拉。它一般第一次使用時,需要讓你確認是使用已有的tags文件還是再生成一次。一般我們自己控制生成tags文件的時機,它就使用就行拉。
但它也受到ctags的分析能力比較差的限制,可能不是每次都能幫到你。
6)使用global
在工程的最上層目錄執行命令:
gtags
等待它完成所有需要的global自己格式的tags的生成
生成完后,需要的就是在生成tags的目錄打開你的工程的任意文件,用如下命令查詢相關類型引用和關聯關系:
代碼:
Gtags xxxx 查找xxxx的定義
Gtags -r xxxx 查找xxxx的引用
Gtags -s xxxx 查找xxxx出現的地方
它的提示信息很有顯,不如cscope更直觀,但對大型分析的比較完整。
有時它無法正常分析的類型 可以試試用帶-s 的參數的方式找找類型定義。再不行,我就不清楚拉
4、草草的收尾
我使用它們也是一點一點的摸索的沒有系統的完整的使用過,也受限于本人的Linux使用經驗和工作關系,所以非常簡單的使用體會給大家一個參考,希望能有所幫助。更希望后來者能不斷補充相關的使用體會。大家都需要交流提高,呵呵。
Posted by 1+1=2 at 4:47 AM 0 comments ?
Labels: vim
Ctags with Vim
標 題: Ctags with Vim
發信站: BBS 水木清華站 (Mon May 24 08:42:57 2004), 站內
usage: $ctags [-R] inc_dir/*.h include_dir/*.hpp src_dir/*.c
example: $ ctags -R `find . -name "*.c"` `find . -name "*.h"`
su; cd /usr/include; ctags --c-types=+p+x -sort -R
生成非常完整,巨大而有序的tags
各用戶在 ~/.vimrc中添加set tags= ./tags, tags, /usr/include/tags即可使用
[注1]+p開關會跳到變量聲明的地方而不是它的實現,所以還是采用缺省值,
不要--c-types這個選項,或者只要+x(推薦),其它無所謂。
還有/usr/include并不是/usr/src/linux/include的一個符號鏈接,
所以如果是看內核中一些變量的定義的話應該到/usr/src/linux上面用ctags
ctags瀏覽代碼 (有的命令說明可能不準確)
:set tags=/Dir/tags 設置需要的tags文件,
可以多個:set tags=/dir1/tags, /dir2/tags
:tag xxx 轉到滿足查找代碼的定義處,簡寫為 :ta xxx
:tag /^xxx 轉到以xxx為起始的tag處
other find tags :stag/ptag/ts/tj/pts/ptj /
:tag /xxx 列出所有包含xxx的tag
:tag 轉到前一個瀏覽過的tag處
vi -t xxx 直接定位到xxx的定義處
:tn / :tp 轉到下/上一個tag代碼處,可以使用:5tn的形式
:tr / :tl 轉到首/尾tag代碼處
, 轉到光標所在函數或者變量的定義處 g+左鍵 (GUI) [注2]
, 回到跳轉前的代碼處(適用于任何跳轉) g+右鍵 (GUI)
:tags 列出當前tag棧的內容
:ts xxx 列出所有匹配的代碼及其所屬文件,并提供選擇瀏覽
:sts xxx 列出匹配處提供選擇在新窗口中打開文件
:tj xxx 類似 :ts xxx,當只有一個匹配時直接轉到代碼處
g] 與 :ts xxx 功能相同(tag為光標下的標識符)
g] 等價于 :sts xxx
g 等價于 :tj xxx
:pt? xxx 提供上述命令(?為j,s)的預覽功能,退出窗口 :q!
:t?! xxx 當前文件的修改被丟棄轉到目標文件中
} 在預覽窗口中顯示當前光標下的tag
:ptl / ptf / ptn /ptp 類似于 tl,tf,tn,tp
:che 察看沒有找到的頭文件(checkpath)
makeprg :set makeprg=gcc" yourfile.c 為在線編譯設置
:make 在線編譯
:cn / :cN 移動到編譯的 下/上 一個error處
:stag xxx 查找xxx的聲明處并在新窗口中打開
:ta {ident} 跳轉到標識符定義處
gd 跳轉到局部標識符定義處
[注2] Ctrl-]碰巧是telnet的終端符,如果遠程編輯文件可能會遇到一些問題,
請參考在線幫助:h ^]。多數telnet都允許使用命令telnet -E hostname來打開
或關閉該脫字符,或者用telnet -e escape hostname來指定另外一個脫字符
來代替^],請man telnet參看-E -e的幫助。
一個對齊的插件,用來排版,面對一堆亂七八糟的代碼時,用來對齊代碼,功能強大,不過用到
的機會不多
http://www.vim.org/scripts/script.php?script_id=521
Mru
http://www.vim.org/scripts/script.php?script_id=521
給vim增加MRU功能,也就是保留最近打開的文件記錄,:MRU打開,q退出,很方便,有過一個支持
菜單的類似的插件
不過對于我這樣的不用菜單的用戶,還是這個命令行的好用一點,因為經常使用,所以我映射
到了F2
功能強大的代碼注釋工具,用來注釋或者取消注釋,支持很多語言,可以對文本塊操作,寫代碼
NERD_comments
功能強大的代碼注釋工具,用來注釋或者取消注釋,支持很多語言,可以對文本塊操作,寫代碼
離不了,呵呵
最常用到的快捷鍵是"c
a.vim
在.c/.h之間切換,寫代碼必備
bufexplorer.vim
列出當前打開的buffer,可以很容易的切換到和刪除選定的buffer,必備插件之一
c.vim
c/c++ support,讓你用編寫c/c++程序時如虎添翼,有很多貼心的功能,每個功能都有快捷鍵
,不過一部分和NERD_comments沖突
如果經常編寫一些單文件的c程序,但是不想寫makefile,用這個,他幫你完成,F9編譯并鏈接,
ctrl-F9運行
calendar.vim
日歷插件,有了它,用vim來寫日記很方便
csExplorer.vim
color theme瀏覽插件,列出所有的vim color theme到一個列表中,選中后按回車即可應用相
應的color theme,試驗color theme時再也不用一次次輸入:colo theme_name了,從上百個
color theme中選擇自己喜歡的theme時有用
cscope_maps.vim
cscope的vim插件,提供快捷鍵操縱cscope,好東東,如果你在用cscope的話
favex.vim
FavEx : Favorite file and directory explorer ,可以添加目錄和文件到收藏夾,可以把
經常編輯的文件添加到收藏夾來,在文件打開以后,"ff新增文件到收藏夾,"fd新增目錄到
收藏夾
lookupfile.vim
五星級推薦的好插件!我覺得它是vim上最偉大的插件之一,提供多種方式查找文件,讓你在復
雜的目?樹中也能輕松自如找到你要的文件
matchit.vim
擴展了vim的%功能,讓%可以匹配的,不再僅僅是括號,支持多種語言.必備插件之一
parenquote.vim
給選中的文字加上引號,支持( { [ < ' " `,選中后,"加上你想要添加的符號,比如選中abc
后,"(,得到(abc)
snippetEmu.vim
擴展了vim的abbr縮寫功能,支持占位符,支持變量替換,強烈推薦
taglist.vim
vim的代碼瀏覽器,生成函數列表,支持跳轉,可以根據光標λ置查詢到當前的函數名,使用
vim的程序員必備!個人認為是最偉大的插件之一
utl.vim
給vim增加url的識別功能,但是功能遠不只是支持url,還有更多,詳情見utl的幫助
vcscommand.vim
給vim整合了cvs/subversion功能,不用離開vim環境也能執行常用的cvs/subversion操作了
viki.vim
vim的wiki,沒怎么用過,據說很好用,詳情可以看滇狐的主頁
http://edyfox.codecarver.org/html/viki.html
vis.vim
可以對選中的文本塊執行ex操作,尤其是visual block模式下,vim自己是不支持的.選中后,
:B 加上ex命令
visincr.vim
給vim增加生成遞增或者遞減數列的功能,支持十進制,十六進制,日期,星期等,功能強大靈活
winmanager.vim
給vim增加IDE的功能,提供目錄瀏覽和buffer瀏覽功能,因為顯示器太小,感覺太占空間,所以
單獨使用bufexplorer,而且現在vim7的netrw功能也夠強大,所以感覺比較雞肋,而且貌似很
久沒有更新,所以基本不用
yankring.vim
類似emacs的king ring,給vim的yank也增加緩沖,vim本身只緩沖刪除的字符串,不緩沖yank
的內容
Posted by 1+1=2 at 6:24 AM 0 comments ?
Labels: vim
Tuesday, October 10, 2006
VIM 新手指南(zz)
術語約定: 如果沒有特殊說明, 本文中提到的 VIM 指的是圖形界面的 gvim 與字符界面的 vim 的統稱, gvim 專指圖形界面, vim 專指字符界面。
1.從官方網站(http://www.vim.org/download.php)下載windows版本的gvim安裝。
2.下載中文幫助文檔安裝文件(http://vimcdoc.sourceforge.net/),這個(http://vcd.gro.clinux.org/)是簡體中文的鏡像站點。
注意:如果安裝vim的中文幫助,安裝完成后第一次自動啟動時可以使用中文的,但退出后又還原為英文了,如果出現這種情況,只要把"vim"vimfiles"doc下的tags-cn另存為tags,再試試吧,中文出現了。
1 讓 gvim 正常工作
VIM 是一個非常強大的編輯器, 可惜的是, 無論是 Windows 還是 Linux, gvim 都存在一些小故障,令第一眼看到它的初學者感到非常不愉快。 為了不讓更多的初學者在第一次接觸 gvim 時被它嚇跑, 我在這份教程中首先解決 gvim 令人感到不快的一些小問題, 希望能讓更多的用戶平滑地過渡到 gvim 的環境中來。
VIM 的安裝很簡單, Windows 下只要雙擊安裝程序, 一路 next 下去就可以了 (注意到選擇安裝組件的時候請選擇全部組件, 默認安裝方式下會少裝幾個有用的小東西)。 Linux 下各個發行版安裝方式都不一樣, 但總體來說都不難裝。 因此, 本文假設你已經成功地安裝了一份 VIM, 不再介紹 VIM 的安裝步驟。
1.1 屏蔽系統自帶的 .vimrc
VIM 是一個高度可定制的編輯器, 它通過配置文件 .vimrc (Windows 下是 _vimrc)來定制程序的各種行為。 如果你沒有編寫 .vimrc 的話, 它會使用系統自帶的一份默認配置文件。 可惜的是, 系統默認的配置文件存在種種很令人不快的問題。 例如 Windows 下加載 mswin.vim 帶來的困惑, 和 Linux 下無法處理中文等等故障。 因此, 我們在安裝了 VIM 之后, 第一件要做的事情就是創建自己的 .vimrc。 只要編寫一份你自己的配置文件, VIM 便不會再加載系統自帶的配置文件。
如果你是 Linux 用戶, 請在你的 $HOME 目錄下放置一個空文件, 文件名叫 .vimrc, 方法如下:
$ cd??????????????????????????? # 使用不帶參數的 cd 命令,切換到 $HOME 目錄
$ touch .vimrc????????????????? # 使用 touch 命令創建一個空白文件
如果你是 Windows 用戶, 請在你的 %HOME% 目錄下放置一個空文件, 文件名叫 _vimrc。 步驟如下:
?? 1. 在資源管理器中切換到 %HOME% 目錄;
?? 2. 右鍵單擊文件列表的空白位置, 選擇“新建”→“文本文件”;
?? 3. 將“新建文本文件.txt”重命名為“_vimrc”, 注意顯示擴展名的問題。
現在, 我們已經創建了一份自己的 .vimrc。 在之后的部分里, 我們將逐漸往 .vimrc 里添加一些屬于我們自己的內容, 得到一份真正屬于自己的配置。
1.2 Linux 下的中文處理
這一節是為 Linux 用戶準備的, 如果你是 Windows 用戶, 請直接跳過這一節。
在 許多 Linux 發行版里, gvim 默認是不支持漢字的, 這給許多初學者留下了非常不好的印象。 其實, VIM 支持的語言非常之多,遠遠超乎我們想象。 之所以不能處理中文, 只是因為我們沒有正確地配置它。 在正式開始工作以前, 我們首先將中文處理問題解決。這段里面會出現一些如“Normal 模式”、 “Insert 模式”等術語, 看不明白也不要緊, vimtutor 里面會詳細解釋,在這章內只要照著做就可以了, 不用深究這些詞的含義。
打開 gvim, 在鍵盤上按“i”進入 Insert 模式,然后試著輸入一段中文。 如果正常的話, 恭喜, 你可以跳過本段, 直接進入下一段。 如果不能正常輸入, 也不要氣餒, 先按 ESC, 回到 Normal 狀態。 然后在鍵盤上輸入“:set encoding=cp936”, 然后回車。 注意, 當你按下“:”的時候, VIM 就會自動切換到“Command 模式”, 光標會跳到窗口最下方。 冒號“:”之后的部分就是命令的正文。 回車之后, 這條命令就被 VIM 執行了。 這時再按下字母 i 進入 Insert 模式, 輸入一段漢字, 如果不出意外的話, 漢字顯示應該已經正常。 如果還不正常的話,請與滇狐聯系。
現在你的 gvim 應該能夠正常輸入漢字了, 接下來請看一下 gvim 的菜單能不能正常地顯示漢字,如果能的話, 恭喜, 請繼續跳過這一節。 如果不能的話, 我們繼續進行下面的操作。 首先按三次 ESC 鍵, 確認 VIM 已經處在 Normal 模式下, 然后在鍵盤上輸入“:so $VIMRUNTIME/delmenu.vim”, 回車后會發現, gvim 的菜單沒有了。繼續輸入“:so $VIMRUNTIME/menu.vim”, 回車, 這時 gvim 的菜單又回來了, 而且菜單中文顯示也正常了。
1.3 選擇自己喜歡的字體
如果覺得 gvim 的字體顯示效果不好的話, 不妨重新選擇一個你喜歡的字體。 點“編輯”→“選擇字體”,然后在字體列表中選擇一個你最中意的字體和字號, 確認后就可以了。 由于 gvim 只能使用等寬字體,因此對話框中列出的字體可能比你系統里安裝的字體要少得多, 請慢慢選擇, 耐心選, 直到選出最滿意的字體為止。 選擇完畢后, 先按幾下 ESC 確認處在 Normal 模式下, 然后輸入這條命令:“:set guifont?” (這里的問號代表詢問, 不要漏寫), 回車后 gvim 屏幕最下方會顯示出你當前所用的字體的名稱, 例如在滇狐這里輸入這條命令后出來的結果如下:
? guifont=Courier 9
請記住這里輸出的字體名稱, 如果必要的話請先暫時把它寫下來備用, 之后我們需要將它寫入配置文件。
1.4 將配置寫入 .vimrc
之 前我們通過一系列命令, 將 gvim 調整為一個比較適合我們使用的編輯環境。 然而, gvim 是不會自動記住我們這次所做的調整的。下次再打開 gvim 時, 它又變回了原先的模樣。 如果我們能夠把剛才所輸入的命令記錄下來, 下次再打開 gvim 的時候把那些命令再執行一遍, 不就可以讓 gvim 每次都保持我們調整過的最佳工作狀態了么? 對, 這就是配置文件 .vimrc 的作用。
剛才我們已經創建了一 個全空的配置文件 .vimrc, 現在我們往配置文件中寫下我們的自己的配置代碼。 .vimrc 的格式很簡單,只要將剛才輸入的所有冒號開頭的命令, 依次寫入 .vimrc 即可, 寫到配置文件里的時候就不要寫冒號了。 VIM 啟動的時候會依次執行這些命令。 另外, 配置文件中雙引號開頭的行表示注釋, 在 VIM 讀入 .vimrc 的時候, 這些行不會被執行。因此你可以使用注釋在 .vimrc 中寫上一些說明文字, 為自己將來閱讀配置文件提供方便。 再次復習一下前幾節的內容, 然后寫下自己的 .vimrc, 你現在的 .vimrc 可能是這個樣子的:
" Windows 下建議也加上這句
set encoding=cp936
" 這兩句只在 Linux 下需要
so $VIMRUNTIME/delmenu.vim
so $VIMRUNTIME/menu.vim
" 設置字體。
" 字體名稱可以通過前一節介紹的語句獲得,
" 如果字體名稱中含有空格,
" 需要在空格前面加上一個反斜杠,如下:
set guifont=Courier" 9
提示: 如果對 VIM 的基本操作一無所知的話, 現在你可以不妨先使用其它文本編輯器編寫 .vimrc, 如記事本等。 當然, 如果你愿意現在就嘗試著使用 gvim 編輯這個文件的話, 也是非常值得鼓勵的。
2 入門學習
2.1 vimtutor
vimtutor 是一個非常適合初學者學習 VIM 的簡易教程。 教程中說閱讀一遍這個教程需要 25 到 30 分鐘, 其實很少有人需要這么長時間。一般情況下, 如果精力集中的話, 15 到 20 分鐘足以將這份教程從頭到尾閱讀一遍。 每天花 15 分鐘時間將這份教程從頭到尾看一遍,平時進行純文本編輯的時候, 盡量“逼迫”自己多使用 gvim, 花一周時間, 就可以比較熟悉 gvim, 能夠用它完成普通的編輯工作了。
Linux 下的 vimtutor 是在終端中打開的, 如果終端字體配置正常, 一般情況下不會出現什么太大問題。 Windows 下的 vimtutor 會彈出一個 gvim 窗口, 大部分情況下也沒有什么大問題, 在少部分機器上漢字會出現亂碼。 如果 vimtutor 在你機器上顯示不正常的話, 請先輸入“:set encoding=cp936”, 回車, 然后再點擊“編輯”→“選擇字體”,選擇一個支持中文的字體, 如“新宋體”等, 確認后, 教程的顯示應該就恢復正常了。
如果你以前從來沒有使用過 VIM 的話, 請先花 15 分鐘時間閱讀一遍 vimtutor, 然后再繼續往后閱讀滇狐教程。 之后的部分再出現 vimtutor 里介紹過的術語時, 滇狐將不再作解釋。
注意: 為了保證 vimtutor 在任何機器上運行效果都相同, 不會被本地設置的鍵綁定所干擾, vimtutor 運行時不會讀取任何用戶自定義的配置文件 .vimrc。 因此如果你之前做的設置在 vimtutor 里沒有效果的話, 請不要太過于驚慌。
2.2 VIM 快速編輯示例
學習 VIM 其實是一件比較辛苦的事情, 剛開始的時候可能比用記事本還慢。 因此, 在學會 VIM 之前, 我們有必要先通過一些例子堅定一下信心。
VIM 的一大特點就是“快”。 這里列舉了一些使用 VIM 能夠快速完成, 而一些其它編輯器難以勝任的功能, 體現 VIM 的優越性。
3 編寫自己的 .vimrc
作為一個高度可定制的編輯器, 為 VIM 編寫適合自己使用的 .vimrc 是有必要的。 這里給出了一個適合初學者使用的 .vimrc 框架, 以及每一項設置的詳細解釋, 希望能給大家帶來一些幫助。
這里是滇狐自己的 .vimrc, 里面有很多根據滇狐自己的習慣所做的設置。 如果你希望在自己機器上使用的話, 需要根據你的習慣做一些修改。
4 VIM 進階
通 過一個星期的努力, 把 vimtutor 中的基本命令都熟練掌握后, 使用 VIM 進行簡單快速的編輯應該已經沒有什么問題了。 接下來,可以每天抽出半個小時時間, 在半個月左右內把 VIM 用戶手冊大概閱讀一遍。 在 VIM 中 Normal 模式下輸入“:help usr_toc”即可看到用戶手冊, 如果更習慣看中文版的話, 可以到這里下載。
記住, 沒有必要記住手冊中的所有命令, 只要大概知道有哪些命令, 需要用的之后知道到哪一章去查就可以了。 常用的命令查過幾次之后自然而然就能夠記住, 不常用的命令記下來也沒有什么意義。
另外, 可以根據自己的需要, 下載一些常用的 VIM 插件, 方便自己的日常生活與工作。 這里有滇狐整理的 VIM 常用插件推薦, 感興趣的話可以看看。
如果對 VIM 還有更加濃厚的興趣的話, 可以試著自己編寫 VIM 插件, 不過那些內容就不是這篇文章能夠涉及的了。 祝大家好運! Happy VIMming~
VIM參數解釋
VIM 中可供用戶定制的選項非常非常多, 作為初學者, 我們沒有必要了解這么多東西。
下面, 滇狐簡單列出了一些最常用的配置項, 大家可以根據自己的需要將這些內容添加到自己的
.vimrc 中。
1 基本設置
??? *
????? set nocp
????? 該命令指定讓 VIM 工作在不兼容模式下。 在 VIM 之前, 出現過一個非常流行的編輯器叫
????? vi。 VIM 許多操作與 vi 很相似, 但也有許多操作與 vi 是不一樣的。 如果使用“:set
????? cp”命令打開了兼容模式開關的話, VIM 將盡可能地模仿 vi 的操作模式。
????? 也許有許多人喜歡“最正統的 vi”的操作模式, 對于初學者來說, vi 里許多操作是比較不方便的。
????? 舉一個例子, VIM 里允許在 Insert 模式下使用方向鍵移動光標, 而 vi 里在
????? Insert 模式下是不能移動光標的, 必須使用 ESC 退回到 Normal 模式下才行。
????? 再舉一個例子, vi 里使用 u 命令可以撤消一次先前的操作, 再次按下 u
????? 時, 將撤消“撤消”這個動作本身, 也就是我們常說的“重復”(redo)。
????? 而 VIM 里可以使用 u 命令撤消多步操作, “重復”使用的快捷鍵是 Ctrl
????? + R。
????? 使用兼容模式后, VIM 將放棄這些新的功能, 盡量模仿 vi 的各種操作方式。
????? 只有在不兼容模式下, 才能更好地發揮 VIM 自身的特點。 Bram 爺爺強烈推薦大家使用
????? VIM 的不兼容模式, 滇狐也是這樣推薦的。 請務必在你的 .vimrc 中的第一行寫上:
????? “set nocp”。
??? *
????? set ru
????? 該命令打開 VIM 的狀態欄標尺。 默認情況下, VIM 的狀態欄標尺在屏幕底部,
????? 它能即時顯示當前光標所在位置在文件中的行號、列號, 以及對應的整個文件的百分比。
????? 打開標尺可以給文件的編輯工作帶來一定方便。
??? *
????? set hls
????? 搜索時高亮顯示被找到的文本。 該指令的功能在 vimtutor 中已經有過介紹,
????? 這里就不多說了。 其實似乎許多人并不喜歡這個功能。
??? *
????? set is
????? 搜索時在未完全輸入完畢要檢索的文本時就開始檢索。 vimtutor 對該命令也有過介紹,
????? 滇狐并不喜歡這個功能, 因此滇狐自己的配置文件里是沒有這條命令的。 但是周圍有朋友很喜歡這個,
????? 因此滇狐還是將它列在這里。
??? *
????? syntax on
????? 打開關鍵字上色。 進行程序設計的朋友應該都知道關鍵字上色是什么東西,
????? 因此這里就不多說了。 不進行程序設計的朋友不妨也打開這個功能, 雖然不一定能夠用得著,
????? 但這個功能其實也是很好玩的。
??? *
????? set backspace=indent,eol,start
????? 設想這樣一個情況: 當前光標前面有若干字母, 我們按下 i 鍵進入了 Insert
????? 模式, 然后輸入了 3 個字母, 再按 5 下刪除(Backspace)。 默認情況下,
????? VIM 僅能刪除我們新輸入的 3 個字母, 然后喇叭“嘟嘟”響兩聲。 如果我們“set
????? backspace=start”, 則可以在刪除了新輸入的 3 個字母之后, 繼續向前刪除原有的兩個字符。
????? 再設想一個情況: 有若干行文字, 我們把光標移到中間某一行的行首, 按
????? i 鍵進入 Insert 模式, 然后按一下 Backspace。 默認情況下, 喇叭會“嘟”一聲,
????? 然后沒有任何動靜。 如果我們“set backspace=eol”, 則可以刪除前一行行末的回車,
????? 也就是說將兩行拼接起來。
????? 當我們設置了自動縮進后, 如果前一行縮進了一定距離, 按下回車后, 下一行也會保持相同的縮進。
????? 默認情況下, 我們不能在 Insert 模式下直接按 Backspace 刪除行首的縮進。
????? 如果我們“set backspace=indent”, 則可以開啟這一項功能。
????? 上述三項功能, 你可以根據自己的需要, 選擇其中一種或幾種, 用逗號分隔各個選項。
????? 建議把這三個選項都選上。
??? *
????? set whichwrap=b,s,<,>,[,]
????? 默認情況下, 在 VIM 中當光標移到一行最左邊的時候, 我們繼續按左鍵,
????? 光標不能回到上一行的最右邊。 同樣地, 光標到了一行最右邊的時候, 我們不能通過繼續按右跳到下一行的最左邊。
????? 但是, 通過設置 whichwrap 我們可以對一部分按鍵開啟這項功能。 如果想對某一個或幾個按鍵開啟到頭后自動折向下一行的功能,
????? 可以把需要開啟的鍵的代號寫到 whichwrap 的參數列表中, 各個鍵之間使用逗號分隔。
????? 以下是 whichwrap 支持的按鍵名稱列表:
????????? o
??????????? b
??????????? 在 Normal 或 Visual 模式下按刪除(Backspace)鍵。
????????? o
??????????? s
??????????? 在 Normal 或 Visual 模式下按空格鍵。
????????? o
??????????? h
??????????? 在 Normal 或 Visual 模式下按 h 鍵。
????????? o
??????????? l
??????????? 在 Normal 或 Visual 模式下按 l 鍵。
????????? o
??????????? <
??????????? 在 Normal 或 Visual 模式下按左方向鍵。
????????? o
??????????? >
??????????? 在 Normal 或 Visual 模式下按右方向鍵。
????????? o
??????????? ~
??????????? 在 Normal 模式下按 ~ 鍵(翻轉當前字母大小寫)。
????????? o
??????????? [
??????????? 在 Insert 或 Replace 模式下按左方向鍵。
????????? o
??????????? ]
??????????? 在 Insert 或 Replace 模式下按右方向鍵。
??? *
????? set encoding=cp936
????? 設置當前字符編碼為簡體中文。 這里還有一段能夠自動判斷文件的 encoding,
????? 自動選擇合適的編碼的 .vimrc 代碼, 感興趣的話可以放到自己的配置文件中使用:
" Encoding settings
if has("multi_byte")
??? " Set fileencoding priority
?? if getfsize(expand("%")) > 0
?????? set fileencodings=ucs-bom,utf-8,cp936,big5,euc-jp,euc-kr,latin1
?? else
?????? set fileencodings=cp936,big5,euc-jp,euc-kr,latin1
?? endif
??? " CJK environment detection and corresponding setting
?? if v:lang =~ "^zh_CN"
??????? " Use cp936 to support GBK, euc-cn == gb2312
?????? set encoding=cp936
?????? set termencoding=cp936
?????? set fileencoding=cp936
?? elseif v:lang =~ "^zh_TW"
??????? " cp950, big5 or euc-tw
??????? " Are they equal to each other?
?????? set encoding=big5
?????? set termencoding=big5
?????? set fileencoding=big5
?? elseif v:lang =~ "^ko"
??????? " Copied from someone's dotfile, untested
?????? set encoding=euc-kr
?????? set termencoding=euc-kr
?????? set fileencoding=euc-kr
?? elseif v:lang =~ "^ja_JP"
??????? " Copied from someone's dotfile, unteste
?????? set encoding=euc-jp
?????? set termencoding=euc-jp
?????? set fileencoding=euc-jp
?? endif
??? " Detect UTF-8 locale, and replace CJK setting if needed
?? if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
?????? set encoding=utf-8
?????? set termencoding=utf-8
?????? set fileencoding=utf-8
?? endif
else
?? echoerr "Sorry, this version of (g)vim was not compiled with multi_byte"
endif
2 文本編輯設置
??? *
????? set sw=4
????? 自動縮進的時候, 縮進尺寸為 4 個空格。
??? *
????? set ts=4
????? Tab 寬度為 4 個字符。
??? *
????? set et
????? 編輯時將所有 Tab 替換為空格。
????? 該選項只在編輯時將 Tab 替換為空格, 如果打開一個已經存在的文件, 并不會將已有的
????? Tab 替換為空格。 如果希望進行這樣的替換的話, 可以使用這條命令“:retab”。
3 斷行設置
??? *
????? set lbr
????? 不在單詞中間斷行。 設置了這個選項后, 如果一行文字非常長, 無法在一行內顯示完的話,
????? 它會在單詞與單詞間的空白處斷開, 盡量不會把一個單詞分成兩截放在兩個不同的行里。
??? *
????? set fo+=mB
????? 打開斷行模塊對亞洲語言支持。 m 表示允許在兩個漢字之間斷行, 即使漢字之間沒有出現空格。
????? B 表示將兩行合并為一行的時候, 漢字與漢字之間不要補空格。 該命令支持的更多的選項請參看用戶手冊。
4 C/C++ 編碼設置
??? *
????? set sm
????? 顯示括號配對情況。 打開這個選項后, 當輸入后括號 (包括小括號、中括號、大括號)
????? 的時候, 光標會跳回前括號片刻, 然后跳回來, 以此顯示括號的配對情況。
??? *
????? set cin
????? 打開 C/C++ 風格的自動縮進。 打開了自動縮進后, 在編碼的時候我們可以使用“V”命令選中一段文本后,
????? 按“=”將這段文本重新調整縮進格式, 在一定程度上起到代碼美化的作用。
????? 另外, 打開了自動縮進后, 在使用 TERM 下的 vim 的時, 粘貼代碼時常常會出現版式混亂的現象。
????? 那是因為 TERM 并不知道你現在正在粘貼代碼, 它直接“粘貼”動作向 vim
????? 解釋為鍵入, 因此 vim 便按照設置的自動縮進格式為你的代碼調整了縮進。
????? 不幸的是, 粘貼進去的代碼中本身已經包含了縮進, 因此便出現了版式混亂的情況。
????? 在 gvim 中就不會出現這個問題, 因為它能夠知道你現在正在粘貼。
????? 知道了這個癥狀的來由, 解決方案也就顯而易見了: 在粘貼的時候把所有自動縮進都關閉,
????? 粘貼完畢之后再打開。 一個個手工關閉自動縮進未免過于繁瑣, vim 為我們提供了一個很好用的命令,
????? 只要輸入“:set paste”, 就可以關閉所有自動縮進。 粘貼完畢后再輸入“:set
????? nopaste”就可以重新打開原有的自動縮進設置了。
??? *
????? set cino=:0g0t0(sus
????? 設定 C/C++ 風格自動縮進的選項, 這里簡要介紹一下這段代碼里用到的選項的含義,
????? cino 支持的選項還很多, 更多選項請看用戶手冊。
// :0
//
// switch 語句之下的 case 語句縮進 0 個空格,也就是說不縮進,與 switch 塊平
// 齊,使用這樣風格:
switch (x)
{
case 1:
?? a = b;
?? break;
default:
}
// g0
//
// class、struct 等之下的訪問權限控制語句,如 public、protected、private 等,
// 相對 class、struct 等所在的塊縮進 0 個空格,與 class 等塊平齊,使用這樣的
// 風格:
class foo
{
public:
?? int a;
private:
?? int b;
};
// t0
//
// 如果函數返回值與函數名不在同一行,則返回值縮進 0 個空格,也就是說不縮進,如
// 下所示:
// set cino=t4
?? int
func1()
{
}
// set cino=t0
int
func()
{
}
// (sus
//
// 當一對括號跨越多行時,其后的行縮進前面 sw 指定的距離,效果如下:
int a = (1 + 2 + 3
?? + 4 + 5 + 6
?? + 7 + 8) * 9;
??? *
????? set ai
????? 打開普通文件類型的自動縮進。 該自動縮進不如 cindent 智能, 但它可以為你編輯非
????? C/C++ 文件提供一定幫助。
5 其它設置
??? *
????? set selectmode=
????? 不使用 selectmode。
??? *
????? set mousemodel=popup
????? 當右鍵單擊窗口的時候, 彈出快捷菜單。
??? *
????? set keymodel=
????? 不使用“Shift + 方向鍵”選擇文本, “Shift + 方向鍵”代表向指定方向跳一個單詞。
????? 如果你喜歡這項功能的話, 可以使用“set keymodel=startsel,stopsel”打開它。
??? *
????? set selection=inclusive
????? 指定在選擇文本時, 光標所在位置也屬于被選中的范圍。 如果指定 selection=exclusive
????? 的話, 可能會出現某些文本無法被選中的情況。
??? *
????? colo torte
????? 選擇 torte 配色方案。 VIM 里內置了許多關鍵字上色的配色方案, 另外你還可以到網上下載更多配色方案,
????? 或是自己編寫。 點擊“編輯”→“調色板”, 就能列出所有支持的配色方案。
????? 你可以把“調色板”子菜單剪下來, 然后慢慢選擇, 挑出一個你最喜歡的配色方案來。
6 圖形界面設置
??? *
????? set nowrap
????? 指定不折行。 如果一行太長, 超過屏幕寬度, 則向右邊延伸到屏幕外面。
????? 如果使用圖形界面的話, 指定不折行視覺效果會好得多。
??? *
????? set guioptions+=b
????? 添加水平滾動條。 如果你指定了不折行, 那為窗口添加一個水平滾動條就非常有必要了。
??? *
????? set guifont=Courier" 9
????? 設置圖形界面下的字體。 你可以點“編輯”→“選擇字體”, 然后在對話框中選出你喜歡的字體與字號,
????? 選擇完畢后, 先按幾下 ESC 確認處在 Normal 模式下, 然后輸入這條命令:“:set
????? guifont?” 回車后 gvim 屏幕最下方會顯示出你當前所用的字體的名稱與字號。
????? 將獲得的結果寫到配置文件里面就可以了, 需要注意一點, 如果字體名稱里面含有空格的話,
????? 在抄的時候需要在所有空格前面加一個斜杠。
7 條件選擇
同一個配色方案, 在 gvim 下和字符界面的 vim 下效果大相徑庭, 滇狐個人的習慣是,
在 gvim 下使用 torte 配色方案, 在 vim 下使用 ron 配色方案。 因此我們有必要針對
gvim 和 vim 進行不同的設置。
另外, 前面我們在 gvim 下不使用折行, 開啟水平滾動條, 但在 vim 下,
是沒有滾動條可用的, 因此還是有必要為 vim 保留自動折行。
條件選擇設置的格式如下:
if (has("gui_running"))
" 圖形界面下的設置
?? set nowrap
?? set guioptions+=b
?? colo torte
else
" 字符界面下的設置
?? set wrap
?? colo ron
endif
以下是滇狐自己的 .vimrc, 有許多根據滇狐自己的習慣做的設置, 如果你要在自己機器上使用的話,
請根據你自己的習慣作出相應修改。
另外, 這份 .vimrc 里面有許多設置是針對插件的, 只有安裝了相應插件后,
這些配置才會起作用。 這里有滇狐使用的全部插件打包,
如果需要的話可以直接下載, Linux 用戶將該壓縮包解壓到 $HOME 目錄下即可使用,
Windows 用戶可以將壓縮包解壓后, 將解壓得到的 .vim 文件夾改名為 vimfiles,
然后復制到 VIM 的安裝路徑下, 覆蓋原有文件。
"=============================================================================
" General settings
"=============================================================================
set nocp
set ru
set cin
set sm
set ai
set sw=4
set ts=4
set et
set cino=:0g0t0(sus
set lbr
set hls
set backspace=indent,eol,start
set whichwrap=b,s,<,>,[,]
set fo+=mB
set selectmode=
set mousemodel=popup
set keymodel=
set selection=inclusive
set matchpairs+=<:>
" for gdbvim
set noshowcmd
" Encoding settings
if has("multi_byte")
??? " Set fileencoding priority
?? if getfsize(expand("%")) > 0
?????? set fileencodings=ucs-bom,utf-8,cp936,big5,euc-jp,euc-kr,latin1
?? else
?????? set fileencodings=cp936,big5,euc-jp,euc-kr,latin1
?? endif
??? " CJK environment detection and corresponding setting
?? if v:lang =~ "^zh_CN"
??????? " Use cp936 to support GBK, euc-cn == gb2312
?????? set encoding=cp936
?????? set termencoding=cp936
?????? set fileencoding=cp936
?? elseif v:lang =~ "^zh_TW"
??????? " cp950, big5 or euc-tw
??????? " Are they equal to each other?
?????? set encoding=big5
?????? set termencoding=big5
?????? set fileencoding=big5
?? elseif v:lang =~ "^ko"
??????? " Copied from someone's dotfile, untested
?????? set encoding=euc-kr
?????? set termencoding=euc-kr
?????? set fileencoding=euc-kr
?? elseif v:lang =~ "^ja_JP"
??????? " Copied from someone's dotfile, unteste
?????? set encoding=euc-jp
?????? set termencoding=euc-jp
?????? set fileencoding=euc-jp
?? endif
??? " Detect UTF-8 locale, and replace CJK setting if needed
?? if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
?????? set encoding=utf-8
?????? set termencoding=utf-8
?????? set fileencoding=utf-8
?? endif
else
?? echoerr "Sorry, this version of (g)vim was not compiled with multi_byte"
endif
" Cursor movement
nnoremap <Down> gj
nnoremap <Up> gk
vnoremap <Down> gj
vnoremap <Up> gk
inoremap <Down> <C-o>gj
inoremap <Up> <C-o>gk
nnoremap <End> g$
nnoremap <Home> g0
vnoremap <End> g$
vnoremap <Home> g0
inoremap <End> <C-o>g$
inoremap <Home> <C-o>g0
nmap <C-F4> :confirm bd<CR>
vmap <C-F4> <ESC>:confirm bd
omap <C-F4> <ESC>:confirm bd
map! <C-F4> <ESC>:confirm bd
" Move lines
nmap <C-Down> :<C-u>move .+1<CR>
nmap <C-Up> :<C-u>move .-2<CR>
imap <C-Down> <C-o>:<C-u>move .+1<CR>
imap <C-Up> <C-o>:<C-u>move .-2<CR>
vmap <C-Down> :move '>+1<CR>gv
vmap <C-Up> :move '<-2<CR>gv
" Toggle line number
nmap <C-F12> :set nu!<CR>
imap <C-F12> <C-o>:set nu!<CR>
" Toggle spell check
" For VIM7 only
nmap <C-F11> :set spell!<CR>
imap <C-F11> <C-o>:set spell!<CR>
syntax on
if (has("gui_running"))
?? set nowrap
?? set guioptions+=b
?? colo torte
else
?? set wrap
?? colo ron
endif
" ============================================================================
" Plugins settings
" ============================================================================
" Sketch
command -nargs=0 ToggleSketch call ToggleSketch()
" WinManager
" let g:winManagerWindowLayout = "FileExplorer"
" Tlist
let Tlist_Use_Right_Window=1
let Tlist_File_Fold_Auto_Close=1
" A
let g:alternateNoDefaultAlternate=1
" VIM7 doesn't support this.
"let g:alternateExtensions_{"aspx"} = "aspx.cs,aspx.CS"
"let g:alternateExtensions_{"aspx.cs"} = "aspx,ASPX"
" LateXSuite
filetype plugin on
set grepprg=grep" -nH" $*
" Viki
let g:vikiNameSuffix=".viki"
augr viki
au!
au BufRead,BufNewFile *.viki set filetype=viki
augr END
"=============================================================================
" Functions
"=============================================================================
function TextWork()
?? set nocin
?? set nosm
?? set noai
?? set tw=78
?? set sw=8
?? set ts=8
?? set nowrap
endfunction
function NoTextWork()
?? set cin
?? set sm
?? set ai
?? set tw=0
?? set sw=4
?? set ts=4
?? if (!has("gui_running"))
?????? set wrap
?? endif
endfunction
function CodeWork()
?? call NoTextWork()
?? WManager
?? Tlist
endfunction
function TimeStamp()
?? let curposn= SaveWinPosn()
?? %s/"$Date: .*"$/"=strftime("$Date: %Y-%m-%d %H:%M:%S$")/ge
?? %s/Last Change: .*$/"=strftime("Last Change: %Y-%m-%d %H:%M:%S")/ge
?? %s/Last Modified: .*$/"=strftime("Last Modified: %Y-%m-%d %H:%M:%S")/ge
??? " Replace once and never update.
?? %s/Created: *$/"=strftime("Created: %Y-%m-%d %H:%M:%S")/ge
?? call RestoreWinPosn(curposn)
endfunction
function AutoTimeStamp()
?? augr tagdate
?? au!
?? au BufWritePre,FileWritePre * call TimeStamp()
?? augr END
endfunction
call AutoTimeStamp()
function NoAutoTimeStamp()
?? augr tagdate
?? au!
?? augr END
endfunction
"=============================================================================
" Commands
"=============================================================================
command -nargs=0 TextWork call TextWork()
command -nargs=0 NoTextWork call NoTextWork()
command -nargs=0 CodeWork call CodeWork()
command -nargs=0 TimeStamp call TimeStamp()
command -nargs=0 AutoTimeStamp call AutoTimeStamp()
command -nargs=0 NoAutoTimeStamp call NoAutoTimeStamp()
"=============================================================================
" Platform dependent settings
"=============================================================================
"-----------------------------------------------------------------------------
" Common
"-----------------------------------------------------------------------------
" Calender
let g:calendar_diary="/home/edward/document/diary"
" Spell Check
" VIM7 supports built-in spell check.
"function SpellCheck()
"??? !aspell --lang=en -c %
"endfunction
"command -nargs=0 SpellCheck call SpellCheck()
" Mail Template
function MailWork()
?? 0r ~/document/text/mailtemp.txt
?? %s/%%date%%/"=strftime("%Y-%m-%d")/ge
?? %s/%%cursor%%//ge
?? call TextWork()
endfunction
command -nargs=0 MailWork call MailWork()
" Use kittiemake as the default compiler
function Kittie()
?? set makeprg=kittiemake
endfunction
command -nargs=0 Kittie call Kittie()
" Don't use kittiemake as the default compiler
function NoKittie()
?? set makeprg=make
endfunction
command -nargs=0 NoKittie call NoKittie()
"-----------------------------------------------------------------------------
" Win32
"-----------------------------------------------------------------------------
"if (has("gui_running"))
"??? set guifont=新宋體:h9:cGB2312
"endif
" For LaTeX Suite
"let g:Tex_CompileRule_dvi="latex -src-specials -interaction=nonstopmode $*"
"set shellslash
" For tee
"set shellpipe=2>&1"|" tee
" VimTweak
"if (has("gui_running"))
"??? command -nargs=1 SetAlpha call libcallnr("vimtweak.dll",
"??????? ""SetAlpha", )
"??? command -nargs=0 TopMost call libcallnr("vimtweak.dll",
"??????? ""EnableTopMost", 1)
"??? command -nargs=0 NoTopMost call libcallnr("vimtweak.dll",
"??????? ""EnableTopMost", 0)
"endif
"-----------------------------------------------------------------------------
" Linux
"-----------------------------------------------------------------------------
"For LaTeX Suite
"function RemoteLaTeX()
"??? let g:Tex_ViewRule_dvi="xdvi -editor 'gvim --servername """
"??????? ".expand("%:p").""" --remote-silent'"
"??? augr remotelatex
"??? au!
"??? augr END
"endfunction
"augr remotelatex
"au!
"au BufRead * call RemoteLaTeX()
"augr END
let g:Tex_CompileRule_dvi
??? "="latex -src-specials -interaction=nonstopmode $*"
let g:Tex_ViewRule_dvi
??? "="xdvi -editor 'gvim --servername latex-suite --remote-silent'"
if (has("gui_running"))
?? set guifont=Bitstream" Vera" Sans" Mono" 9
?? source $VIMRUNTIME/delmenu.vim
?? source $VIMRUNTIME/menu.vim
endif
Posted by 1+1=2 at 10:00 PM 0 comments ?
Labels: vim
Monday, October 09, 2006
標題: vim + ctags + taglist + cscope + cppcomplete + global 使用初探(zz)
由于本人比較喜歡在終端狀態下的vim,所以gvim下的擴展使用的不多。這里介紹的也是我簡單的使用以上擴展的一點點體會。請大家指正。 emacs 不會用,也沒有比較過拉。
1、大體感覺,(因為使用時間不長,不全面)
總體使用的感覺定位查找類型定義基本可以用,但自動補全類型方面由于ctags的功能有限,感覺在大工程時,不一定很好用。
大型程序一定要global的參與,它的分析比較全面,但在vim中的提示信息有限。
taglist 精干,需要ctags的支撐 ,直接可以在左邊列出函數列表,全局參數列表。(可以排序)
cscope 比較強大,可以對函數以及部分類型定義進行跳轉,但有些BUG,好像在某些條件下無法正確找到分析枚舉的定義。
cppcomplete 需要ctags的支撐,可以補全類型或者函數名(可不是普通Ctrl+P/N的那種)
global 新版本可以嵌入vim使用,提供比較完整解析和類型索引,和cscope比,稍微差些的就是對類型引用的打印列表中沒有標識這個引用在什么函數中進行的。 其實我的感覺global可能不是為vim所生,它的主要目的是用html的方式進行表達相關的關聯關系和索引,使用起來感覺沒有cscope的那么貼 切。
2、相關的擴展的安裝
代碼:
apt-get install exuberant-ctags cscope global
cppcomplete 和 taglist 要到www.vim.org的擴展列表中下載。
taglist 的下載地址:
http://www.vim.org/scripts/script.php?script_id=273
cppcomplete 的下載地址:
http://www.vim.org/scripts/script.php?script_id=527
然后在 建立目錄
代碼:
$HOME/.vim/plugin
將下載的cppcomplete.vim 和 taglist.vim拷貝到$HOME/.vim/plugin中。
安裝了global后,最新4.8.6 以上版本有帶vim的擴展,將它也拷貝到 $HOME/.vim/plugin
debian sid 版本global安裝后擴展文件在
代碼:
/usr/share/doc/global/examples/gtags.vim.gz
需要拷貝到$HOME/.vim/plugin后解壓,解壓方法:
代碼:
gzip -d gtags.vim.gz
3、使用這些工具
1)準備工作,先修改一下$HOME/.vimrc文件
為了更好的使用cscope請添加如下內容,這樣Ctrl-]的跳轉將由cscope的tags進行分析。
代碼:
if has("cscope")
set csprg=/usr/bin/cscope
set csto=0
set cst
set nocsverb
" add any database in current directory
if filereadable("cscope.out")
cs add cscope.out
" else add database pointed to by environment
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
set csverb
set cscopetag
set cscopequickfix=s-,g-,c-,d-,t-,e-,f-,i-
endif
2)使用cscope
cscope的tag生成最簡單的方法是:
在你的開發工程的最上層目錄執行cscope-indexer,它會遍歷下面的所有目錄,生成兩個文件,一個是cscope.files,這個文件記錄需要生成tags的文件名,可以手工修改,另一個是cscope格式的tags文件cscope.out。
完成后,你在生成了cscope.out的目錄打開工程的任意文件,就可以使用Ctrl-]跳轉查找類型定義了。
代碼:
cs f s xxxx 查找xxxx出現的地方,它能詳細列出哪些文件的哪行的哪個函數引用,以及該行的內容,比較不錯。 :)
它的所有命令的使用請參考:
代碼:
help cscope
3)使用taglist
taglist的功能是即時生成當前文件的函數列表和全局變量列表,便于索引。
在vim中命令模式下使用
Tlist 打開或者關閉當前文件的索引;
TlistSync 立即在打開的索引窗口中定位當前的光標所在位置屬于哪個函數或者結構定義中。
還有其他命令,請參考它的幫助文件。
4)ctags的使用
其實cscope是用來替代ctags功能的,ctags的應用廣泛,還有其他很多的軟件依賴它。
例如要生成cppcomplete需要的tags文件的話,需要運行下面的命令:
代碼:
ctags -n -f cppcomplete.tags --fields=+ai --C++-types=+p * -L cscope.files
注意,我在最后使用了參數"-L cscope.files" 這僅僅是借用拉cscope生成的文件索引來幫助ctags去查詢相關工程文件生成tags。
5)使用cppcomplete
cppcomplete的使用我只是簡單的發現它可以根據上述方法生成的tags文件來自動補全類型成員。
使用很簡單,就是在你需要補全類型成員時,按F8鍵就可以拉。它一般第一次使用時,需要讓你確認是使用已有的tags文件還是再生成一次。一般我們自己控制生成tags文件的時機,它就使用就行拉。
但它也受到ctags的分析能力比較差的限制,可能不是每次都能幫到你。
6)使用global
在工程的最上層目錄執行命令:
gtags
等待它完成所有需要的global自己格式的tags的生成
生成完后,需要的就是在生成tags的目錄打開你的工程的任意文件,用如下命令查詢相關類型引用和關聯關系:
代碼:
Gtags xxxx 查找xxxx的定義
Gtags -r xxxx 查找xxxx的引用
Gtags -s xxxx 查找xxxx出現的地方
它的提示信息很有顯,不如cscope更直觀,但對大型分析的比較完整。
有時它無法正常分析的類型 可以試試用帶-s 的參數的方式找找類型定義。再不行,我就不清楚拉
4、草草的收尾
我使用它們也是一點一點的摸索的沒有系統的完整的使用過,也受限于本人的Linux使用經驗和工作關系,所以非常簡單的使用體會給大家一個參考,希望能有所幫助。更希望后來者能不斷補充相關的使用體會。大家都需要交流提高,呵呵。
Posted by 1+1=2 at 4:47 AM 0 comments ?
Labels: vim
Ctags with Vim
標 題: Ctags with Vim
發信站: BBS 水木清華站 (Mon May 24 08:42:57 2004), 站內
usage: $ctags [-R] inc_dir/*.h include_dir/*.hpp src_dir/*.c
example: $ ctags -R `find . -name "*.c"` `find . -name "*.h"`
su; cd /usr/include; ctags --c-types=+p+x -sort -R
生成非常完整,巨大而有序的tags
各用戶在 ~/.vimrc中添加set tags= ./tags, tags, /usr/include/tags即可使用
[注1]+p開關會跳到變量聲明的地方而不是它的實現,所以還是采用缺省值,
不要--c-types這個選項,或者只要+x(推薦),其它無所謂。
還有/usr/include并不是/usr/src/linux/include的一個符號鏈接,
所以如果是看內核中一些變量的定義的話應該到/usr/src/linux上面用ctags
ctags瀏覽代碼 (有的命令說明可能不準確)
:set tags=/Dir/tags 設置需要的tags文件,
可以多個:set tags=/dir1/tags, /dir2/tags
:tag xxx 轉到滿足查找代碼的定義處,簡寫為 :ta xxx
:tag /^xxx 轉到以xxx為起始的tag處
other find tags :stag/ptag/ts/tj/pts/ptj /
:tag /xxx 列出所有包含xxx的tag
:tag 轉到前一個瀏覽過的tag處
vi -t xxx 直接定位到xxx的定義處
:tn / :tp 轉到下/上一個tag代碼處,可以使用:5tn的形式
:tr / :tl 轉到首/尾tag代碼處
, 轉到光標所在函數或者變量的定義處 g+左鍵 (GUI) [注2]
, 回到跳轉前的代碼處(適用于任何跳轉) g+右鍵 (GUI)
:tags 列出當前tag棧的內容
:ts xxx 列出所有匹配的代碼及其所屬文件,并提供選擇瀏覽
:sts xxx 列出匹配處提供選擇在新窗口中打開文件
:tj xxx 類似 :ts xxx,當只有一個匹配時直接轉到代碼處
g] 與 :ts xxx 功能相同(tag為光標下的標識符)
g] 等價于 :sts xxx
g 等價于 :tj xxx
:pt? xxx 提供上述命令(?為j,s)的預覽功能,退出窗口 :q!
:t?! xxx 當前文件的修改被丟棄轉到目標文件中
} 在預覽窗口中顯示當前光標下的tag
:ptl / ptf / ptn /ptp 類似于 tl,tf,tn,tp
:che 察看沒有找到的頭文件(checkpath)
makeprg :set makeprg=gcc" yourfile.c 為在線編譯設置
:make 在線編譯
:cn / :cN 移動到編譯的 下/上 一個error處
:stag xxx 查找xxx的聲明處并在新窗口中打開
:ta {ident} 跳轉到標識符定義處
gd 跳轉到局部標識符定義處
[注2] Ctrl-]碰巧是telnet的終端符,如果遠程編輯文件可能會遇到一些問題,
請參考在線幫助:h ^]。多數telnet都允許使用命令telnet -E hostname來打開
或關閉該脫字符,或者用telnet -e escape hostname來指定另外一個脫字符
來代替^],請man telnet參看-E -e的幫助。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
