2012-11-24 31 views
4

良好的一天,多個地方採購標籤,VIM - 從項目

我通常工作在相對較小(不到2萬行代碼),它們包含在單個目錄中的所有自我,有自己的Makefile項目,很容易處理。

VIM是我喜歡的編輯器,當我打開一個項目,我通常通過映射建立的ctags列表中F10鍵:

map <F10> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR> 

這讓我跳到的定義通過將光標移動到文本上,然後敲擊CTRL + ]以及通過OmniCppComplete使用代碼完成和下拉列表來實現變量/結構/等。

但是,我現在正在研究一個稍大的項目,該項目使用了大量的結構。而且,這些結構中的很多都有其他自定義結構的數組作爲成員,所以現在代碼完成對我來說是非常有用和重要的工具。

我有兩個路徑,其中包括大量的.C文件和.h文件,並且它們可能因機器而異。在每一臺機器,但是,我們有我們的.bashrc文件中的環境變量指向他們,像這樣:

SDK_SRC_PLUS_HEADERS=/public/sdk 
THIRD_PARTY_SDK=/private/sdk 

我希望能夠有VIM自動引用的這些附加路徑的內容時,我嘗試(通過VIM內置的OmniCppComplete功能),或者跳轉到這些位置的文件,當我在VIM中使用CTRL + ]跳轉到結構,函數,變量等的定義

因此,對於上述兩個路徑,我將它們放入其中,並生成第電子標籤通過ctags -R。然後,我修改了~/.vimrc文件,包括附加標籤的路徑,像這樣:

tags=./tags 
tags+=$SDK_SRC_PLUS_HEADERS/tags 
tags+=$THIRD_PARTY_SDK/tags 

然後cd到我在/home/user1/projects/test項目,我,開始VIM,和VIM打F10索引它。但是,這根本不起作用。事實上,它打破了我僅僅爲項目本身使用標籤的能力(即:CTRL + ]現在什麼都不做)。

有沒有人有任何建議,我可以如何通過環境變量使用多個源代碼目錄來完成代碼完成源代碼和跳轉到定義?

非常感謝大家的時間和幫助!

+2

嗯這一直爲我工作。您是否使用':verbose set tags?'檢查了標籤的值? – sehe

+0

@sehe肯定。我通過上面的命令檢查了輸出,結果是:'tags =。/ tags,$ SDK_SRC_PLUS_HEADERS/tags,$ SDK_SRC_PLUS_HEADERS/tags'。我想知道它是否可以像BASH環境變量的語法一樣簡單(即:也許我需要使用某種VIM函數來取消引用環境變量並將它們減少到絕對路徑?)。 – DevNull

+1

是的,如果它沒有擴展,我只打賭〜支持 – sehe

回答

1

確實似乎是你不能在標籤設置中使用環境變量的問題。

我想出了這個作爲一種解決方法:

:let &tags.=expand(",$SDK_SRC_PLUS_HEADERS/tags") 

這可能是稍微更友好:

:exec expand("set tags+=$SDK_SRC_PLUS_HEADERS/tags") 
+1

嗯,':help'tags''說_環境變量擴展|:set_env | ._ –

+1

嗯。是啊。看起來你是對的。但是,這不是我的Windows系統上發生的事情,IIRC - 我檢查了它。我會看看我以後能否再試一次 – sehe

1

我想添加到由@sehe提供的解決方案。

這是我對我的.vimrc所做的最後一組更改。第一行用於將擴展的環境變量路徑添加到我的tags變量中。另一種是在事件自動更新的標籤,我要更新我的SDK,並且不希望能意外地使用了過期標籤:

" CTAGS tag generation for OmniCppComplete 
set tags+=./tags 
exec expand("set tags+=$SDK_SRC_PLUS_HEADERS/tags") 
exec expand("set tags+=$THIRD_PARTY_SDK/tags") 
" Can verify taglist is correct via ":set verbose tags?" command 

" Create a mapping to delete the old tags, re-generate them, and use them 
map <F10> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q . \| rm -f $SDK_SRC_PLUS_HEADERS/tags \| ctags -R -f $SDK_SRC_PLUS_HEADERS/tags $SDK_SRC_PLUS_HEADERS/tags \| rm -f $THIRD_PARTY_SDK/tags \| ctags -R -f $THIRD_PARTY_SDK/tags $THIRD_PARTY_SDK/tags \| echo "Done re-generating tags."<CR>