[LINUX] Verwenden Sie ernsthaft den stärksten C / C ++ - Indexer "Rtags".

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.

** Vorteile von Rtags **

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.

** Rtags installieren **

Die Installation selbst erfordert nur einen Build und ist nicht besonders schwierig.

** Erforderliche Pakete **

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 ..

** Bauen **

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.

** Rtags-Setup **

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.

  1. Starten Sie rdm
  2. ** Geben Sie einen Befehl zum Kompilieren der indizierten Quelldatei mit rc **
  3. rdm empfängt den obigen Befehl von rc und indiziert

Das Wichtigste ist, rc den Befehl compile zu geben. Es gibt ungefähr zwei Arten von Methoden.

  1. Übergeben Sie direkt mit dem Befehl rc -c
  1. Übergeben Sie die Datei compile_commands.json mit dem Befehl rc -J

** Methode 1: Direkt mit dem Befehl 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 ++.

** Methode 2: Laden Sie compile_commands.json mit dem Befehl 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 .

** Verwenden Sie Rtags von Vim **

Es gibt ein Plug-In namens vim-rtags. Es befindet sich noch in der Entwicklung, hat aber noch genügend Funktionen.

** Installation / Einstellungen **

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>

** Wie benutzt man **

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.

** Verwenden Sie Rtags von Emacs **

Rtags enthält ein Plug-In für Emacs des Autors. Ausführliche Erläuterungen finden Sie unter hier und hier.

** Am Ende **

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.

Recommended Posts

Verwenden Sie ernsthaft den stärksten C / C ++ - Indexer "Rtags".
Verwendung der C-Bibliothek in Python
[C] Verwenden Sie qsort ()