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?

Foi útil?

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:

enter image description here

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. enter image description here e várias novas janelas, por ex. enter image description here 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

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

  1. Use buffers e não 'páginas de guia'.Buffers têm o mesmo conceito de guias em quase todos os outros editores.
  2. 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
  3. 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)
  4. 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
  5. 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)
  6. 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)
  7. 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)
  8. 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.

Árvore Nerd

Eu uso o vim-plug como gerenciador de plugins, mas você também pode usar o Vundle.

plug-vim

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

  1. 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-^>
    
  2. 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.

  3. Caso eu queira ver uma representação visual dos buffers atualmente abertos que uso o plugin BufExplorer.Simples mas efetivo.

  4. 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:

  1. 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
    
  2. 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>
    
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top