Como você navega em arquivos grandes de origem com o VIM?


7

Primeiro, não estou perguntando sobre desempenho. Estou procurando por algo que me ajude, mentalmente, a entrar em grandes arquivos de código fonte em C aos quais não estou acostumado. Tome por exemplo readelf.c. Este arquivo tem 20.000 linhas. Eu posso ler o código e entendê-lo, mas prefiro que não. Isso é apenas um problema na minha experiência com C. Por alguma razão, em C, o tamanho do arquivo é absurdamente grande e readelf.cnão está sozinho nisso. Existe alguma coisa que possa virtualizar um arquivo C em algo sã como um projeto estruturado - eu sei que isso é pedir muito, mas parece que, com todo o código C existente, alguém teria feito algo assim.

O terminal do meu laptop pode conter ~ 50 linhas. Quais ferramentas e plugins o vim oferece para ajudar a navegar por arquivos com mais de 10k mas menos de 100k linhas?


5
A dobragem de código pode ajudar um pouco, juntamente com as tags
D. Ben Knoble

11
você pode tentar a barra de tags . Veja a captura de tela fornecida na página. Você pode navegar pelas funções, estruturas definidas em uma barra lateral.
Liu Sha

@LiuSha é exatamente isso que estou procurando, se você quiser fazer disso uma resposta, eu aceito.
Evan Carroll

Respostas:


4

Eu acho que o que você está procurando é um plugin como a barra de tags , que pode criar uma barra lateral para exibir todas as funções, estrutura / classe, macros etc. Também permite clicar (ou pressionar Enter) na tag e, em seguida, pular para a definição.


3

Você pode ativar a dobragem de código usando a opção vim: set foldmethod=syntax Isso reduz a quantidade de código que você vê de uma vez e o torna gerenciável. Depois de ativar a dobra de código, use os comandos abaixo para abrir e fechar dobras: Os comandos zc (fechar), zo (abrir) e za (alternar) operam em um nível de dobra, no cursor. Os comandos zC, zO e zA são semelhantes, mas operam em todos os níveis de dobra (por exemplo, a linha do cursor pode estar em uma dobra aberta, que fica dentro de outra dobra aberta; digitar zC fecha todas as dobras no cursor).

O comando zr reduz a dobra ao abrir mais um nível de dobras em todo o buffer (a posição do cursor não é relevante). Use zR para abrir todas as dobras.


1

Algo que estou fazendo está usando

  • Gutentags de plug-in: usado para criar tags no projeto a partir da pasta raiz.
  • Tagbar do plug-in: usado para navegar nos arquivos.
  • Reconhecimento de plug-in: usado para pesquisar em todo o projeto.

Você pode encontrar toda a minha configuração @ aqui


1

Além de plugins baseados em ctags, como o Taglist, eu uso o cscope . Alguns plugins podem ser úteis: como cscope_macros e CCTree . Antes de usar ctags ou cscope, você precisa criar um arquivo de tags e um banco de dados cscope, veja os links acima. Embora essas ferramentas sejam bastante antigas, elas funcionam muito bem com muitas implementações modernas de C.

Também não se esqueça de marcas que você pode definir em lugares importantes, dobrando partes indesejadas, gD, *, ]]e movimentos semelhantes. Se você não quiser usar nenhum programa ou plug-in externo, poderá obter uma prévia do arquivo desta

:set foldmethod=syntax
zM

foldmethoddefine dobrar com base na sintaxe C (você pode escrevê-lo em .vimrc) e o zMcomando (no modo normal) dobra tudo para o nível máximo.

Para mais informações, veja:

:help tags
:help ctags
:help cscope
:help mark-motions
:help folding

1

O Tagbar pode ajudar a navegar por um grande número de funções em um único arquivo. Entre outros recursos, ele suporta a classificação por nome ou número de linha, o que acho muito útil.

markstambém pode ser uma grande ajuda na navegação para frente e para trás em um arquivo grande. Consulte :h marksou http://vimdoc.sourceforge.net/htmldoc/motion.html#mark para obter mais detalhes.

Se você perceber a necessidade de saltar constantemente entre vários arquivos (grandes), o Gtags poderá ajudá-lo a encontrar definições / referências em todo o projeto.

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.