Ein Tag-Sprung, mit dem Sie mit einer einzigen Taste zu einer Funktionsdefinition oder Referenz springen können. Heutzutage ist es eine unverzichtbare Funktion zum Lesen von Code, aber es ist möglich, dies mit "Indexern" wie Ctags und GNU GLOBAL (Gtags) zu tun. In diesem Artikel werde ich beschreiben, wie Sie Rtags einrichten, das ein großartiger Indexer für C / C ++ ist, und wie Sie mit Vim arbeiten.
Indexer ist ein Programm, das den Quellcode analysiert und eine Tag- (Index-) Datenbank erstellt, die die Symbolnamen und Positionen von Funktionen und Variablen aufzeichnet. Ctags ist heute einer der am häufigsten verwendeten Indexer und unterstützt über 40 Sprachen, darunter C, Ruby und Python. In C ++ kann der interne Parser aufgrund der Komplexität der Grammatik jedoch nicht ausreichend damit umgehen und der Symbolname wird möglicherweise nicht richtig erkannt. Gtags hat ein ähnliches Problem. Hier kamen kürzlich Rtags ins Spiel. Rtags zeichnet sich durch die Verwendung der Syntaxanalyse-Schnittstelle von clang aus, einem C / C ++ - Compiler. Da der Compiler den Quellcode analysiert, können keine Fehler auftreten und es ist sehr rational.
Die Installation selbst erfordert nur einen Build und ist nicht besonders schwierig.
In meinem Ubuntu-14.04 habe ich mit dem folgenden Befehl eingegeben. Wenn Sie die Version von libclang mit llvm-config überprüfen, werden Sie feststellen, dass es sich um 3.4 handelt.
$ sudo apt-get install clang libclang-dev cmake
$ llvm-config --version
3.4
Es gibt kein Problem, aber es wird empfohlen, libclang auf 3.5 oder höher zu setzen. Daher ist es eine gute Idee, 3.6 zu installieren.
$ sudo apt-get install libclang-3.6-dev
$ /usr/lib/llvm-3.6/bin/llvm-config --version
3.6
In diesem Fall müssen Sie, wenn Sie cmake später ausführen, LIBCLANG_LLVM_CONFIG_EXECUTABLE
den Pfad von 3.6 llvm-config geben und ihn wie unten gezeigt ausführen. Wenn Sie dies vergessen, wird die Standardeinstellung 3.4 verwendet.
$ LIBCLANG_LLVM_CONFIG_EXECUTABLE=/usr/lib/llvm-3.6/bin/llvm-config cmake ..
Klonen Sie das Repository und aktualisieren Sie die abhängigen Submodule.
$ git clone https://github.com/Andersbakken/rtags
$ cd rtags
$ git submodule init
$ git submodule update
Generiere und erstelle ein Makefile mit cmake. Erstellen Sie ein Build-Verzeichnis und erstellen Sie von dort aus Out-of-Source.
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install
Was ist ein Out-of-Source-Build? Für diejenigen, die sagen, dieser Artikel ist detailliert.
Nach Abschluss der Installation sollten Sie die Befehle "rc" und "rdm" verwenden können. Rtags ist ein Tag-System vom Typ Client-Server. Das Folgende ist ein grober Ablauf der Indizierung.
rdm
rc
**rdm
empfängt den obigen Befehl von rc
und indiziertDas Wichtigste ist, rc den Befehl compile zu geben. Es gibt ungefähr zwei Arten von Methoden.
rc -c
rc -J
rc -c
übergeben **Übergeben Sie den Kompilierungsbefehl der Zielquelldatei wie unten gezeigt direkt an rc
.
$ rc -c g++ a.cpp b.cpp
Dies ist für einige Quelldateien in Ordnung, aber in den meisten Fällen ist es schmerzhaft, jedes Mal einen solchen Befehl einzugeben. Daher gibt es eine Methode zur Verwendung des vom Autor bereitgestellten Wrapper-Skripts. Es wird empfohlen, Folgendes zu tun.
##Erstellen Sie ein bin-Verzeichnis in Ihrem Home-Verzeichnis
$ mkdir ~/bin
##Am Anfang des Suchpfads setzen
$ echo 'export PATH=${HOME}/bin:${PATH}' >> .bashrc
##Wrapper-Skript kopieren
$ cp rtags/bin/gcc-rtags-wrapper.sh ~/bin/gcc
$ cp rtags/bin/gcc-rtags-wrapper.sh ~/bin/g++
Auf diese Weise wird dieses Wrapper-Skript jedes Mal, wenn Sie einen Befehl gcc oder g ++ eingeben, aufgerufen und intern "rc -c" ausgeführt. Dies ist sehr praktisch, da die Indizierung jedes Mal erfolgt, wenn Sie kompilieren. Natürlich hat dies keinen Einfluss auf den Betrieb von gcc und g ++.
rc -J
**compile_commands.json ist eine JSON-Kompilierungsdatenbank, eine JSON-Datei, die die für die Kompilierung erforderlichen Informationen aufzeichnet. Sie können indizieren, indem Sie diese Datei in rc
laden
Neuere Build-Systeme wie cmake und ninja können die JSON-Kompilierungsdatenbank zur Build-Zeit ausgeben. Sie können also wie folgt vorgehen.
##Bei Verwendung von cmake
$ cmake . -DCMAKE_EXPORT_COMPILE_COMMANDS=1
$ rc -J .
##Bei Verwendung von Ninja
$ ninja -t commands | rc -c -
Wenn Sie ein kleines Projekt haben, das nur GNU Make verwendet, können Sie die Kompilierungsdatenbank mit Hilfe eines Tools namens Bear ausgeben. Diese Methode wird persönlich am meisten empfohlen. Erstellen und installieren Sie wie folgt.
$ git clone https://github.com/rizsotto/Bear
$ cd Bear
$ mkdir build && cd build
$ cmake ..
$ make && sudo make install
Es ist einfach zu bedienen, geben Sie einfach bear vor dem regulären Befehl make ein. Dadurch wird die Kompilierungsdatenbank basierend auf dem von Makefile aufgerufenen Kompilierungsbefehl ausgegeben.
$ bear make
$ rc -J .
Es gibt ein Plug-In namens vim-rtags. Es befindet sich noch in der Entwicklung, hat aber noch genügend Funktionen.
NeoBundle 'lyuts/vim-rtags'
Die Standard-Keymap hat viele Striche und ist etwas schwer zu treffen. Es gibt eine Zuordnung in plugin / rtags.vim, daher ist es eine gute Idee, darauf zu verweisen und sie einem anderen Schlüssel zuzuweisen. Ich habe die folgenden Einstellungen.
"Zur Definition springen
nnoremap <silent> <F3> :call rtags#JumpTo()<CR>
"Zur Referenz springen
nnoremap <silent> <F4> :<C-u>Unite<Space>rtags/references<CR>
"Springen Sie zum Anfang, wenn Sie sich in der Klassen- / Funktionsdefinition befinden
nnoremap <silent> <F5> :call rtags#JumpToParent()<CR>
Angenommen, Sie haben compile_commands.json bereits gedruckt und führen rc -J .
einmal aus. Wenn rdm
nicht läuft, starten Sie es.
$ rdm --daemon
Wenn ich es tatsächlich bewege, sieht es so aus.
Sie können sowohl zur Definition als auch zur Referenz springen. Die Referenzliste wird in einem Unite-Fenster geöffnet, sodass Sie sie leicht eingrenzen können. Rdm überwacht auch Dateiänderungen. Wenn Sie die Quelldatei speichern, wird der Index gleichzeitig automatisch aktualisiert.
Rtags enthält ein Plug-In für Emacs des Autors. Ausführliche Erläuterungen finden Sie unter hier und hier.
Bisher haben wir erklärt, wie der Indexer für C / C ++ "Rtags" verwendet wird. Der Texteditor ermöglicht eine Code-Navigation, die mindestens der IDE entspricht, was eine große Verbesserung darstellt. Das Setup ist etwas mühsam, aber wenn Sie C ++ als Hauptsprache verwenden, lohnt sich die Mühe auf jeden Fall.