ctags ignorieren Listen für libc6, libstdc++ und boost

Lesezeit: 6 Minuten

Benutzer-Avatar
Robert S. Barnes

Ich verwende ctags mit vim und dem OmniCppComplete Plugin. Derzeit generiere ich meine Tags einzeln für jede Bibliothek. Für libc6 verwende ich die folgende Liste von Tokens/Makros in einer Datei namens libc6-ignore, um sie während der Verarbeitung zu ignorieren:

__attribute__
__attribute_deprecated__
__attribute_format_arg__
__attribute_format_strfmon__
__attribute_malloc__
__attribute_noinline__
__attribute_pure__
__attribute_used__
__attribute_warn_unused_result__
__wur
__THROW
__nonnull+

Fehlen mir andere Token, die ich ignorieren sollte, und sollte ich dieselbe Liste oder eine andere verwenden, wenn ich Tags für libstdc++ und Boost generiere?

Für alle, die daran interessiert sind, verwende ich Folgendes, um meine Tag-Dateien zu generieren:

# First make sure apt-file is install and then do:

$ sudo apt-file update

# set up tags for libc, the standard C library

$ apt-file list libc6-dev | grep -o '/usr/include/.*\.h'> ~/.vim/tags/libc6-filelist
$ ctags --sort=foldcase --c++-kinds=+p --fields=+iaS --extra=+q -I./libc6-ignore -f ~/.vim/tags/libc6 -L ~/.vim/tags/libc6-filelist 

# create tags for stdlibc++ and STL

$ apt-file list libstdc++6-4.4-dev | grep -E -o '/usr/include/.*\.(h|hpp)' > ~/.vim/tags/stdlibcpp-filelist
$ ctags --sort=foldcase -R --c++-kinds=+p --fields=+iaS --extra=+q -f ~/.vim/tags/stdlibcpp -L ~/.vim/tags/stdlibcpp-filelist

# For Boost

$ 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 

  • Ich denke über die Frage nach, würde es aber in der Zwischenzeit nicht tun dpkg -L schneller sein als apt-file list?

    – Phil Lello

    4. Mai 2011 um 1:57 Uhr

  • @Phil Lello: Weiß nicht, halte es nicht für relevant und klingt sowieso nach verfrühter Optimierung 😉

    – Robert S.Barnes

    4. Mai 2011 um 6:32 Uhr

Benutzer-Avatar
Alexandros

Sie können auch die modifizierte libstdc++-Bibliothek verwenden:

http://www.vim.org/scripts/script.php?script_id=2358

Diese enthält eine abgespeckte Version der C++-Header-Dateien, die für ctags funktioniert.

Ich habe ein Python-Skript erstellt, das alle Tags, die mit einem Unterstrich beginnen, aus einer Tag-Datei extrahiert. Sie können mit diesem Skript auswählen, welche Tags ausgeschlossen werden sollen. Fühlen Sie sich frei, das Skript an Ihre Bedürfnisse anzupassen oder etwas anderes vorzuschlagen:

import re

tags=open('tags','r')
output=open('exclude','w')
regex=re.compile('^_[a-zA-Z0-9_]*')
results=set()

for line in tags:
    result=regex.match(line)
    if(result!=None):
        results.add(result.group(0))

tags.close()

for element in sorted(results):
    output.write('{0}\n'.format(element))

output.close()

  • Ich habe mir das angesehen und bin mir nicht sicher, ob es notwendig ist. Bisher habe ich die Tags-Datei generiert scheint den Job machen.

    – Robert S.Barnes

    8. Mai 2011 um 4:50 Uhr

  • @Robert S. Barnes: Ich hoffe, meine Antwort ist jetzt besser.

    – Alexandros

    8. Mai 2011 um 10:22 Uhr

Ich habe diese Anweisungen befolgt und bin in der Lage, alle Boost-Boost-Referenzen zum Laufen zu bringen, dh

#include <iostream>

Ich kann direkt zu iostream springen

Was mir jedoch noch fehlt, ist zum Beispiel dorthin zu gehen

#include <stdio.h>

Obwohl ich in meinem Generate-Skript, wie Sie erwähnt haben, dh

$ apt-file list libc6-dev | grep -o '/usr/include/.*\.h'> ~/.vim/tags/libc6-filelist
$ ctags --sort=foldcase --c++-kinds=+p --fields=+iaS --extra=+q -I./libc6-ignore -f ~/.vim/tags/libc6 -L ~/.vim/tags/libc6-filelist 

Nachdem ich die Tag-Datei “libc6” generiert habe, wann immer ich versuche, zu stdio.h zu gehen, heißt es “E426: Tag nicht gefunden: stdlib”.

Hier ist, was ich zusätzlich zu meiner .vimrc eingefügt habe, um alle diese 3 Tag-Dateien sichtbar zu machen.

set tags+=~/.vim/tags/boost
set tags+=~/.vim/tags/libc6
set tags+=~/.vim/tags/stdlibcpp

Ich bin kein Experte, aber ich kann sagen, dass dies irgendwie für Boost funktioniert hat, aber nicht für libc6-dev. Kann mir jemand bei der Lösung behilflich sein

Hier ist der gleiche Code wie oben

sudo apt-file update

# set up tags for libc, the standard C library

apt-file list libc6-dev | grep -o '/usr/include/.*\.h'> ~/.vim/tags/libc6-filelist
ctags --sort=foldcase --c++-kinds=+p --fields=+iaS --extra=+q -I./libc6-ignore -f ~/.vim/tags/libc6 -L ~/.vim/tags/libc6-filelist

apt-file list libstdc++6-4.6-dev | grep -E -o '/usr/include/.*\.(h|hpp)' >> ~/.vim/tags/stdlibcpp-filelist
ctags --sort=foldcase -R --c++-kinds=+p --fields=+iaS --extra=+q -f ~/.vim/tags/stdlibcpp -L ~/.vim/tags/stdlibcpp-filelist

# For Boost
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

Tut mir leid – ich habe Ctags noch nie benutzt – aber ich werde diese Frage einmal versuchen.

Wenn ich das richtig verstehe, können Sie die Liste der Schlüsselwörter von GCC selbst verwenden. ich habe das gefunden https://gist.github.com/959484 Innerhalb gcc/gcc/c-family/c-common.c. Sieht so aus, als ob es reservierte Wörter für alle C-Varianten (c/c++/obj-c-Varianten) enthält. Ich denke, einige gelten für alle Compiler, diese sind natürlich für gcc.

Um andere zu ignorierende Symbole herauszufinden, würde ich unter OS X nm verwenden, um die Symbole der fraglichen Bibliothek auszugeben und alle als privat markierten Symbole (z. B. ‘s’ anstelle von ‘S’) zu meiner Symbolliste hinzuzufügen ignorieren. Linux hat ein ähnliches Tool zum Dumping von Bibliotheken?

Hoffe, das ist nützlich.

  • Linux hat nm zu. Ebenfalls objdump.

    – Johannes Zwinck

    8. Mai 2011 um 17:22 Uhr

  • OS X verwendet die gleichen GNU-Binutils, die wir unter Linux verwenden, einschließlich nm, objdumpetc.

    – Grauschimmer

    9. Mai 2011 um 21:18 Uhr

Benutzer-Avatar
David Harrison

Ich hatte meine eigene Liste und habe nie daran gedacht, das hinzuzufügen, was Sie bereits aufgelistet haben!

Hier ist die aktualisierte Ignorierliste für libc6, die ich mir ausgedacht habe (Ubuntu 14.04 und GCC 4.8.4), um sie als Eingabe für die Option -I von ctags zu verwenden:

__attribute__
__attribute_deprecated__
__attribute_format_arg__+
__attribute_format_strfmon__+
__attribute_malloc__
__attribute_noinline__
__attribute_pure__
__attribute_used__
__attribute_warn_unused_result__
__attribute_alloc_size__+
__attribute_const__
__attribute_artificial__
__wur
__THROW
__THROWNL
__BEGIN_DECLS
__END_DECLS
__BEGIN_NAMESPACE_STD
__END_NAMESPACE_STD
__USING_NAMESPACE_STD+
__BEGIN_NAMESPACE_C99
__END_NAMESPACE_C99
__USING_NAMESPACE_C99+
__warndecl+
__warnattr+
__errordecl+
__flexarr=[]
__fortify_function
__REDICRECT+
__REDIRECT_NTH+
__REDIRECT_NTHNL+
__ASMNAME+
__ASMNAME2+
__nonnull+
__always_inline
__extern_inline=extern
__extern_always_inline=extern
__extension__
__restrict
__restrict_arr

Ich habe auch die folgende Ignorierliste zum Generieren einer Tag-Datei für libstdc++ (GCC 4.8.2 unter Ubuntu 14.04) erstellt (auch dies ist eine Eingabe für die Option -I):

_GLIBCXX_BEGIN_NAMESPACE_VERSION
_GLIBCXX_END_NAMESPACE_VERSION
_GLIBCXX_BEGIN_NAMESPACE_ALGO
_GLIBCXX_END_NAMESPACE_ALGO
_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_GLIBCXX_END_NAMESPACE_CONTAINER
_GLIBCXX_BEGIN_EXTERN_C
_GLIBCXX_END_EXTERN_C
_GLIBCXX_VISIBILITY+
_GLIBCXX_PURE
_GLIBCXX_CONST
_GLIBCXX_NORETURN
_GLIBCXX_CONSTEXPR=constexpr
_GLIBCXX_USE_CONSTEXPR=constexpr
_GLIBCXX_THROW_OR_ABORT+
_GLIBCXX_NOEXCEPT
_GLIBCXX_USE_NOEXCEPT
_GLIBCXX_THROW+
_GLIBCXX_NOTHROW

ich habe mich verändert __attribute__ sein: __attribute__+ um anzuzeigen, dass es wie eine Funktion aussieht und ignoriert werden sollte.

Natürlich habe ich auch eine für Boost erstellt, aber ich denke, ich werde davon absehen, sie zu posten, bis jemand Bedarf hat.

1345460cookie-checkctags ignorieren Listen für libc6, libstdc++ und boost

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy