Como trabalhar efetivamente com vários arquivos no Vim?
Pergunta
Comecei a usar o Vim para desenvolver scripts Perl e estou começando a achar que ele é muito poderoso.
Uma coisa que gosto é poder abrir vários arquivos ao mesmo tempo, por exemplo. vi main.pl maintenance.pl
e então pule entre eles com:
:n
:prev
e veja quais arquivos estão abertos com
:args
E para adicionar um arquivo, posso dizer:
:n test.pl
que espero que seja ADICIONADO à minha lista de arquivos, mas em vez disso apaga minha lista de arquivos atual e quando digito :args
Eu só tenho test.pl
abrir.
Então, como posso ADICIONAR e REMOVER arquivos à minha lista de argumentos?
Solução
Por que não usar guias (introduzidas no Vim 7)?Você pode alternar entre as guias com :tabn
e :tabp
, Com :tabe <filepath>
você pode adicionar uma nova guia;e com regularidade :q
ou :wq
você fecha uma guia.Se você mapear :tabn
e :tabp
para o seu F7/F8 teclas você pode alternar facilmente entre os arquivos.
Se não houver muitos arquivos ou você não tiver o Vim 7, você também pode dividir sua tela em vários arquivos: :sp <filepath>
.Então você pode alternar entre telas divididas com Ctrl+C e, em seguida, uma tecla de seta na direção que você deseja mover (ou em vez de teclas de seta, c para o próximo e C para tela dividida anterior)
Outras dicas
Listagem
Para ver uma lista dos buffers atuais, eu uso:
:ls
Abertura
Para abrir um novo arquivo, eu uso
:e ../myFile.pl
com preenchimento de guia aprimorado (colocar set wildmenu
na tua .vimrc
).
Observação:você também pode usar :find
que irá procurar um conjunto de caminhos para você, mas primeiro você precisa personalizar esses caminhos.
Troca
Para alternar entre todos os arquivos abertos, eu uso
:b myfile
com preenchimento de guia aprimorado (ainda set wildmenu
).
Observação: :b#
escolhe o último arquivo visitado, para que você possa usá-lo para alternar rapidamente entre dois arquivos.
Usando janelas
Ctrl-W s
e Ctrl-W v
para dividir a janela atual horizontalmente e verticalmente.Você também pode usar :split
e :vertical split
(:sp
e :vs
)
Ctrl-W w
para alternar entre janelas abertas e Ctrl-W h
(ou j
ou k
ou l
) para navegar pelas janelas abertas.
Ctrl-W c
para fechar a janela atual e Ctrl-W o
para fechar todas as janelas, exceto a atual.
Iniciando o vim com um -o
ou -O
flag abre cada arquivo em sua própria divisão.
Com tudo isso, não preciso de guias no Vim, e meus dedos encontram meus buffers, não meus olhos.
Observação:se você quiser que todos os arquivos vão para a mesma instância do Vim, inicie o Vim com o --remote-silent
opção.
:ls
para lista de buffers abertos
:bp
buffer anterior:bn
próximo buffer:bn
(n
um número) mova para o enésimo buffer:b <filename-part>
com tecla tab fornecendo preenchimento automático (incrível!!)
Em algumas versões do vim, bn
e bp
são na verdade bnext
e bprevious
respectivamente.O preenchimento automático da guia é útil neste caso.
Ou quando você estiver no modo normal, use ^
para mudar para o último arquivo em que você estava trabalhando.
Além disso, você pode salvar sessões do vim
:mksession! ~/today.ses
O comando acima salva os buffers e configurações do arquivo aberto atual em ~/today.ses
.Você pode carregar essa sessão usando
vim -S ~/today.ses
Não há problemas em lembrar onde você parou ontem.;)
Para adicionar ao args
lista:
:argadd
Para excluir do args
lista:
:argdelete
No seu exemplo, você poderia usar :argedit
test.pl para adicionar test.pl ao args
list e edite o arquivo em uma única etapa.
:help args
oferece muito mais detalhes e uso avançado
Eu uso comandos de buffer - :bn
(próximo buffer), :bp
(buffer anterior) :buffers
(listar buffers abertos) :b<n>
(buffer aberto n) :bd
(excluir buffer). :e <filename>
apenas abrirá em um novo buffer.
Acho que você pode estar usando o comando errado para ver a lista de arquivos que abriu.
Experimente fazer um :ls
para ver a lista de arquivos que você abriu e você verá:
1 %a "./checkin.pl" line 1
2 # "./grabakamailogs.pl" line 1
3 "./grabwmlogs.pl" line 0
etc.
Você pode então percorrer os arquivos referindo-se a eles pelos números listados, por exemplo.:3b
ou você pode dividir sua tela digitando o número, mas usando sb em vez de apenas b.
Como aparte, % refere-se ao arquivo atualmente visível e # refere-se ao arquivo alternativo.
Você pode alternar facilmente entre esses dois arquivos pressionando Ctrl Mudança 6
Editar:como :ls
você pode usar :reg
para ver o conteúdo atual dos seus registros, incluindo os registros 0-9 que contêm o que você excluiu.Isto é especialmente útil se você quiser reutilizar algum texto que você excluiu anteriormente.
O Vim (mas não o Vi original!) Possui guias que considero (em muitos contextos) superiores aos buffers.Você pode dizer :tabe [filename]
para abrir um arquivo em uma nova guia.A alternância entre as abas é feita clicando na aba ou pelas combinações de teclas [n]gt
e gT
.Gráfico O Vim ainda possui guias gráficas.
Muitas respostas aqui!O que eu uso sem reinventar a roda - os plugins mais famosos (que não vão morrer tão cedo e são usados por muita gente) para serem ultra rápidos e geeks.
- ctrlpvim/ctrlp.vim - para encontrar o arquivo por nome, pesquise difusa por sua localização ou apenas por seu nome
- jlanzarotta/bufexplorer - para navegar pelos buffers abertos (quando você não se lembra de quantos arquivos abriu e modificou recentemente e não se lembra onde eles estão, provavelmente porque os procurou com Ag)
- rking/ag.vim para pesquisar os arquivos em relação ao gitignore
- scrooloose/nerdtree para ver a estrutura de diretórios, pesquisar, adicionar/excluir/modificar arquivos
ATUALIZAR :Recentemente estou usando dyng/ctrlsf.vim para pesquisar com visualização contextual (como pesquisa Sublime) e mudei o mecanismo de AG para ripgrep.O desempenho é excelente.
Coisas como :e
e :badd
aceitará apenas UM argumento, portanto o seguinte falhará
:e foo.txt bar.txt
:e /foo/bar/*.txt
:badd /foo/bar/*
Se você deseja adicionar vários arquivos do vim, use arga[dd]
:arga foo.txt bar.txt
:arga /foo/bar/*.txt
:argadd /foo/bar/*
Ao usar vários arquivos no vim, eu uso principalmente estes comandos (com cerca de 350 arquivos abertos):
:b <partial filename><tab>
(pular para um buffer):bw
(limpeza de buffer, remova um buffer):e <file path>
(edite, abra um novo buffer>pltags
- ativar o salto para definições de sub-rotina/método
Algumas respostas neste tópico sugerem o uso de guias e outras sugerem o uso de buffer para realizar a mesma coisa.Guias e buffers são diferentes.Eu sugiro fortemente que você leia este artigo Loucura do Vim Tab - Buffers vs Tabs
Aqui está um bom resumo que tirei do artigo:
Resumo:
- Um buffer é o texto na memória de um arquivo.
- Uma janela é uma janela de visualização em um buffer.
- Uma página de guia é uma coleção de janelas.
Você pode querer usar Marcas globais do Vim.
Dessa forma, você pode alternar rapidamente entre os arquivos e até mesmo para o local marcado no arquivo.Além disso, os comandos principais são curtos: 'C
me leva ao código com o qual estou trabalhando, 'T
me leva ao teste de unidade com o qual estou trabalhando.
Quando você muda de lugar, redefinir as marcas também é rápido: mC
marca o novo local de código, mT
marca o novo local de teste.
Eu uso o mesmo arquivo .vimrc para GVim e a linha de comando vim.Costumo usar guias no GVim e buffers na linha de comando vim, então tenho meu .vimrc configurado para facilitar o trabalho com ambos:
" Movement between tabs OR buffers
nnoremap L :call MyNext()<CR>
nnoremap H :call MyPrev()<CR>
" MyNext() and MyPrev(): Movement between tabs OR buffers
function! MyNext()
if exists( '*tabpagenr' ) && tabpagenr('$') != 1
" Tab support && tabs open
normal gt
else
" No tab support, or no tabs open
execute ":bnext"
endif
endfunction
function! MyPrev()
if exists( '*tabpagenr' ) && tabpagenr('$') != '1'
" Tab support && tabs open
normal gT
else
" No tab support, or no tabs open
execute ":bprev"
endif
endfunction
Isso supera os mapeamentos existentes para H e L, mas torna a alternância entre arquivos extremamente rápida e fácil.Basta clicar em “H” para o próximo e “L” para o anterior;esteja usando guias ou buffers, você obterá os resultados pretendidos.
Se você vai usar vários buffers, acho que o mais importante é definir oculto para que ele permita trocar de buffers, mesmo que tenha alterações não salvas naquele que está saindo.
Adicionando outra resposta, pois isso não é coberto por nenhuma resposta
Para alterar todos os buffers para tab
visualizar.
:tab sball
abrirá todos os buffers para visualização de guias.Então podemos usar qualquer comando relacionado à guia
gt or :tabn " go to next tab
gT or :tabp or :tabN " go to previous tab
detalhes em :help tab-page-commands
.
Podemos instruir o vim a abrir, como visualização de guias, vários arquivos vim -p file1 file2
.
alias vim='vim -p'
será útil.
A mesma coisa também pode ser alcançada seguindo o comando automático em ~/.vimrc
au VimEnter * if !&diff | tab all | tabfirst | endif
De qualquer forma, para responder à pergunta:Para adicionar à lista de argumentos: arga file
,
Para excluir da lista de argumentos: argd pattern
Mais em :help arglist
Minha maneira de trabalhar efetivamente com vários arquivos é usar o tmux.
Ele permite dividir janelas verticalmente e horizontalmente, como em:
Ele funciona dessa maneira em minhas máquinas Mac e Linux e acho que é melhor do que o mecanismo nativo de troca de painel de janela fornecido (em Macs).Acho a troca mais fácil e somente com o tmux consegui fazer com que a 'nova página no mesmo diretório atual' funcionasse no meu mac (apesar do fato de parecer haver opções para abrir novos painéis no mesmo diretório) que é uma peça surpreendentemente crítica.Um novo painel instantâneo no local atual é extremamente útil.Um método que cria novos painéis com as mesmas combinações de teclas para ambos os sistemas operacionais é fundamental para mim e um bônus para todos, para compatibilidade pessoal futura.Além de vários painéis tmux, também tentei usar várias guias, por exemplo. e várias novas janelas, por ex. e, finalmente, descobri que vários painéis tmux são os mais úteis para mim.Sou muito “visual” e gosto de manter meus vários contextos bem na minha frente, conectados entre si como painéis.
tmux também suporta painéis horizontais e verticais que os mais antigos screen
não (embora o iterm2 do mac pareça suportá-lo, mas, novamente, a configuração do diretório atual não funcionou para mim).tmux 1.8
Se usando apenas comandos internos do vim, o melhor que já vi para alternar entre vários buffers é este:
nnoremap <Leader>f :set nomore<Bar>:ls<Bar>:set more<CR>:b<Space>
Combina perfeitamente ambos :ls
e :b
comandos - listando todos os buffers abertos e aguardando que você insira o comando para alternar o buffer.
Dado o mapeamento acima no vimrc, depois de digitar <Leader>f
,
- Todos os buffers abertos são exibidos
- Você pode:
- Tipo
23
para ir para o buffer 23, - Tipo
#
para ir para o buffer alternativo/MRU, - Digite o nome parcial do arquivo e digite
<Tab>
, ou<C-i>
para preenchimento automático, - Ou apenas
<CR>
ou<Esc>
para permanecer no buffer atual
- Tipo
Um instantâneo da saída do mapeamento de teclas acima é:
:set nomore|:ls|:set more
1 h "script.py" line 1
2 #h + "file1.txt" line 6 -- '#' for alternative buffer
3 %a "README.md" line 17 -- '%' for current buffer
4 "file3.txt" line 0 -- line 0 for hasn't switched to
5 + "/etc/passwd" line 42 -- '+' for modified
:b '<Cursor> here'
No instantâneo acima:
- Segunda coluna:
%a
para corrente,h
para escondido,#
para anterior, vazio para não foi alterado. - Terceira coluna:
+
para modificado.
Além disso, sugiro fortemente set hidden
.Ver :help 'hidden'
.
Eu uso o seguinte, que oferece muitos recursos que você esperaria ter em outros editores, como Sublime Text/Textmate
- Use buffers e não 'páginas de guia'.Buffers têm o mesmo conceito de guias em quase todos os outros editores.
- Se você quiser a mesma aparência de guias, você pode usar o companhia aérea vim plugin com a seguinte configuração em seu
.vimrc
:let g:airline#extensions#tabline#enabled = 1
.Isto mostra automaticamente todos os buffers como cabeçalhos de abas quando você não tem páginas de abas abertas - Use o de Tim Pope vim-ileso que dá [b e ]b para passar para os buffers anteriores/seguintes, respectivamente (além de uma série de outras vantagens)
- Ter
set wildmenu
na tua.vimrc
então quando você digita:b <file part>
+ Aba para um buffer você obterá uma lista de buffers possíveis que você pode usar as setas para esquerda/direita para percorrer - Use o de Tim Pope obsessão pelo vim plugin para armazenar sessões que funcionam bem com companhias aéreas (eu tinha muita dor com sessões e plugins)
- Use o de Tim Pope vim-vinagre plugar.Isso funciona com o nativo
:Explore
mas torna muito mais fácil trabalhar.Você acabou de digitar-
para abrir o explorer, que é a mesma chave para subir um diretório no explorer.Torna a navegação mais rápida (no entanto, com o fzf eu raramente uso isso) - fzf (que pode ser instalado como um plugin vim) também é um localizador fuzzy realmente poderoso que você pode usar para pesquisar arquivos (e buffers também).fzf também joga muito bem com fd (uma versão mais rápida do find)
- Usar Ripgrep com vim-ripgrep para pesquisar em sua base de código e então você pode usar
:cdo
nos resultados para pesquisar e substituir
Eu uso muito a linha de comando e o git, então tenho esse alias no meu bashrc:
alias gvim="gvim --servername \$(git rev-parse --show-toplevel || echo 'default') --remote-tab"
Isso abrirá cada novo arquivo em uma nova aba em uma janela existente e criará uma janela para cada repositório git.Portanto, se você abrir dois arquivos do repositório A e 3 arquivos do repositório B, você terá duas janelas, uma para o repositório A com duas guias e outra para o repositório B com três guias.
Se o arquivo que você está abrindo não estiver contido em um repositório git, ele irá para uma janela padrão.
Para pular entre as guias, uso estes mapeamentos:
nmap <C-p> :tabprevious<CR>
nmap <C-n> :tabnext<CR>
Para abrir vários arquivos de uma vez, você deve combinar isso com uma das outras soluções.
Eu uso vários buffers que estão ocultos em meu ~/.vimrc
arquivo.
O script explorador de mini-buffer também é bom para obter uma lista compacta de seus buffers.Então :b1
ou :b2
...para ir para o buffer apropriado ou usar o mini-buffer explorer e percorrer os buffers.
tente seguir os mapas para facilitar a edição de vários arquivos
"janelas divididas
nmap <leader>sh :leftabove vnew<CR>
nmap <leader>sl :rightbelow vnew<CR>
nmap <leader>sk :leftabove new<CR>
nmap <leader>sj :rightbelow new<CR>
" movendo-se em torno de
nmap <C-j> <C-w>j
nmap <C-k> <C-w>k
nmap <C-l> <C-w>l
nmap <C-h> <C-w>h
Eu fiz um vídeo muito simples mostrando o fluxo de trabalho que eu uso.Basicamente eu uso o Ctrl-P Plugin Vim e mapeei a navegação do buffer para a tecla Enter.
Desta forma posso pressionar Enter no modo normal, olhar a lista de arquivos abertos (que aparece em uma pequena janela nova na parte inferior da tela), selecionar o arquivo que desejo editar e pressionar Enter novamente.Para pesquisar rapidamente vários arquivos abertos, basta digitar parte do nome do arquivo, selecionar o arquivo e pressionar Enter.
Não tenho muitos arquivos abertos no vídeo, mas torna-se extremamente útil quando você começa a ter muitos deles.
Como o plug-in classifica os buffers usando uma ordem MRU, basta pressionar Enter duas vezes e pular para o arquivo mais recente que você estava editando.
Após a instalação do plugin, a única configuração necessária é:
nmap <CR> :CtrlPBuffer<CR>
É claro que você pode mapeá-lo para uma chave diferente, mas acho que o mapeamento a ser inserido é muito útil.
Quando comecei a usar o VIM, não percebi que as guias deveriam ser usadas como layouts de janela diferentes, e o buffer serve para a edição/alternação de vários arquivos entre si.Na verdade, no início, as guias nem existiam antes da v7.0 e eu apenas abri um VIM dentro de uma guia de terminal (eu estava usando o gnome-terminal no momento) e alternei entre as guias usando alt + números, já que pensei em usar comandos como :buffers, :bn e :bp foram demais para mim.Quando o VIM 7.0 foi lançado, achei mais fácil gerenciar muitos arquivos e mudar para ele, mas recentemente percebi que os buffers devem ser sempre a melhor opção, a menos que uma coisa:você precisa configurá-lo para que funcione corretamente.
Então, tentei o vim-airline e habilitei a barra de buffer visual em forma de guia, mas o gráfico estava tendo problemas com meu iTerm2, então tentei alguns outros e parece que o MBE funciona melhor para mim.Também defini shift+h/l como atalhos, já que os originais (mover para o início/fim da página atual) não são muito úteis para mim.
map <S-h> :bprev<Return>
map <S-l> :bnext<Return>
Parece ser ainda mais fácil que gt e gT, e :e é mais fácil que :tabnew também.Acho que :bd não é tão conveniente quanto :q (o MBE está tendo alguns problemas com isso), mas acho que posso conviver com todos os arquivos no buffer.
Você pode ser um louco absoluto e apelido vim
para vim -p
adicionando em seu .bashrc
:
alias vim="vim -p"
Isso resultará na abertura de vários arquivos do shell em guias, sem a necessidade de invocar :tab ball
de dentro do vim depois.
Eu sugeriria usar o plugin
NERDtree
Aqui está o link do github com instruções.
Eu uso o vim-plug como gerenciador de plugins, mas você também pode usar o Vundle.
se você estiver no osx e quiser clicar em suas guias, use MouseTerm e SIMBL (retirado de aqui).Além disso, confira isso discussão relacionada.
A maioria das respostas neste tópico está usando comandos simples do vim, o que é bom, mas pensei em fornecer uma resposta extensa usando uma combinação de plug-ins e funções que considero particularmente úteis (pelo menos algumas dessas dicas vieram de Dicas de navegação de arquivos de Gary Bernhardt):
Para alternar entre os dois últimos arquivos basta pressionar
<leader>
duas vezes.Eu recomendo atribuir<leader>
para a barra de espaço:nnoremap <leader><leader> <c-^>
Para movimentar-se rapidamente em um projeto, a resposta é uma solução de correspondência difusa, como CtrlP.eu ligo isso
<leader>a
para acesso rápido.Caso eu queira ver uma representação visual dos buffers atualmente abertos que uso o plugin BufExplorer.Simples mas efetivo.
Se eu quiser navegar pelo sistema de arquivos, usaria a linha de comando ou um utilitário externo (Quicklsilver, Afred etc.), mas para observar a estrutura atual do projeto Árvore NERD é um clássico.Não use isso no lugar de
2
como seu principal método de localização de arquivos.Isso realmente vai te atrasar.Eu uso a ligação<leader>ff
.
Isso deve ser suficiente para localizar e abrir arquivos.A partir daí, é claro, use divisões horizontais e verticais.No que diz respeito às divisões, considero estas funções particularmente úteis:
Abra novas divisões em áreas menores quando não houver espaço suficiente e expanda-as na navegação.Referir aqui para comentários sobre o que eles fazem exatamente:
set winwidth=84 set winheight=5 set winminheight=5 set winheight=999 nnoremap <C-w>v :111vs<CR> nnoremap <C-w>s :rightbelow split<CR> set splitright
Passe de divisão em divisão facilmente:
nnoremap <C-J> <C-W><C-J> nnoremap <C-K> <C-W><C-K> nnoremap <C-L> <C-W><C-L> nnoremap <C-H> <C-W><C-H>