日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

vim quickfix——最灵活的quickfix

發(fā)布時間:2024/3/7 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vim quickfix——最灵活的quickfix 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

更多分享內(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。