it-swarm.com.de

Tipps und Tricks zu Vim und Ctags

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?

485
Sasha

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 hinzu
map <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

394
Amjith

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.

176
uzi

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.

45
nimrodm

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
27
strager

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

23
Johan

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.

16
strager

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.

10
Heikki Naski

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.

8
raimue

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.

6
Walter

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

5
Mykola Golubyev

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.

5
Luc Hermitte

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 -
4
alanwj

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>
2
Zhenyu Li

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
1
saoret.one

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()
1
dergachev