簡體   English   中英

為 Boost 生成合理的 ctags 數據庫

[英]Generating a reasonable ctags database for Boost

我正在運行 Ubuntu 8.04 並運行以下命令:

$ ctags -R --c++-kinds=+p --fields=+iaS --extra=+q -f ~/.vim/tags/stdlibcpp /usr/include/c++/4.2.4/

在我的系統上為標准 C++ 庫和 STL ( libstdc++ ) 生成 ctags 數據庫,以便與OmniCppComplete vim 腳本一起使用。 這給了我一個非常合理的 4MB 標簽文件,它似乎工作得很好。

但是,當我對已安裝的 Boost 標頭運行相同的命令時:

$ ctags -R --c++-kinds=+p --fields=+iaS --extra=+q -f ~/.vim/tags/boost /usr/include/boost/

我最終得到了一個 1.4 GB 的標簽文件! 我還沒有嘗試過,但這似乎太大而無用。 有沒有辦法為我安裝的 Boost 標頭獲得更纖薄、更有用的標簽文件?

編輯

請注意,libstdc++ 包含 TR1,其中包含分配的 Boost 庫。 因此,對於 libstdc++ 產生 4 MB 標簽文件而 Boost 最終產生 1.4 GB 標簽文件,肯定有一些奇怪的事情發生。

剛剛在 Boost 郵件列表上遇到了這個:

Boost-users Boost 和自動補全

答案

感謝 Neg_EV 找出問題所在,但有比他建議的更好的解決問題的方法:

確保 apt-file 已安裝,然后運行以下命令

(我將我的庫標簽保存在 ~/.vim/tags/ 中):

$ sudo apt-file update
$ apt-file list boost | grep -E -o '/usr/include/.*\.(h|hpp)' | grep -v '/usr/include/boost/typeof/' > ~/.vim/tags/boost-filelist
$ ctags --sort=foldcase --c++-kinds=+p --fields=+iaS --extra=+q -f ~/.vim/tags/boost -L ~/.vim/tags/boost-filelist

我已經升級到 Ubuntu 10.04 和 Boost 1.40,這就是我測試這個解決方案的原因,但據我所知,它應該適用於任何 Boost 版本。

我知道這篇文章有點舊,但我遇到了同樣的問題。 我進一步研究了一下,似乎是 boost 中的一個文件夾導致了問題: typeof 我使用的是 boost 1.37,我的標簽文件是 1.5G,typeof 是 1.4G。 所以我只是創建了一個不包含該目錄的標簽文件,結果大小為 70M。 我什至能夠在沒有空間不足的情況下對其進行排序:) 我想在較新版本的 boost 中,它們可能是其他太大的項目,但是我發現的一般解決方案是這樣的......

  1. 分別為每個 boost 文件夾生成一個標簽文件,一個簡單的 bash for 循環應該可以做到這一點。
  2. 看看哪個太大了。
  3. 要么創建一個新的單個標簽文件,不包括那些大目錄,要么將標簽文件分開,簡單地刪除那些太大的文件。

這是我使用的腳本(摘自評論):

for i in $(find -maxdepth 1 -type d | grep -v '^\.$' | sed 's/\.\///' ); do
    echo $i;
    ctags -f ~/tmp_tags/$i.tags -R --c++-kinds=+p --fields=+iaS --extra=+q --languages=c++ --sort=foldcase $i;
done

希望這可以幫助。

使用選項

--sort=foldcase

有了這個標簽的搜索變得更快。

引用ctags手冊頁:“foldcase 值指定不區分大小寫(或大小寫折疊)的排序。使用大小寫折疊排序的標記文件的快速二進制搜索將需要使用標記文件的工具的特殊支持,例如在ctags readtags 庫,或 Vim 6.2 或更高版本(使用“set ignorecase”)。此選項必須出現在第一個文件名之前”

您應該將此選項添加到您的 ctags 調用中:

    -I "BOOST_SYMBOL_VISIBLE BOOST_SYMBOL_IMPORT BOOST_SYMBOL_EXPORT BOOST_FORCEINLINE BOOST_CONSTEXPR=constexpr BOOST_CONSTEXPR_OR_CONST=constexpr BOOST_STATIC_CONSTEXPR=static\ constexpr BOOST_STD_EXTENSION_NAMESPACE=std BOOST_MOVABLE_BUT_NOT_COPYABLE+ BOOST_COPYABLE_AND_MOVABLE+ BOOST_COPYABLE_AND_MOVABLE_ALT+ BOOST_NOEXCEPT=noexcept BOOST_NOEXCEPT_OR_NOTHROW=noexcept BOOST_NOEXCEPT_IF+ BOOST_NOEXCEPT_EXPR+ BOOST_STATIC_CONSTANT BOOST_DELETED_FUNCTION BOOST_DEFAULTED_FUNCTION BOOST_NESTED_TEMPLATE BOOST_UNREACHABLE_RETURN+ BOOST_DEDUCED_TYPENAME=typename BOOST_CTOR_TYPENAME=typename BOOST_LIKELY+ BOOST_UNLIKELY+ BOOST_ALIGNMENT+ BOOST_FALLTHROUGH"

這是我用於 Boost 1.55 的整個 /usr/include/boost 子目錄的內容。 我得到一個大約 128MB 的標簽文件。 -I 似乎是這里的關鍵,有助於過濾掉虛假標簽生成。

注意:我在 Ubuntu 14.04 上使用 ctags 5.9。 我有一個特殊的 -I 用於為 C++ 標准頭生成 ctags。 我花了一段時間才弄清楚為什么有些頭文件幾乎不生成標簽,而其他頭文件生成大量標簽。

因為生成的方法(例如 vector50.hpp vector100.hpp ...)太多了,以至於 ctags 生成一個大的標簽文件

  1. find /usr/include ( -name " .h" -o -name " .hpp" ) boost/typeof > boost_files.txt
  2. 編輯 boost_files.txt 並刪除 vector50.hpp vector100.hpp vector150.hpp vector200.hpp
  3. ctags --c++-kinds=+px --fields=+iaS --extra=+q -f test.tags -L boost_files.txt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM