Vim i ctags tips and tricks [zamknięty]

Obecnie pytanie to nie pasuje do naszego formatu pytań i odpowiedzi. Oczekujemy, że odpowiedzi będą poparte faktami, referencjami lub wiedzą specjalistyczną, ale to pytanie będzie prawdopodobnie wywoływało debatę, argumenty, ankiety lub rozszerzoną dyskusję. Jeśli uważasz, że to pytanie można poprawić i ewentualnie ponownie otworzyć, odwiedź Pomoc centrum dla wskazówek. Zamknięty 9 lat temu . zamknięte. To pytanie i jego odpowiedzi są zamknięte , ponieważ pytanie jest off-topic, ale ma znaczenie historyczne. Obecnie nie przyjmuje nowych odpowiedzi ani interakcji.

Właśnie zainstalowałem Ctags (aby pomóc w rozwoju C++) z moim Vim (a raczej gVim) i chciałbym dowiedzieć się, jakie są Twoje ulubione polecenia, makra, skróty, wskazówki, które mu towarzyszą...

Podziel się swoim najlepszym arsenałem. Jakie inne dodatki Vim polecacie do tworzenia C++ on vim?

Edytuj jaki inny dodatek użyłbyś w połączeniu z Ctags?

EDIT2 jakiej wersji gVim używasz z tagami? Czy to coś zmienia?

EDIT3 Jak zwiększyć swoje doświadczenie w programowaniu zarówno dużych, jak i małych projektów?

Author: kenorb, 2009-02-19

15 answers

Ctrl+] - przejdź do definicji
Ctrl+T - cofnij się od definicji.
Ctrl+W Ctrl+] - Otwórz definicję w układzie poziomym

Dodaj te linie w vimrc
map <C-\> :tab split<CR>:exec("tag ".expand("<cword>"))<CR>
map <A-]> :vsp <CR>:exec("tag ".expand("<cword>"))<CR>

Ctrl+\ - Otwórz definicję na nowej karcie
Alt+] - Otwórz definicję w pionie

Po wygenerowaniu znaczników. Możesz użyć następujących klawiszy aby oznaczyć i oznaczyć funkcje:

Ctrl+Left MouseClick - Przejdź do definicji
Ctrl+Right MouseClick - Jump back from definition

 394
Author: Amjith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-08 04:53:51

Jedna linijka, która zawsze wchodzi w mojevimrc:

set tags=./tags;/

To będzie wyglądać w bieżącym katalogu dla "tagów" i pracować w górę drzewa w kierunku korzenia, aż jeden zostanie znaleziony. Możesz być wszędzie w swoim drzewie źródłowym,a nie tylko korzeniu.

 176
Author: uzi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-16 21:52:36

Innym przydatnym pluginem do tworzenia C jest cscope Podobnie jak Ctags pozwala przeskakiwać do definicji, Cscope przeskakuje do funkcji wywołujących .

Jeśli masz cscope w katalogu ~ / bin/, Dodaj do swojegovimrc i użyj g^], aby przejść do funkcji wywołującej (patrz: 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
Prawie zapomniałem... Podobnie jak ctags - musisz wygenerować (i okresowo aktualizować) bazę danych. Używam następującego skryptu
select_files > cscope.files
ctags -L cscope.files
ctags -e -L cscope.files
cscope -ub -i cscope.files

Gdzie' select_files ' jest kolejny skrypt, który wyodrębnia listę plików C i nagłówkowych z pliku Makefile. W ten sposób indeksuję tylko pliki faktycznie używane przez projekt.

 45
Author: nimrodm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 15:40:48

Możesz dodawać katalogi do wyszukiwania ctags. Na przykład, mam indeks ctags zbudowany dla Qt4, i mam to w moim .vimrc:

set tags+=/usr/local/share/ctags/qt4
 27
Author: strager,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 01:41:54

Wszystkie powyższe i...

Code_complete: parametr funkcji kompletny, fragmenty kodu i wiele więcej.

Taglist.vim: przeglądarka kodu źródłowego (obsługuje C / C++, java, perl, python, tcl, sql, php itp.)

 23
Author: Johan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-06 10:52:29

Używam ALT-left I ALT-right, aby pop / push from / to the tag stack.

" Alt-right/left to navigate forward/backward in the tags stack
map <M-Left> <C-T>
map <M-Right> <C-]>

Jeśli używasz hjkl do poruszania się, możesz zamiast tego zmapować <M-h> i <M-l>.

 16
Author: strager,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 01:47:21

Kilka definicji o tej samej nazwie

<C-w>g<C-]> otwórz definicję w podziale, ale również zrób :tjump, która albo przechodzi do definicji lub, jeśli istnieje kilka definicji, wyświetla listę definicji do wyboru.

 10
Author: Heikki Naski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-22 19:06:43

Najczęściej używam polecenia C -], które przeskakuje do definicji funkcji pod kursorem. Możesz go używać częściej, aby śledzić więcej połączeń. Po tym, C-o przywróci ci jeden poziom, C-i znów zejdzie głębiej.

 8
Author: raimue,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 01:45:25

Znalazłem taglist plug-in a must-have. Wyświetla wszystkie znaczniki, o których wie (pliki, które otworzyłeś) w oddzielnym oknie i ułatwia nawigację po większych plikach.

Używam go głównie do programowania Pythona, ale może być lepszy tylko dla C / C++.

 6
Author: Walter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-21 09:52:25

Zamknąłem manipulację tagami w eksperymentalnej wtyczce mojej.

Jeśli chodzi o rozwój C++ w Vimie, odpowiedziałem już tam: używam własnego pakietu i kilku innych wtyczek.

 5
Author: Luc Hermitte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:26

Od dwóch lat dostosowuję moje wtyczki Vima do obsługi projektu big enough c++. Możesz na nie spojrzeć.

Używają ctags i cscsope.

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

 5
Author: Mykola Golubyev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-14 14:47:19

Umieściłem następujące w moim .plik gvimrc, który przeszukuje drzewo z dowolnego punktu w poszukiwaniu pliku znaczników po uruchomieniu gvim:

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

Następnie okresowo regeneruję plik znaczników na górze mojego drzewa źródłowego skryptem, który wygląda następująco:

#!/bin/bash

find . -regex ".*\.\(c\|h\|hpp\|cc\|cpp\)" -print | ctags --totals --recurse --extra="+qf" --fields="+i" -L -
 4
Author: alanwj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-17 23:22:01

Używam Vima w macos, a oryginalny ctags nie działa dobrze, więc pobieram najnowszy i konfiguruję make make install GO. Instaluję ctgas w /usr / local/bin / ctags (aby zachować oryginalny)

"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
Author: Zhenyu Li,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-27 06:16:27

Dostosowałem powyższą funkcję wyszukiwania SetTags () (którą należy zastąpić równoważną set tags+=./tags;/) do pracy dla cscope. Wygląda na to, że działa!

"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
Author: dergachev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-04 18:50:34

Kolejna iteracja w funkcji SetCscope () powyżej. Ustawia ścieżkę wstępną cscope, aby uzyskać dopasowania bez bycia w katalogu gdzie " cscope.out " jest:

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
Author: saoret.one,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-13 16:53:19