Dicas e truques do Vim and Ctags

Acabei de instalar o Ctags (para ajudar no desenvolvimento de C ++) com o meu Vim (ou melhor, gVim), e gostaria de descobrir seus comandos favoritos, macros, atalhos, dicas que o acompanham …

Compartilhe seu melhor arsenal. Que outros add-ons do Vim você recomendaria para o desenvolvimento do C ++ on Vim?

EDIT Que outro add-on você usaria em conjunto com Ctags?

EDIT2 Qual versão do gVim você usa com tags? Isso faz diferença?

EDIT3 Como você aprimora sua experiência de programação para projetos grandes e pequenos?

Ctrl + ] – vai para a definição
Ctrl + T – Salta de volta da definição.
Ctrl + W Ctrl + ] – abre a definição em uma divisão horizontal

Adicione estas linhas no vimrc
map :tab split:exec("tag ".expand(""))
map :vsp :exec("tag ".expand(""))

Ctrl + \ – abre a definição em uma nova guia
Alt + ] – abre a definição em uma divisão vertical

Depois as tags são geradas. Você pode usar as seguintes teclas para marcar e marcar as funções:

Ctrl + Left MouseClick – Ir para definição
Ctrl + Right MouseClick – Saltar da definição

Uma linha que sempre vai no meu .vimrc:

 set tags=./tags;/ 

Isto irá procurar no diretório atual por “tags”, e trabalhar a tree em direção ao root até que uma seja encontrada. IOW, você pode estar em qualquer lugar na sua tree de fonts em vez de apenas na raiz.

Outro plugin útil para o desenvolvimento C é o cscope. Assim como o Ctags permite que você pule para as definições, o Cscope pula para as funções de chamada .

Se você tiver cscope em seu diretório ~ / bin /, adicione o seguinte ao seu .vimrc e use g ^] para ir para a function de chamada (veja: 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 

Quase esqueci … Assim como ctags – você tem que gerar (e atualizar periodicamente) o database. Eu uso o seguinte script

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

Onde ‘select_files’ é outro script que extrai a lista de arquivos C e header do Makefile. Dessa forma, indexo apenas os arquivos realmente usados ​​pelo projeto.

Você pode adicionar diretórios à sua pesquisa de ctags. Por exemplo, eu tenho um índice de ctags construído para o Qt4 e tenho isso no meu .vimrc:

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

Todas as opções acima e …

code_complete: parâmetro de function completo, trechos de código e muito mais.

taglist.vim: Navegador de código fonte (suporta C / C ++, java, perl, python, tcl, sql, php, etc)

Eu uso ALT-left e ALT-right para pop / push de / para a pilha de tags.

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

Se você usar o hjkl para o movimento, você pode mapear e .

Várias definições do mesmo nome

g abre a definição em uma divisão, mas também :tjump que vai para a definição ou, se houver várias definições, apresenta uma lista de definições para escolher.

O comando que estou usando mais é C-], que salta para a definição da function sob o cursor. Você pode usá-lo com mais freqüência para seguir mais chamadas. Depois disso, Co vai trazer você de volta um nível, Ci vai mais fundo novamente.

Eu encontrei o plug-in taglist um must-have. Ele lista todas as tags que ele conhece (arquivos que você abriu) em uma janela separada e facilita muito a navegação de arquivos maiores.

Eu uso principalmente para desenvolvimento em Python, mas só pode ser melhor para C / C ++.

Eu encapsulei a manipulação de tags em um plugin experimental meu.

Em relação ao desenvolvimento do C ++ no vim, eu já respondi: eu uso meu próprio pacote e alguns outros plugins.

Eu tenho adaptado meus plugins vim por dois anos para suportar projetos c ++ grandes o suficiente. Você pode dar uma olhada neles.

Eles usam ctags e cscsope.

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

Eu coloquei o seguinte no meu arquivo .gvimrc, que pesquisa a tree de qualquer ponto para um arquivo de tags quando o gvim é iniciado:

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

Eu periodicamente regenho um arquivo de tags no topo da minha tree de código com um script que se parece com:

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

Eu uso o vim em macos, e as ctags originais não funcionam bem, então eu faço o download do mais novo e configure o make make it. Eu instalo ctgas em / usr / local / bin / ctags (para manter o original)

 "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   

Eu adaptei a function de pesquisa SetTags () acima (que deve ser substituída pelas set tags+=./tags;/ equivalentes set tags+=./tags;/ ) para trabalhar no cscope. Parece funcionar!

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

Outra iteração na function SetCscope () acima. Isso define o pré-caminho do cscope para obter correspondências sem estar na pasta onde “cscope.out” é:

 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