Vim ve Ctags ipuçları ve püf noktaları [kapalı]


485

Sadece yüklemiş Ctags (daha doğrusu GVIM) benim Vim ile (C ++ geliştirme konusunda yardım etmek) ve favori komutları, makro, kısayollar, onunla birlikte gitmek ipuçları öğrenmek istiyorum ...

En iyi cephaneliğini paylaş. Başka hangi Vim eklentileri C ++ on Vim geliştirme için önerirsiniz?

EDIT Ctags ile birlikte başka hangi eklentileri kullanırdınız?

EDIT2 Hangi gVim sürümünü etiketlerle kullanıyorsunuz? Bir fark yaratır mı?

EDIT3 Hem büyük hem de küçük projeler için programlama deneyiminizi nasıl geliştirirsiniz?


15
En iyi sonuçlar için coşkulu ctags (modern bir uygulama) kullandığınızdan emin olun: ctags.sourceforge.net
idbrii

17
Belki kev yapıcı değildir?
Floyd

27
closed as not constructiveneredeyse iki yıl önce olsa da , benim için çok yapıcı
sazary

15
Bu soruyu kapatmanın asıl nedeninin şöyle olması gerektiğini düşünüyorum: "Bu soru, son derece yararlı olmasına rağmen, Soru-Cevap StackOverflow politikasına uymuyor. sorular ve cevaplar".
Diego Pino

2
SO'nun kuralları göz önüne alındığında, bu sorunun neden kapandığını anlıyorum. Ama> 400 upvote sorusunu silme için 300 upvote cevabı ile işaretlemek huysuz tarafta biraz, değil mi?
DevSolar

Yanıtlar:


394

Ctrl+ ]- tanıma git
Ctrl+ T- Tanımdan geri atla.
Ctrl+ W Ctrl+ ]- Tanımı yatay bir bölmede aç

Bu satırları vimrc'e ekle
map <C-\> :tab split<CR>:exec("tag ".expand("<cword>"))<CR>
map <A-]> :vsp <CR>:exec("tag ".expand("<cword>"))<CR>

Ctrl+ \- Tanımı yeni bir sekmede aç
Alt+ ]- Tanımı dikey bir bölmede aç

Etiketler oluşturulduktan sonra. İşlevleri etiketlemek ve işlevlerden etiketlemek için aşağıdaki tuşları kullanabilirsiniz:

Ctrl+ Left MouseClick- tanım gidin
Ctrl+ Right MouseClicktanımından Atlama arka -


8
C -] => (kontrol tuşu) ve] tuşu C - T => (kontrol tuşu) ve T tuşu Sadece yeni başlayanlar için ctags. Yeni sekme numarası için teşekkürler
kumar

6
Benzer şekilde, pencereyi böldükten sonra, bu bölünmeyi yeni bir sekmeye değiştirmek için (Shift-t olarak da bilinir) Ctrl-w C-]yapabilirsiniz C-w T.
dash-tom-bang

1
@Will Terminalden vim kullanıyorsanız seçenek tuşunun bir alt tuşu gibi davranmasını sağlamak için terminal tercihlerini değiştirmeniz gerekir. MacVim kullanıyorsanız, bu satırı vimrc 'set macmeta' öğesine ekleyin. Macmeta için doktor var,: h macmeta.
Ocak'ta Amjith

17
g C-]çok kullanışlı. Birden çok tanım arasından seçim yapmak için hızlı bir iletişim kutusu açar.
2012'de Vincenzo Pii

3
g]de faydalıdır. İmleci etiket adının üzerine getirebilir ve g]eşleşen etiketlerin bir listesini almak için tuşuna basabilirsiniz .
zeekvfu

176

Her zaman benim .vimrc içinde giden bir satır:

set tags=./tags;/

Bu, geçerli dizinde "tags" için arama yapar ve bir tane bulunana kadar ağacı kök yönünde çalışır. IOW, kaynak ağacınızda yalnızca kök yerine herhangi bir yerde olabilirsiniz.


37
Köklere çıkmak aşırıdır.
Onun

37
Üzerinde çalıştığım kaynak ağaçlar her zaman ana dizinimde değil ... ve $ HOME'un kökten iki dizin olma eğiliminde olduğu gibi ... iki dizin araması daha yapabilirim. :)
uzi

6
Uzi ile katılıyorum. Cwd / home / me / programming / foo / bar / baz / bang / bam ise, bu sadece 8 dizin aramasıdır. Hız toleransınıza bağlı olduğunu düşünüyorum, ancak 1 dizini arama zamanı makinemdeki 8'den belirgin bir şekilde farklı değil.
Nate Murray

1
Senaryonuza bağlıdır, makinelerimden birinde gotgenes önerisi kullanmam gerekiyor çünkü evde / evde kabaca 8.000 dizin var ve bu biraz halsiz.
jkerian

1
Benzer bir şey var mı cscope?
szx

45

C geliştirme için bir başka yararlı eklenti cscope Ctags'ın tanımlara atlamanıza izin verdiği gibi , Cscope çağrı işlevlerine atlar .

~ / Bin / dizininizde cscope varsa, .vimrc'nize aşağıdakileri ekleyin ve arama işlevine gitmek için g ^] kullanın (bkz: 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

Neredeyse unutuyordum ... Tıpkı ctags gibi - veritabanını oluşturmanız (ve periyodik olarak güncellemeniz) gerekiyor. Aşağıdaki komut dosyasını kullanıyorum

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

Burada 'select_files', C ve başlık dosyalarının listesini Makefile'den ayıklayan başka bir komut dosyasıdır. Bu şekilde yalnızca proje tarafından kullanılan dosyaları dizine eklerim.


Cscope'un ctags'e göre avantajı nedir? Birbirlerine iltifat ediyorlar mı?
Whaledawg

4
Birbirlerini tamamlarlar. Ctags bir sembolün veya fonksiyonun tanımını bulur. Cscope işlevi çağıran tüm yerleri bulabilir. ikisini de kullanmak büyük kaynak ağaçlarda gezinmeyi çok kolaylaştırır.
nimrodm

1
Ancak, AFAIK cscope'un sınırlı bir C ++ kavrayışı vardır.
Luc Hermitte

Sınırlı ve çok iyi değil. Ama ne yaptığı için (USAGES'a atlamak), daha iyi bir alternatif yok. Temel sorunu, işlev çağrılarına (f) atlamak istediğinizde, bunun yerine bu sembolün kullanıldığı her yere atlamanız ve sonuçları zihinsel olarak filtrelemenizdir ...
Greg Rogers

2
@Whaledawg Evet, CTRL + 'ya bastığımda ses kartım çıktıda "clap.wav" gönderiyor :)
Patrizio Rullo

27

Ctags aramanıza dizinler ekleyebilirsiniz. Örneğin, Qt4 için oluşturulan bir ctags dizini var ve bu benim .vimrc var:

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


16

Ben etiket yığını pop / itmek için ALT-sol ve ALT-sağ kullanın.

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

Eğer kullanırsanız hjklhareket için size eşleyebilirsiniz <M-h>ve <M-l>onun yerine.


ctrl -] ve ctrl-t ile aynı değil - Sanırım, öneriniz biraz daha temiz.

@Sasha, Pardon? Ne dediğini bilmiyorum. = X Not etmek gerekirse, bu aynı zamanda çalışır: yardım.
strager

2
Bunun varsayılandan daha sezgisel ve daha temiz olduğunu düşünüyorum.
Ayman

1
@Ayman Ancak, ok tuşlarına karşı hjkl kullanmak gibi elleri de yuvadan uzaklaştırmama ilkesini de ihlal ediyor.
TankorSmash

@TankorSmash, hangi prensip?
strager

10

Aynı ismin birkaç tanımı

<C-w>g<C-]>tanımı bir bölmede açın, ancak :tjumptanımına giden veya birkaç tanım varsa, seçim yapabileceğiniz tanımların bir listesini sunar.


2
İlk komuta benzer şekilde vim, :ptagtanımı bir önizleme penceresinde açan bir komuta sahiptir.
idbrii

1
Önizleme penceresi güzeldir, çünkü imleci önizleme penceresine taşımak zorunda kalmadan başka bir pencereden: pc ile kapatabilirsiniz.
Heikki Naski

Ayrıca :h CursorHold-example, yapılandırılabilir bir zaman aşımından sonra önizleme penceresinde imlecin altındaki öğenin etiketini görüntüleyen düzgün bir autocmd hilesi de vardır .
dash-tom-bang

+1 for: tjump Şimdi bağladım: tjump <Cr><Cw> <CR> <C -]> imho'dan daha iyi çalışıyor imho Bu davranışı aşağıdakilerle birleştirmek isterim: ptag
Andreas Fliesberg

:helpbazen harika ... bkz. :help CTRL-W_g}ve:ptjump
Andreas Fliesberg

8

En çok kullandığım komut, imlecin altındaki işlevin tanımına atlayan C-]. Daha fazla çağrı izlemek için daha sık kullanabilirsiniz. Bundan sonra Co sizi bir seviye geri getirecek, Ci daha derine inecek.


16
Ct, C- yığındaki bir seviye geri giderken, Co bir hareketten sonra önceki bir imleç konumuna geri döner. Eğer bir fonksiyona C-] sonra sayfa aşağıya giderseniz, Co fonksiyonun başlangıcına, daha sonra çağrıya geri dönerken Ct hemen geri döner.
Greg Hewgill

6

Taglist eklentisinin bir zorunluluk olduğunu buldum . Bildiği tüm etiketleri (açtığınız dosyalar) ayrı bir pencerede listeler ve daha büyük dosyalarda gezinmeyi çok kolaylaştırır.

Çoğunlukla Python geliştirme için kullanıyorum, ancak sadece C / C ++ için daha iyi olabilir.




4

Gvim başladığında herhangi bir noktadan bir etiket dosyası için ağacı arayan .gvimrc dosyama aşağıdakileri koydum:

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

Daha sonra periyodik olarak aşağıdaki gibi bir komut dosyasıyla kaynak ağacımın üstündeki bir etiketler dosyasını yeniden oluştururum

#!/bin/bash

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

7
Yukarı doğru aramayı yeniden icat ettiniz. Bkz: h dosya arama. Ayrıca bkz. Stackoverflow.com/questions/563616/vimctags-tips-and-tricks/…
gotgenes

2

Ben vos macos kullanın ve orijinal ctags iyi çalışmıyor, bu yüzden en yeni indirmek ve make make install bunu yapılandırmak. / Usr / local / bin / ctags içine ctgas yükledim (orijinal olanı saklamak için)

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

1

Yukarıdaki SetTags () arama işlevini (eşdeğer ile değiştirilmesi gerekir set tags+=./tags;/) cscope için çalışacak şekilde uyarladım . Çalışıyor gibi görünüyor!

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

3
Gotgenes'in dediği gibi, yukarı doğru aramayı yeniden icat ettiniz. Bkz: h dosya arama. Alakalı bir örnek için bu eklentiye bakın .
idbrii

1

Yukarıdaki SetCscope () işlevinde başka bir yineleme. Bu, "cscope.out" ifadesinin bulunduğu yerde bulunmadan eşleşmeleri almak için cscope ön yolunu ayarlar:

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

3
Gotgenes'in dediği gibi, yukarı doğru aramayı yeniden icat ettiniz. Bkz: h dosya arama. Alakalı bir örnek için bu eklentiye bakın .
idbrii
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.