作者wei115 (NEET)
看板Editor
標題Re: [vim ] 使用gtags插件的結果不如預期
時間Tue Apr 23 10:30:15 2019
※ 引述《wei115 (NEET)》之銘言:
: 如題
: 想用gtags來看code
: 但相關插件一直不工作
: 我預期的結果是裝好插件後,使用ctags的 <C-]> <C-t>可以在程式碼之間跳轉和返回
: 但實際上這快捷鍵好像和ctags衝突
: 插件的快捷鍵並沒有取代ctags的快捷鍵
: 所以vim一直提示我『E426: 找不到標籤(tag):』
: 使用的插件是
: Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
: Plug 'jistr/vim-nerdtree-tabs'
: Plug 'ludovicchabant/vim-gutentags'
: Plug 'skywind3000/gutentags_plus'
: 附上vimrc
: https://ideone.com/szLBNL
: 平台是windows 10 64bit,msys2
: vim -versoin
: VIM - Vi IMproved 8.1 (2018 May 17, compiled May 31 2018 11:16:13)
: 此vimrc在筆電上可以正常運作
: 筆電平台是windows 7 64bit,msys2
: vim版本也是8.1
: 想問問看這要如何解決,謝謝
放棄了一段時間,又因為要用到,所以又重新繼續搞
發現之前搞錯了一些東西
首先能動的一直是ctags(gtags>ags-cscope界面太難用了....)
我以前一直以為我用的是gtags但其實是ctags
所以一開始就沒有用到gutentags_plus這個插件的功能
用的只有vim-gutentags
這是一個可以在vim8上,在後台執行tags更新的插件
他的設定
let g:gutentags_modules = ['ctags', 'gtags_cscope']
let g:gutentags_project_root = ['.root', '.git']
let g:gutentags_cache_dir = expand('~/.cache/tags')
意思是說會在打開的目錄向上搜尋,直到遇到.root或.git,然後在~/.cache/tags建立
ctags和gtags的tag檔
因為只要用到ctags所以改成
let g:gutentags_modules = ['ctags']
就只會建立ctags檔了
照理來說,此時只要打開專案裡的原始檔,此插件就會自動產生tags擋了,然後自動設定
ctags
就能用<C-]> <C-t>在程式碼之間跳轉了
但我發現,在win10的wsl和msys2環境裡,在~/.cache/tags裡的tags檔會呈現
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to
lines/
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_PROGRAM_AUTHOR Darren Hiebert /
[email protected]/
!_TAG_PROGRAM_NAME Exuberant Ctags //
!_TAG_PROGRAM_URL
http://ctags.sourceforge.net /official site/
!_TAG_PROGRAM_VERSION 5.8 //
這樣的狀態
有就是沒有產生tags
為何會這樣讓我百思不得其解(或許只有我的電腦如此....)
但他有一個變數
let g:gutentags_ctags_extra_args = []
功能是傳入參數,讓ctags處理
一開始我用
let g:gutentags_ctags_extra_args = ['*']
這樣確實產生了tags檔了,但他的路徑是相對路徑,在跳轉程式碼的時候,他會在
~/.cache/tags下尋找原始檔,但這樣自然是找不到
所以要傳入的是絕對路徑
後來在翻閱了相關的資料後(感謝google和google翻譯)
終於找到了解決方法,在.vimrc中加入以下程式碼便能傳入絕對路徑
"獲得打開的檔案路徑,並把所有的空白' '轉成問號'?'
function FindSessionDirectory() abort
if len(argv()) > 0
return substitute(fnamemodify(argv()[0], ':p:h'), "\ ", "?", "g")
endif
return getcwd()
endfunction
let g:gutentags_ctags_extra_args = [FindSessionDirectory()]
之所以要把空白轉成問號的原因是因為如果有空白的參數傳入,tags也會沒辦法產生,就
算加上跳出字元也一樣,原因不明
大guy4這樣
不怎麼高明的解決方法,但現在終於能比較簡單的閱讀程式碼了.....
參考資料:
https://zhuanlan.zhihu.com/p/36279445
https://bit.ly/2IQYXQT
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 110.26.6.130
※ 文章網址: https://www.ptt.cc/bbs/Editor/M.1555986620.A.22A.html
※ 編輯: wei115 (110.26.6.130), 04/23/2019 10:33:46
推 mars90226: 我最近轉用lsp了,用neovim+coc.nvim+ccls來看C++ code 04/23 16:35
→ mars90226: 雖然有些時候不如預期就是了,#define 包住的會找不到 04/23 16:36
→ mars90226: 然後我可能沒有真的讓他把全部code index,有時候會找 04/23 16:36
→ mars90226: 不到應該要有的東西,這部份倒是可以用grep補 04/23 16:37
→ mars90226: 建議設一個mapping可以用fzf+ripgrep去搜尋cursor word 04/23 16:38
→ mars90226: 很多時候只要這樣就可以找到大部分的東西 04/23 16:38