Como navegar em grande projeto no VIM


86

Como você gerencia grandes projetos (centenas de arquivos) usando apenas VIM?

Eu pessoalmente começo a ter problemas em qualquer projeto maior do que pequeno.

  • existe alguma maneira de 'ir para o arquivo' rapidamente, de preferência completando o nome?
  • mesmo para 'ir para definição de classe', quando está em outro arquivo

Eu meio que conheço todos os fundamentos do VIM, então não tenho problemas em usá-lo para escrever scripts ou editar rapidamente algum código-fonte. Mas fica muito confuso para mim quando tenho que navegar entre os arquivos.


Que linguagem você está usando ?
LB40 de

Eu prefiro uma solução independente de linguagem, mas preciso de suporte para C ++, PHP e Rails.
Jakub Arnold

Qual resposta você aceitou? @JakubArnold

@xetrasu que acabei usandoNERDTree
Jakub Arnold

Respostas:


33

O VIM tem excelente suporte para tags . Depois de criar um arquivo de tags para seu projeto, você pode pular para uma definição ou declaração de um método, classe, etc., incluindo pular entre arquivos, tudo dentro da mesma sessão de edição.

Tentar

:help tags

Para gerar um arquivo de tags para C / C ++, vá para o prompt do shell (presumo que seu sistema seja * nix / Cygwin) e digite

info ctags

ou

ctags --help

2
O Vim também tem suporte para cscope, que permite fazer coisas como descobrir quais funções chamam uma determinada função - consulte Recursos :help cscopepara obter informações. Há uma boa lista de recursos na introdução (em "Ele foi projetado para responder a perguntas como").
Cascabel,

1
Infelizmente, cscope tem uma compreensão muito limitada de C ++.
Luc Hermitte

28

Gosto de soluções simples, minha maneira favorita de navegar no momento é:

adicionar à ~/.vimrc.local

set path=$PWD/**

Em seguida, digite isso no editor para encontrar o arquivo em qualquer lugar no diretório de trabalho atual (pwd)

:find user_spec.rb

Você pode usar o preenchimento com tabulação nos nomes dos arquivos para encontrar várias opções também, tornando este TextMate convertido muito feliz.


1
Esta solução é muito mais simples do que: FC e plugins porque nenhum cache é necessário e ... você fez meu dia de folga! Obrigado!
Srikumar

1
O Vim não está lendo o wd como o diretório padrão. Reiniciei o shell e ainda não funciona. Também tentei vim .antes de executar o comando: /
Adam Grant

13

Eu uso uma combinação de NERDTree (barra lateral do diretório), FuzzyFinder Textmate (ir para o arquivo como CMD + T do TextMate) e Sessões (: sessões h) para me ajudar a lidar com grandes projetos.

Eu sugeriria o uso de algum plugin auxiliar de sessões. Eu mencionaria o que uso, mas ainda não estou satisfeito com isso. Apenas Google "sessões vim".

Uma coisa a se notar ao fazer o FuzzyFinder Textmate funcionar é que ele depende de uma versão antiga do plugin FuzzyFinder, especificamente v2.16. Qualquer coisa acima e você obterá erros. Mas definitivamente vale a pena. Embora não tenha complementação de nome, sua pesquisa é inteligente, portanto, se eu pesquisar por fro/time/actionsphpele, o arquivo será exibido apps/(fro)ntend/modules/(time)_tracking/actions/(actions).class.(php)(parênteses indicam o que está correspondendo). Isso torna muito fácil selecionar arquivos que são exclusivos apenas pelo nome da pasta.


2
Encontrei um novo plugin que gosto mais e é mais fácil de configurar (pelo menos no meu caso): CommandT . Muito mais rapido.
donut

6
Uma ferramenta mais recente e mais poderosa, escrita em script vim, então nenhuma dependência externa é ctrlp usado pelo projeto janus
alexandru.topliceanu

7

Bem como os ctags inestimáveis ​​e os vários comandos associados. Eu também não poderia viver sem o plugin do projeto , que permite que você tenha os arquivos de interesse associados a um projeto em um painel separado. Não me lembro quanto da minha configuração foi personalizada, mas se quiser abrir um arquivo de origem chamado Debug.c, clico em:

<F12>     " Opens the project pane
/De       " Searches for "De", which is likely to be enough to find Debug.c or possibly Debug.h
<ENTER>   " Opens the selected file and closes the project pane

Eu frequentemente faço:

:vsp      " Vertically split the window
<F12>     " Reopen project pane
#         " Search back to find previous entry with the same name (to find
            Debug.h if I was on Debug.c: my headers are in Headers/ and
            my source is in Source/, so the headers come earlier in the list
            than the source).  I use * to go the other way, obviously.
<ENTER>   " Open the header file in the other window and close the project window.

Com esta sequência relativamente curta, posso abrir qualquer arquivo e seu cabeçalho em uma divisão vertical. Visto que a janela do plugin do projeto é apenas um arquivo de texto, a conclusão é obtida usando o recurso de pesquisa do Vim.


4

A partir do Vim 7.3, o :findcomando possui preenchimento de tabulação de nomes de arquivo.

Então, se você definir a sua 'path'opção para conter o seu projeto inteiro (provavelmente usando o **wildcard para permitir subdiretórios recursivamente à procura), então você pode usar o :find, :sfind, :tabfind, etc. comandos com conclusão para chegar a qualquer arquivo no seu projeto. Isso também permite pular para arquivos diretamente com gfamigos e se o nome do arquivo estiver no seu texto, por exemplo, em uma diretiva de inclusão.

Com esse método, nenhuma ferramenta externa ou plug-in são necessários para navegar para arquivos específicos. No entanto, pode não ser tão rápido ou fácil de usar e não aborda a necessidade de pular para as definições. Para definições, eu uso ctags como outras respostas sugerem.


3

Se você estiver usando ctags como outros usuários recomendaram, certifique-se de olhar o plugin taglist .

Certifique-se de reservar um tempo para ler a documentação e aprender as atalhos de teclado. Aqui estão alguns para você começar (na janela TList):

  • o - abrir o arquivo em uma nova janela
  • t - abrir arquivo em uma nova guia
  • [[ou backspace - arquivo anterior na lista
  • ]] ou guia - próximo arquivo na lista

3

Ctags exuberantes.

Use Ctrl-] para pular para a tag sob o cursor.


2

Eu uso FindFile . Se você abrir o vim na raiz do seu projeto e executar :FC .o plugin, ele armazenará em cache todos os nomes de arquivos abaixo do seu cwd. Você pode então fazer :FFpara abrir um menu de conclusão e digitar o nome do arquivo que deseja (ou melhor, as primeiras letras).


uau, este é o plugin mais fácil de usar. Zero setup envolvido .. apenas FC .em seu diretório raiz, então :FFentre, comece a digitar o nome do arquivo que você deseja e pronto. Estou tentando descobrir como lançar em novas guias ainda ..
testador

também vale a pena notar que, se você usar isso, toda vez que iniciar o vim, você precisará refazer o :FC .para armazenar arquivos em cache naquele diretório.
testador de

Aqui está uma versão atualizada de FindFile.vim com :FTou :FindTabNew gist.github.com/1104884
tester

2

Abrindo a vimpartir da raiz de seu arquivo de origem e estendendo a pathopção para incluir todos os subdiretórios nele.
Por exemplo, set path+=/usr/include/c++/**para cabeçalhos C ++ e set path+=**para seu diretório de origem.

Isso, então, abre uma infinidade de possibilidades a seguir.

1) Abrir arquivo por nome ou partes dele

:find file_name

Você pode usar o preenchimento automático e a expansão de curinga com :findconfiabilidade. Você digita o nome, ele localizará o nome. Isso funciona independentemente do idioma. Tenho certeza de que você vai gostar.

2) Navegando para arquivos sob cliente:
se você quiser ir para um caminho de arquivo como #include "project/path/classA.h.

gf or gF  - go to file under cursor.   

Ctrl- 6- para voltar à última posição do cursor após gfougF

3) Pesquisa de API e navegação para o local da API

[iou [Ipode ser usado para pesquisar sua assinatura de função para a palavra sob o cursor sem sair do seu espaço de trabalho. [<Tab>para realmente ir para a declaração. Use Ctrl- 6para voltar ao último local.


Sem estender path, você pode começar a navegar pelos arquivos por :Excomando e navegar e abrir seu arquivo. Eu prefiro NerdTreea isso, no entanto.


1

Embora eu espere que alguém aponte uma solução melhor para que eu possa aprender algo, NERDTree tem sido bom para mim para obter arquivos específicos com completação de nome, desde que eu tenha a árvore expandida. O comando quando preciso acessar um arquivo é algo como:

, d / foo.pyo (onde foo.py é um nome de arquivo)

, d para abrir a árvore, / para entrar no modo de pesquisa, o nome (ou nome parcial, ou regex, ou qualquer outro) do arquivo, e então o para abrir.

Claro que você pode ter que apertar 'n' algumas vezes se você não digitou o suficiente do nome do arquivo ou se houver duplicatas.

Eu admito que parece meio que um hack usando o NERDTree como este, embora ele tenha chegado tão longe na minha memória muscular que eu nem penso nisso.

É claro que eu uso ctags também, mas eles só são úteis quando você tem uma função perto do cursor e precisa obter sua definição em outro arquivo ou algo assim. Muitas vezes eu digo "OK, eu preciso trabalhar no recurso x agora" e preciso navegar para outro arquivo sem nenhuma referência próxima que ctags realmente ajudem.


3
Eu olhei mais um pouco, o fuzzyfinder parece uma ótima ideia para pesquisa de projetos.
gravitação de

1

Estou usando dois plug-ins meus:

  • searchInRuntime que completa nomes de arquivos na linha de comando. É de alguma forma semelhante a fuzzyfinder e lookupfile,
  • lh-tags que é completamente experimental e não documentado. Ele oferece dois recursos: atualização automática e rápida do tagfile ao salvar o arquivo (ing?), E um seletor de tags conectado <c-w><m-down>por padrão. Você pode querer verificar o conhecido plugin de lista de tags.

Ambos requerem minha biblioteca viml lh-vim-lib.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.