vim quickfix——最灵活的quickfix
更多分享內(nèi)容可訪問我的個人博客
https://www.niuiic.top/
本文主要介紹 vim quickfix 的使用與優(yōu)化。
什么是 quickfix
quickfix 屬于 vim 的高級功能,該功能在主流 IDE 或者編輯器中都有集成。
簡單的說,quickfix 就是搜集編譯器的輸出信息,然后定位錯誤與警告位置,提供直接跳轉(zhuǎn)功能。可以說有了完善的 quickfix 功能的 vim 編輯器才是真正的編輯器之神。
如何使用 quickfix
首先來了解一下 quickfix 的工作流程。
-
第一步,設定要執(zhí)行的命令,也就是編譯、運行程序的命令。可以在 vim 中通過命令設置。如設置命令為 make,:set makeprg=make。
-
第二步,執(zhí)行命令:make。注意該 make 是 vim 的命令,而不是 shell 中的 make 命令。此時,開始執(zhí)行命令并且將輸出送到 quickfix 窗口。
-
第三步,使用:copen打開 quickfix 窗口。可以看到剛才的輸出內(nèi)容。假設輸出內(nèi)容如下所示。
可以看到,圖中藍色部分為文件名,之后的為行和列,再后面的為相關信息。
-
第四步,獲取信息之后,跳轉(zhuǎn)到出錯位置。vim 提供了:cnext、:cprev、:cfirst、:clast等命令在各個錯誤之間跳轉(zhuǎn)。也可以借助其他插件,如 vim-clap 對 quickfix 內(nèi)容進行檢索跳轉(zhuǎn)。也可以將光標移動到 quickfix 窗口的文件位置處,鍵入 enter 進行跳轉(zhuǎn)。
-
第五步,修改完所有錯誤后,關閉 quickfix 窗口,可以使用:cclose。
優(yōu)化 quickfix
外觀
使用:copen打開的 quickfix 窗口較小,不利于查看,可以使用:copexx,如:copen25,指定窗口所占的行數(shù),改變窗口大小。
快捷鍵
可以參考以下快捷鍵設置。
au VimEnter * :set makeprg=make nnoremap <silent><nowait> <space>qs :<C-u>set makeprg= nnoremap <silent><nowait> <space>qo :<C-u>cope25<CR> nnoremap <silent><nowait> <space>qm :<C-u>make<CR> nnoremap <silent><nowait> <space>qc :<C-u>cclose<CR>nmap <A-j> :cnext<CR> nmap <A-k> :cprev<CR> nmap <A-g> :cfirst<CR> nmap <A-G> :clast<CR>let g:which_key_map1.q = {\ 'name' : '+quickfix',\ 's' : 'set compile cmd',\ 'o' : 'open quickfix window',\ 'm' : 'make',\ 'c' : 'close quickfix window'\}異步
quickfix 默認同步執(zhí)行,也就是說執(zhí)行:make后,直到任務結束,你將無法使用 vim。在任務執(zhí)行時間較長的情況下,這是很不利的。因此需要做出優(yōu)化。
當前最好的解決方案:使用asynctasks.vim插件。該插件可參考的配置如下。安裝請參考官方文檔。
nnoremap <silent><nowait> <space>sR :<C-u>:AsyncTask project-run<CR> nnoremap <silent><nowait> <space>sB :<C-u>:AsyncTask project-build<CR> nnoremap <silent><nowait> <space>sb :<C-u>:AsyncTask file-build<CR> nnoremap <silent><nowait> <space>sr :<C-u>:AsyncTask file-run<CR> nnoremap <silent><nowait> <space>st :<C-u>:AsyncTaskList<CR> nnoremap <silent><nowait> <space>se :<C-u>:AsyncTaskEdit<CR> nnoremap <silent><nowait> <space>sE :<C-u>:AsyncTaskEdit!<CR> nnoremap <silent><nowait> <space>sg :<C-u>:AsyncTask git<CR> let g:asyncrun_rootmarks = ['.git', '.svn', '.root', '.project', '.hg'] let g:asynctasks_term_pos = 'bottom' let g:asynctasks_term_rows = 10 " 設置縱向切割高度 let g:asynctasks_term_cols = 80 " 設置橫向切割寬度let g:which_key_map1.s = {\ 'name' : '+asynctasks',\ 'R' : 'run project',\ 'B' : 'build project',\ 'b' : 'build file',\ 'r' : 'run file',\ 'e' : 'edit config',\ 'E' : 'edit global config',\ 't' : 'show task list',\}let g:asynctasks_config_name = '.git/task.ini'下面說明如何使用該插件。
使用:AsyncTaskEdit編輯配置文件,比如
[git] command=git add . && git commit -m $(?commit context) && proxychains git pull origin $(?merge branch) && proxychains git push -u origin $(?commit branch) cwd=<VIM_ROOT> output=terminal該文件具體編輯方法可以參考官方文檔。以上配置設定了一個 git 任務,可以使用:AsyncTask git執(zhí)行該任務,其中$(?)的部分是在執(zhí)行時由用戶輸入的。將output設置為quickfix即可將內(nèi)容輸出到 quickfix 窗口。
該插件可以實現(xiàn)異步的 quickfix 功能,但它的功能遠不止這點,建議深入挖掘。
修改
假設一下(真實情況應當不會出現(xiàn)),你犯了 100 個錯,辛辛苦苦修改完了 99 個,但是剩下一個居然找不到了。這事可能發(fā)生嗎?是的,很有可能。因為默認情況下,quickfix 并不會因為你修改了一個錯誤自動把錯誤消除,如果你要在 100 個錯誤里找 1 個,那自然是很費事的。
機靈的程序猿很快想出了絕妙的主意:我可以再執(zhí)行一遍,重新生成信息。想法很不錯,不過沒準 n 個小時就過去了。
目前這方面暫時沒有較好的插件(在 neovim 下都無法達到預想的效果)。不過可以通過以下方案來實現(xiàn)。
首先,可以設置快捷鍵。
nnoremap <silent><nowait> <space>qw :<C-u>write! build.log<CR> nnoremap <silent><nowait> <space>qe :<C-u>set modifiable<CR>在進入 quickfix 窗口后,使用set modifiable,讓 quickfix 可修改。修改完成后使用write! filename保存。這里默認了文件名為build.log。
然后,可以在 asynctask 插件中設置一個全局的加載文件到 quickfix 的任務。
[load-quickfix] command=bat ./build.log cwd=<VIM_ROOT> output=quickfix這里為了方便,直接指定了文件名,如果需要更加具有通用性,可以設置在執(zhí)行任務時手動輸入文件路徑。
在以上配置下,只要從項目根目錄進入 vim,就不會出現(xiàn) log 文件路徑出錯的問題。
quickfix 進階:騷操作
vim quickfix 相比 IDE 的 quickfix 功能有更高的靈活度,關鍵就在于可以執(zhí)行任意 shell 命令,包括 shell 腳本。
于是,quickfix 有了無限可能。下面將以跨設備編譯調(diào)試作為一個場景進行說明。
我的個人電腦 A 為 gentoo 系統(tǒng),有配置完美的 vim 編輯器,但沒有特定的編譯環(huán)境。另一臺電腦上虛擬機 B 為 ubuntu 系統(tǒng),有完整的編譯環(huán)境,且已經(jīng)配置好與開發(fā)板 C(Atlas 200DK)連接。首先了解一下昇騰系列的特點:指定版本的一切。我并不想在自己電腦上裝一堆亂七八糟的編譯器,設一堆亂七八糟的環(huán)境變量,更不想重新配置與 C 連接。事實上以上也很難做到,強行做到相當于廢了這個系統(tǒng)。那么在 B 上配好 vim 呢?ubuntu18.04???這還不得累死人,而且用不了多久。于是,騷操作開始了。
首先,把 B 上的頭文件搞到 A 上,再搞出個compile_commands.json(假設是 C、CPP 項目)滿足一下 lsp 的需求。
然后,來理一下邏輯。在 A 上寫好代碼后,git 推上去(單獨開一個分支用來推送),在 B 上拉下來。在 B 上完成編譯,甚至可以放到 C 上試一試。把出錯信息傳回 A,用于 quickfix。
那么,先來搞定 ssh 免密登陸,不然無法輸入密碼會卡住。這個可以參考網(wǎng)上解決方案。或者你也可以用其他語言,如 go 來實現(xiàn) ssh 登陸以及交互,然后調(diào)用該程序即可。
接下來,寫一個 shell 腳本,實現(xiàn)上述邏輯。
ssh niuiic@192.168.1.108 "cd ~/AscendProjects/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera && ./make.sh"A 處 git 上傳未列入其中,B 處的操作已經(jīng)全部包含至make.sh中。
這樣,就可以控制 B 拉取最新代碼,并進行編譯,然后將信息傳輸回來。
但,此時遇到一個重大問題,B 上編譯器輸出的路徑是 B 上項目的路徑,傳回來的自然也是,那如果 A 上的路徑不同呢。quickfix 自然沒有自動處理能力,會直接跳到空文件。
一個解決方案,是兩邊使用同一個路徑。這里介紹另一個更靈活的方案。
修改上述build.sh。用 shell 對接收到的內(nèi)容進行處理。將路徑換過來。這里可以直接保存到變量修改后輸出,保存到文件是為之后查看所用。
ssh niuiic@192.168.1.108 "cd ~/AscendProjects/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera && ./make.sh" > ./build.log 2>&1sed -i "s/\/home\/niuiic\/AscendProjects\/samples\/cplusplus\/level2_simple_inference\/n_performance\/1_multi_process_thread\/face_recognition_camera/\/home\/niuiic\/Documents\/Project\/Cpp\/face_recognition/g" ./build.logcat ./build.log再進一步,通過觀察上文 quickfix 窗口圖片可以發(fā)現(xiàn),quickfix 不僅僅列出錯誤,也會列出警告等信息。如果沒有明確的標識,就需要仔細查看才能知道是警告還是錯誤。所以,需要做進一步優(yōu)化。
為 quickfix 窗口配置關鍵詞高亮。對于 neovim 而言,應在~/.config/nvim/after/syntax目錄下創(chuàng)建qf.vim。當 vim 打開 quickfix 窗口時,會自動加載該配置文件并進行關鍵詞高亮。
修改文件內(nèi)容如下。
syn match QuickFixWarn /warning/ syn match QuickFixWarn /warn/ syn match QuickFixErr /error/ syn match QuickFixNote /note/ hi def link QuickFixErr Function hi def link QuickFixWarn Function hi def link QuickFixNote Function hi QuickFixErr guifg=red hi QuickFixWarn guifg=yellow hi QuickFixNote guifg=green這里分別將 warning、error、note 設置為黃色、紅色、綠色。可以參考以上配置進行自定義。
總結
以上是生活随笔為你收集整理的vim quickfix——最灵活的quickfix的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kubernetes(15):Pod控制
- 下一篇: 超声波测距仪编程_51单片机控制的超声波