vi/vim使用進階: 劍不離手 – quickfix
本節所用命令的幫助入口:
:help quickfix :help :make :help 'makeprg' :help 'errorformat' :help 'switchbuf' :help location-list :help grep :help :vimgrep :help :grep :help starstar-wildcard
以前讀武俠小說,看到武林高手們都是從來劍不離手的。使用vim寫程式,你也可以做到這一點,:-)
vim由一個程式設計師開發,而且為更多的程式設計師所使用,所以在vim中加強了對軟體開發的支援,quickfix模式的引入就是一個例子。所謂quickfix模式,它和Normal模式、Insert模式沒什麼關係,它只是一種加快你開發速度的工作方式。
Quickfix模式的主要思想是儲存一個位置列表,然後提供一系列命令,實現在這個位置列表中跳轉。
位置列表的產生可以從編譯器的編譯輸出資訊中獲得,也可以由grep命令的輸出資訊中獲得,我們上篇文章所介紹的cscope命令,也可以產生位置列表資訊(:help ‘cscopequickfix’)。
[編譯]
通常,我們在開發過程中,經常要寫程式碼,編譯,修改編譯錯誤,這個過程會數十遍上百遍的重複。如果你是根據編譯器輸出的錯誤資訊,開啟出錯的檔案,找到出錯的行,然後再開始修改,那效率未免太低下了。
利用vim的quickfix模式,可以大大加快這一過程,你可以在vim啟動編譯,然後vim會根據編譯器輸出的錯誤資訊,自動跳到第一個出錯的地方,讓你進行修改;修改完後,使用一個快捷鍵,跳到下一個錯誤處,再進行修改,方便的很。
為了做到這一點,你首先要定義編譯時所使用的程式,對大多數使用Makefile的專案來說,vim的預設設定”make“已經可以滿足要求了。如果你的專案需要用一個特殊的程式進行編譯,就需要修改’makeprg‘選項的值。
大家在學程式設計時大概都讀過”hello world”程式,我們就以這個簡單的例子為例,講一下quickfix模式的用法。
該程式的內容如下,裡面包含了三個小小的錯誤:
/* hello world demo */ #include <stdio.h" int main(int argc, char **argv) { int i; print("hello world\n"); return 0; }
我們可以為這個程式寫個小小的Makefile檔案,不過為了演示’makeprg‘的設定方法,我們並不用Makefile,而直接設定’makeprg‘選項,如下:
:set makeprg=gcc\ -Wall\ -ohello\ hello.c
上面的命令會把hello.c編譯為名hello的可執行檔案,並開啟了所有的Warnning。如果編譯命令中有空格,需要使用’\‘對空格進行轉義,上面的例子就使用了’\‘轉義空格。
我們設定好’makeprg‘選項後,輸入下面的命令就可以編譯了:
:make
在使用”:make“時,vim會自動呼叫’makeprg‘選項定義的命令進行編譯,並把編譯輸出重定向到一個臨時檔案中,當編譯出現錯誤時,vim會從上述臨時檔案中讀出錯誤資訊,根據這些資訊形成quickfix列表,並跳轉到第一個錯誤出現的地方。
對於我們上面的程式來說,游標會停在第三行,也就是第一個出錯的位置,vim同時會提示出錯資訊。如果你沒看清出錯資訊,可以輸入”:cc“命令,vim會更次顯示此資訊,或者乾脆使用”:cw“命令,開啟一個quickfix視窗,把所有的出錯資訊顯示出來,見下圖:
現在我們知道錯在哪兒了,修正一下,然後使用”:cn“命令(或者在Quickfix List對應行上輸入回車)跳到下一個出錯的地方,以此類推,直到修正全部錯誤。
好了,千辛萬苦,我們的hello world終於工作了。乍一看這個例子,似乎Quickfix並沒有提高什麼效率,但如果你的錯誤出現在多個不同目錄的不同檔案裡,它可以幫你省很多時間,使你可以集中精力在修正bug上。
vim可以同時記住最新的10個錯誤列表,也就是說你最近10次使用”:make“命令編譯所遇到的錯誤都儲存著,可以使用”:colder“和”:cnewer“命令,回到舊的錯誤列表,或者到更新的錯誤列表。
在quickfix模式裡經常用到的命令有:
:cc 顯示詳細錯誤資訊 ( :help :cc )
:cp 跳到上一個錯誤 ( :help :cp )
:cn 跳到下一個錯誤 ( :help :cn )
:cl 列出所有錯誤 ( :help :cl )
:cw 如果有錯誤列表,則開啟quickfix視窗 ( :help :cw )
:col 到前一箇舊的錯誤列表 ( :help :col )
:cnew 到後一個較新的錯誤列表 ( :help :cnew )
更多的命令,以及這些命令更詳細的解釋,請參見手冊。
對於經常用到的命令,最好提供更方便的使用方法,在我的vimrc中的定義:
autocmd FileType c,cpp map <buffer> <leader><space> :w<cr>:make<cr> nmap <leader>cn :cn<cr> nmap <leader>cp :cp<cr> nmap <leader>cw :cw 10<cr>
現在使用”,<space>“(先按,再按空格)就可以編譯,使用”,cp“和”,cn“跳到上一個和下一個錯誤,使用”,cw“來開啟一個quickfix視窗。這下順手多了!
如果你希望跳轉到出錯的檔案時,使用一個分隔的視窗開啟,請參閱’switchbuf‘選項的值。
在vim7中,每個視窗都可以擁有自己的位置列表,這樣,你就能夠同時開啟多個位置列表了,而quickfix列表在整個vim中只有一個。你可以使用位置列表來顯示編譯錯誤資訊,具體命令參閱手冊:”:help location-list“以及”:help :lmake“。
[GREP]
我們在程式設計師的利器 – cscope中講過,cscope可以做為一個快速的grep程式使用,對於我們的軟體專案,用cscope生成一個資料庫,可以大大加快查詢字串的速度。但cscope需要事先生成一個資料庫,對一些簡單的查詢,不需要專門為之生成資料庫,這時候可以使用grep。
Grep的名字來源於”g/re/p”,”re”是正規表示式(regex)的意思,”p”是列印,也就是把匹配正規表示式的行列印出來。
vim既可以使用外部的grep程式,也可以使用內部整合的grep功能。
使用整合的grep命令非常簡單,通常使用格式為:
:vimgrep /main/gj **/*.c
在上面的例子裡,我們使用vim內部整合的grep功能,在當前目錄及其子目錄樹的所有c檔案中查詢main字串,如果一行中main出現了多次,每個匹配都計入;在查詢到後,不立即跳轉到第一個匹配的地方。
使用內部整合的grep功能速度要比外部grep慢一些,因為它會開啟每個檔案,對其進行檢查,然後關閉;但整合的grep支援vim增強的正規表示式,可以利用它進行更為複雜的查詢。它也支援vim擴充套件的檔案萬用字元表示方式,見”:help starstar-wildcard“。
vimgrep查詢到的結果,也會放在quickfix列表中。下圖是在vim 7.0的原始碼目錄中執行上面的命令生成的quickfix列表:
我們可以使用上面介紹的quickfix模式的命令,來檢視這些匹配。
你也可以用外部的grep程式來查詢,如果你的系統中所用的不是標準的grep程式,那麼就需要修改’grepprg‘選項,詳情請參閱手冊。
使用外部grep的語法與grep程式相同,請參閱grep的手冊。
無論使用內部的vimgrep,還是使用外部的grep,vim都允許你將查詢到的結果放在與視窗相關聯的位置列表,要了解詳細資訊,”:help :lvimgrep“及”:help :lgrep“。
在我的vimrc中,定義下面的鍵對映,利用它可以在當前檔案中快速查詢游標下的單詞:
nmap <leader>lv :lv /<c-r>=expand("<cword>")<cr>/ %<cr>:lw<cr>
相關文章
- vi/vim使用進階: 在VIM中使用GDB除錯 – 使用vimgdb除錯
- ubuntu vi/vim 基本使用方法Ubuntu
- vi(vim)命令
- Vim進階教程
- Vim 使用進階:自定義高亮分組
- vi/vim使用入門: vimrc在哪兒?
- vim進階 | 使用外掛打造實用vim工作環境
- Vim使用進階:10種暫存器剖析
- 使用 Vi/Vim 編輯器:基礎篇
- TAGS::Vim進階索引[7]索引
- 高亮::Vim進階索引[5]索引
- 常用的vi/vim命令
- vi&vim命令列命令列
- Vi/Vim命令桌布圖
- Vi/Vim Tips and Tricks
- VIM 進階 —— 《VIM 8 文字處理實戰》
- 縮排::Vim進階索引[8]索引
- 外部程式::Vim進階索引[6]索引
- 指令碼::Vim進階索引[3]指令碼索引
- 摺疊::Vim進階索引[2]索引
- 模式行::Vim進階索引[1]模式索引
- vi 和vim 的區別
- VI高階命令集錦及VIM應用例項(轉)
- vim進階之新增ctags和cscope
- 暫存器::Vim進階索引[4]索引
- vi和vim的編輯模式模式
- 如何安裝和使用純文字編輯器 vi/vim
- 新手指南:Linux上vi(vim)編輯器使用教程Linux
- Vim和Vi的常用命令
- Vi智慧耳機:形影不離的人工智慧私人健身教練人工智慧
- [轉]Vi/Vim查詢替換使用方法 - HelloSUN - 部落格園
- 【VI】用Vi/Vim/gVim處理字元的大小寫轉換(暨命令gu gU的靈活使用)字元
- UnixLike 系統vi/vim 命令助記表
- Vim/Vi實用技巧(第二版)
- linux使用vim(vi)中文亂碼的終極解決辦法Linux
- Linux– 檔案編輯器 vi/vim(1)Linux
- vi 操作手冊
- Linux—vim/vi 翻頁跳轉命令快捷鍵Linux