Ich habe gerade Ctags (zur Unterstützung der C++ - Entwicklung) mit meinem Vim (oder besser gesagt mit gVim) installiert und möchte Ihre bevorzugten Befehle, Makros, Verknüpfungen und dazugehörigen Tipps herausfinden. .
Teile dein bestes Arsenal. Welche anderen Vim-Add-Ons würden Sie für C++ bei der Vim-Entwicklung empfehlen?
[~ # ~] edit [~ # ~] Welches andere Add-On würden Sie in Verbindung mit Ctags verwenden?
EDIT2 Welche Version von gVim verwenden Sie mit Tags? Macht es einen Unterschied?
EDIT3 Wie können Sie Ihre Programmiererfahrung für große und kleine Projekte verbessern?
Ctrl+] - gehe zur Definition
Ctrl+T - Von der Definition zurückspringen.
Ctrl+WCtrl+] - Öffnen Sie die Definition in einer horizontalen Aufteilung
Fügen Sie diese Zeilen in vimrc hinzumap <C-\> :tab split<CR>:exec("tag ".expand("<cword>"))<CR>
map <A-]> :vsp <CR>:exec("tag ".expand("<cword>"))<CR>
Ctrl+\ - Öffnen Sie die Definition in einer neuen Registerkarte
Alt+] - Öffnen Sie die Definition in einer vertikalen Teilung
Nachdem die Tags generiert wurden. Mit den folgenden Tasten können Sie Funktionen aktivieren und deaktivieren:
Ctrl+ Left MouseClick
- Zur Definition gehen
Ctrl+ Right MouseClick
- Von der Definition zurückspringen
Eine Zeile, die immer in meine .vimrc geht:
set tags=./tags;/
Dies sucht im aktuellen Verzeichnis nach "Tags" und arbeitet den Baum in Richtung root auf, bis einer gefunden wird. IOW, Sie können sich überall in Ihrem Quelltext befinden, anstatt nur an der Wurzel.
Ein weiteres nützliches Plugin für die C-Entwicklung ist cscope Genau wie Sie mit Ctags zu Definitionen springen können, springt Cscope zu den aufrufenden Funktionen.
Wenn Sie cscope in Ihrem ~/bin/-Verzeichnis haben, fügen Sie Folgendes zu Ihrer .vimrc hinzu und rufen Sie mit g ^] die aufrufende Funktion auf (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 bei ctags müssen Sie die Datenbank 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 weiteres Skript ist, das die Liste der C- und Header-Dateien aus dem Makefile extrahiert. Auf diese Weise indiziere ich nur die Dateien, die tatsächlich vom Projekt verwendet werden.
Sie können Ihrer Ctags-Suche Verzeichnisse hinzufügen. Zum Beispiel habe ich einen für Qt4 erstellten ctags-Index und diesen in meiner .vimrc:
set tags+=/usr/local/share/ctags/qt4
Alle oben genannten und ...
code_complete: Funktionsparameter complete, Code-Snippets 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/Push vom/zum Tag-Stapel zu verschieben.
" Alt-right/left to navigate forward/backward in the tags stack
map <M-Left> <C-T>
map <M-Right> <C-]>
Wenn Sie hjkl
für die Bewegung verwenden, können Sie <M-h>
und <M-l>
stattdessen.
Mehrere gleichnamige Definitionen
<C-w>g<C-]>
die Definition in einem Split öffnen, aber auch :tjump
, das entweder zur Definition wechselt oder, falls mehrere Definitionen vorhanden sind, eine Liste mit Definitionen zur Auswahl bereitstellt.
Der Befehl, den ich am häufigsten benutze, ist C-], der zur Definition der Funktion unter dem Cursor springt. Sie können es häufiger verwenden, um mehr Anrufe zu verfolgen. Danach bringt Sie C-o eine Ebene zurück, C-i geht wieder tiefer.
Ich habe das Taglist Plug-In als ein Muss empfunden. Es listet alle ihm bekannten Tags (Dateien, die Sie geöffnet haben) in einem separaten Fenster auf und erleichtert das Navigieren in größeren Dateien.
Ich benutze es hauptsächlich für Python Entwicklung, aber es kann nur für C/C++ besser sein.
Ich habe meine vim-Plugins seit zwei Jahren angepasst, um ein ausreichend großes c ++ - Projekt zu unterstützen. Sie können sie sich ansehen.
Sie verwenden ctags und cscsope.
http://www.vim.org/scripts/script.php?script_id=1638
http://www.vim.org/scripts/script.php?script_id=2507
Ich habe die Manipulation von Tags in einem experimentellen Plugin von mir eingekapselt.
Bezüglich der C++ - Entwicklung in vim habe ich bereits geantwortet dort : Ich verwende meine eigene Suite und einige andere Plugins.
Ich füge Folgendes in meine .gvimrc-Datei ein, die den Baum von jedem Punkt nach einer Tags-Datei durchsucht, wenn gvim gestartet wird:
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()
Anschließend generiere ich regelmäßig eine Tags-Datei am oberen Rand 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 verwende vim in Macos und die ursprünglichen ctags funktionieren nicht gut, also lade ich das neueste herunter und konfiguriere make make install it. Ich installiere ctgas in/usr/local/bin/ctags (um das Original beizubehalten)
"taglist
let Tlist_Ctags_Cmd = "/usr/local/bin/ctags"
let Tlist_WinWidth = 50
map <leader>ta :TlistToggle<cr>
map <leader>bta :!/usr/local/bin/ctags -R .<CR>
set tags=tags;/
map <M-j> <C-]>
map <M-k> <C-T>
Eine weitere Iteration der Funktion SetCscope () oben. Das setzt cscope Pre-Path, um Übereinstimmungen zu erhalten, ohne sich in dem Verzeichnis zu befinden, in 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
Ich habe die oben genannte SetTags () - Suchfunktion (die durch die Entsprechung set tags+=./tags;/
Ersetzt werden sollte) für cscope angepasst. Scheint zu funktionieren!
"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()