Vim und Ctags Tipps und Tricks

Ich habe gerade Ctags (um mit C ++ Entwicklung zu helfen) mit meinem Vim (oder besser gVim) installiert, und würde gerne Ihre Lieblingsbefehle, Makros, Abkürzungen, Tipps, die damit einhergehen, herausfinden …

Teile dein bestes Arsenal. Welche anderen Vim Add-Ons würden Sie für C ++ auf Vim-Entwicklung empfehlen?

EDIT Was andere Add-on Sie in Verbindung mit Ctags verwenden würden?

EDIT2 Welche Version von gVim verwenden Sie mit Tags? Macht es einen Unterschied?

EDIT3 Wie verbessern Sie Ihre Programmiererfahrung für große und kleine Projekte?

Strg + ] – Gehe zur Definition
Strg + T – Springe von der Definition zurück.
Strg + W Strg + ] – Öffnet die Definition in einer horizontalen Teilung

Fügen Sie diese Zeilen in vimrc hinzu
map :tab split:exec("tag ".expand(""))
map :vsp :exec("tag ".expand(""))

Strg + \ – Öffnet die Definition in einem neuen Tab
Alt + ] – Öffnet die Definition in einer vertikalen Teilung

Nachdem die Tags generiert wurden. Mit den folgenden Schlüsseln können Sie functionen markieren und kennzeichnen:

Strg + Left MouseClick – Gehe zur Definition
Strg + Right MouseClick – Springe von der Definition zurück

Eine Zeile, die immer in meine .vimrc geht:

 set tags=./tags;/ 

Dies wird im aktuellen Verzeichnis nach “Tags” suchen und den Baum bis zur Wurzel aufarbeiten, bis einer gefunden wird. IOW, Sie können überall in Ihrem Quellbaum sein, anstatt nur die Wurzel davon.

Ein weiteres nützliches Plugin für die C-Entwicklung ist cscope Genau wie Ctags Sie zu den Definitionen springen lässt, springt Cscope zu den aufrufenden functionen.

Wenn Sie cscope in Ihrem Verzeichnis ~ / bin / haben, fügen Sie Ihrer .vimrc Folgendes hinzu und verwenden Sie g ^], um zur aufrufenden function zu wechseln (siehe: help cscope).

 if has("cscope") set csprg=~/bin/cscope set csto=0 set cst set nocsverb " add any database in current directory if filereadable("cscope.out") cs add cscope.out " else add database pointed to by environment elseif $CSCOPE_DB != "" cs add $CSCOPE_DB endif endif 

Fast vergessen … Genau wie Ctags – Sie müssen die database generieren (und regelmäßig aktualisieren). Ich benutze das folgende Skript

 select_files > cscope.files ctags -L cscope.files ctags -e -L cscope.files cscope -ub -i cscope.files 

Wobei “select_files” ein anderes Skript ist, das die Liste der C- und Header-Dateien aus dem Makefile extrahiert. Auf diese Weise indexiere ich nur die Dateien, die tatsächlich vom Projekt verwendet werden.

Sie können Verzeichnisse zu Ihrer Ctags-Suche hinzufügen. Zum Beispiel habe ich einen Ctags-Index für Qt4 erstellt und habe dies in meiner .vimrc:

 set tags+=/usr/local/share/ctags/qt4 

Alle oben genannten und …

code_complete: function parameter complete, Codeschnipsel und vieles mehr.

taglist.vim: Quellcode-Browser (unterstützt C / C ++, Java, Perl, Python, Tcl, SQL, PHP usw.)

Ich benutze ALT-links und ALT-rechts, um von / zum Tag-Stack zu springen / zu pushen.

 " Alt-right/left to navigate forward/backward in the tags stack map   map   

Wenn Sie hjkl für die Bewegung verwenden, können Sie stattdessen und .

Mehrere Definitionen desselben Namens

g Öffnen Sie die Definition in einem Split, aber tun Sie auch :tjump das entweder zur Definition geht oder Ihnen, wenn es mehrere Definitionen gibt, eine Liste von Definitionen zur Auswahl :tjump .

Der Befehl, den ich am meisten verwende, ist C-], der zur Definition der function unter dem Cursor springt. Sie können es häufiger verwenden, um mehr Anrufen zu folgen. Danach bringt Co dich eine Stufe zurück, Ci geht wieder tiefer.

Ich habe das Taglist- Plug-in zu einem Muss gefunden. Es listet alle Tags auf, von denen es weiß (Dateien, die Sie geöffnet haben), in einem separaten Fenster und macht es sehr einfach, größere Dateien zu navigieren.

Ich benutze es hauptsächlich für Python-Entwicklung, aber es kann nur besser für C / C ++ sein.

Ich habe manipulierte Tags in einem experimentellen Plugin von mir eingekapselt.

Bezüglich der C ++ – Entwicklung in vim habe ich bereits geantwortet: Ich benutze meine eigene Suite und ein paar andere Plugins.

Ich habe meine vim-Plugins für zwei Jahre angepasst, um ein ausreichend großes C ++ – Projekt zu unterstützen. Sie können sie sich ansehen.

Sie benutzen Ctags und Cscsope.

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

Ich füge folgendes in meine .gvimrc-Datei ein, die den Baum von einem beliebigen Punkt aus nach einer Tag-Datei durchsucht, wenn gvim startet:

 function SetTags() let curdir = getcwd() while !filereadable("tags") && getcwd() != "/" cd .. endwhile if filereadable("tags") execute "set tags=" . getcwd() . "/tags" endif execute "cd " . curdir endfunction call SetTags() 

Ich generiere dann regelmäßig eine Tag-Datei am Anfang meines Quellbaums mit einem Skript, das wie folgt aussieht:

 #!/bin/bash find . -regex ".*\.\(c\|h\|hpp\|cc\|cpp\)" -print | ctags --totals --recurse --extra="+qf" --fields="+i" -L - 

Ich benutze Vim in Macos, und die ursprünglichen Ctags funktioniert nicht gut, also lade ich neueste und konfigurieren make make install. Ich installiere Ctgas in / usr / local / bin / ctags (um das Original zu behalten)

 "taglist let Tlist_Ctags_Cmd = "/usr/local/bin/ctags" let Tlist_WinWidth = 50 map ta :TlistToggle map bta :!/usr/local/bin/ctags -R . set tags=tags;/ map   map   

Ich habe die Suchfunktion von SetTags () oben angepasst (die durch die äquivalenten set tags+=./tags;/ ) ersetzt werden sollte, um für cscope zu funktionieren. Scheint zu arbeiten!

 "cscope file-searching alternative function SetCscope() let curdir = getcwd() while !filereadable("cscope.out") && getcwd() != "/" cd .. endwhile if filereadable("cscope.out") execute "cs add " . getcwd() . "/cscope.out" endif execute "cd " . curdir endfunction call SetCscope() 

Eine weitere Iteration für die obige function SetCscope (). Dadurch wird cscope pre-path gesetzt, um Übereinstimmungen zu erhalten, ohne sich auf dem Verzeichnis befinden zu müssen, auf dem sich “cscope.out” befindet:

 function s:FindFile(file) let curdir = getcwd() let found = curdir while !filereadable(a:file) && found != "/" cd .. let found = getcwd() endwhile execute "cd " . curdir return found endfunction if has('cscope') let $CSCOPE_DIR=s:FindFile("cscope.out") let $CSCOPE_DB=$CSCOPE_DIR."/cscope.out" if filereadable($CSCOPE_DB) cscope add $CSCOPE_DB $CSCOPE_DIR endif command -nargs=0 Cscope !cscope -ub -R & endif