ctags ignorieren Listen für libc6, libstdc++ und boost
Lesezeit: 6 Minuten
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:
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
Alexandros
Sie können auch die modifizierte libstdc++-Bibliothek verwenden:
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
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
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:
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):
Ich denke über die Frage nach, würde es aber in der Zwischenzeit nicht tun
dpkg -L
schneller sein alsapt-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