Usando as guias do Vim como buffers

366

Eu observei a capacidade de usar guias no Vim (com :tabe, :tabnewetc.) como um substituto para minha prática atual de ter muitos arquivos abertos na mesma janela em buffers ocultos.

Gostaria que todos os arquivos distintos que eu abrisse estivessem sempre em sua própria guia. No entanto, existem algumas coisas que atrapalham isso. Como faço para corrigir estes:

  1. Quando comandos gostam gfe ^]pulam para um local em outro arquivo, o arquivo é aberto em um novo buffer na guia atual. Existe uma maneira de ter todos esses tipos de comandos para abrir o arquivo em uma nova guia ou alternar para a guia existente com o arquivo, se ele já estiver aberto?

  2. Ao alternar buffers eu posso usar :b <part of filename><tab> e ele completará os nomes dos arquivos nos buffers existentes. <part of filename>pode até ser o meio de um nome de arquivo em vez do começo. Existe um equivalente para alternar entre guias?

recuo
fonte

Respostas:

642

Para para para.

Não é assim que as guias do Vim são projetadas para serem usadas. Na verdade, eles são mal nomeados. Um nome melhor seria "viewport" ou "layout", porque é isso que é uma guia - é um layout diferente das janelas de todos os seus buffers existentes.

Tentar vencer o Vim em 1 guia == 1 buffer é um exercício de futilidade. O Vim não sabe ou cuidado e não vai respeitá-lo em todos os comandos-in particular, qualquer coisa que usa o buffer quickfix ( :make, :grep, e :helpgrepsão os que vêm à mente) vai alegremente ignorar guias e não há nada que você possa fazer para impedi aquele.

Em vez de:

  • :set hidden
    Se você ainda não possui esse conjunto, faça-o. Faz o vim funcionar como qualquer outro editor de arquivos múltiplos do planeta. Você pode ter buffers editados que não são visíveis em uma janela em algum lugar.
  • Use :bn, :bp, :b #, :b name, e ctrl-6para alternar entre buffers. Eu gosto de ctrl-6mim mesmo (sozinho, ele alterna para o buffer usado anteriormente ou #ctrl-6alterna para o número do buffer #).
  • Use :lspara listar buffers ou um plug-in como o MiniBufExpl ou o BufExplorer .
Zathrus
fonte
192
Para mim, isso é um bug, não "erro do usuário". Procurar na web por 'guias do vim' indica que quase todo mundo discorda de você ou desconhece a maneira "real" de usar as guias do vim. Além disso, se as guias são realmente visualizações de "layout", por que os títulos de guias padrão são o nome do arquivo atual? Se eu quisesse várias visualizações do mesmo arquivo, todos os títulos das minhas guias teriam o mesmo nome (não é muito útil?). Portanto, de qualquer maneira, a implementação da guia padrão no Vim é falha.
10243 cmcginty
45
O que mais você vai mostrar no título da guia? Ele mostra o nome do buffer atual (não "nome do arquivo"). Você pode alterar o que é exibido no título da guia de qualquer maneira.
aehlke
46
@ Casey: FWIW, quando soube pela primeira vez sobre as guias do Vim e tive que entender sobre elas e para que servem, pensei exatamente na definição dada por Zathrus. (Eu sou um novato Vim btw). Portanto, não, não concordo que seja um recurso tão quebrado ou não intuitivo ... menos ainda, que "sobre todo mundo" discorda (e pense que pelo menos um ou dois árbitros poderiam dar mais peso à afirmação). Funciona incrivelmente bem por ter vários layouts de tela simultâneos.
ata
17
Este comentário está errado, não sei por que foi votado ou aceito. Robince abaixo tem a resposta correta -: tab sball e: switchbuf são o que você está procurando.
Roel
38
+1 em "Pare, pare, pare". O Vim é tanto uma mentalidade quanto uma ferramenta. É importante ensinar aos novos usuários a mentalidade, para que eles possam usar a ferramenta em todo o seu potencial.
usar o seguinte
273

Um pouco atrasado para a festa aqui, mas surpreso por não ver o seguinte nesta lista:

:tab sball - isso abre uma nova guia para cada buffer aberto.

:help switchbuf- isso controla o comportamento de comutação de buffer, tente :set switchbuf=usetab,newtab. Isso deve significar alternar para a guia existente se o buffer estiver aberto ou criar um novo, se não estiver.

robince
fonte
4
+1 para switchbuf- set switchbuf=useopené ótimo para evitar o comportamento irritante de :make, :vimgrepe comandos semelhantes que muda os buffers no layout da janela, mesmo quando o buffer já foi exibido.
MMontu
3
por que não me cabe? depois de definido :se switchbuf=usetab,newtab, quando usado bnpara alternar o buffer, ele ainda abre o arquivo de buffer na guia atual em vez de alternar para a guia existente? Há algo de errado?
Zhiyelee
173

Vim :help windowexplica muito bem a confusão "tabs vs buffers".

Um buffer é o texto na memória de um arquivo.
Uma janela é uma janela de exibição em um buffer.
Uma ficha de registro é uma coleção de janelas.

A abertura de vários arquivos é obtida no vim com buffers . Em outros editores (por exemplo, bloco de notas ++), isso é feito com guias, portanto a guia de nome no vim pode ser enganosa.

O Windows tem o objetivo de dividir a área de trabalho e exibir vários arquivos (buffers) juntos em uma tela. Em outros editores, isso pode ser conseguido abrindo várias janelas da GUI e reorganizando-as na área de trabalho.

Finalmente, nessa analogia, as páginas da guia vim corresponderiam a vários desktops, ou seja, diferentes rearranjos de janelas.

Como vim help: tab-pageexplica uma página da guia pode ser usado, quando se quer editar temporariamente um ficheiro, mas não quer mudar nada no layout atual de janelas e buffers. Nesse caso, outra ficha de registro pode ser usada apenas com a finalidade de editar esse arquivo específico.

Obviamente, você deve se lembrar que exibir o mesmo arquivo em muitas guias ou janelas resultaria na exibição da mesma cópia de trabalho (buffer).

enfeitar
fonte
11
Essa é realmente uma resposta incrível, mas foram necessárias algumas leituras para fazer sentido. buffers = abas, janelas = GUI do Windows, páginas de guia = desktops fazem melhor sentido tão longe que eu encontrei para alguém que não está familiarizado com os conceitos
icc97
4
Costumo pensar neles olhando através de uma janela para uma sala - buffer= objeto , window= painel e tab= janela . Eu posso me mover pela sala e olhar de diferentes janelas ( tabs). Janelas diferentes podem ter diferentes números, disposição e tamanho dos painéis . O mesmo objeto pode ser visualizado simultaneamente de painéis diferentes em janelas diferentes .
go2null 25/09
Se você estiver familiarizado com os paradigmas dos Espaços de Trabalho Linux e Windows, verá a herança do vimuso. No começo havia apenas uma janela . Os gerenciadores de janelas permitiram dividir as janelas em painéis (WM lado a lado) ou em painéis sobrepostos (WM flutuante), mas eles ainda se referiam a cada painel como uma janela. Agora adicione o conceito de uma área de trabalho em que o painel possa ser mostrado em várias áreas de trabalho. Portanto, neste paradigma, buffer= app , window= window e tab= space .
go2null 25/09
56

Ao contrário de algumas das outras respostas aqui, eu digo que você pode usar as guias da maneira que desejar. O vim foi projetado para ser versátil e personalizável, em vez de forçá-lo a trabalhar de acordo com parâmetros predefinidos. Todos sabemos como nós, programadores, adoramos impor nossa "ética" a todos os outros, portanto essa conquista é certamente uma característica principal.

<C-w>gfé o equivalente da guia do gfcomando dos buffers . <C-PageUp>e <C-PageDown>alternará entre as guias. (No Byobu, esses dois comandos nunca funcionam para mim, mas funcionam fora do Byobu / tmux. As alternativas são gte gT.) Moverão <C-w>Ta janela atual para uma nova página de guia.

Se você preferir que o vim use uma guia existente, se possível, em vez de criar uma guia duplicada, adicione :set switchbuf=usetabao seu arquivo .vimrc. Você pode adicionar newtabà lista ( :set switchbuf=usetab,newtab) para forçar os comandos do QuickFix que exibem erros de compilação para abrir em guias separadas. Eu prefiro split, em vez disso, que abre os erros de compilação em uma janela dividida.

Se você tiver o suporte ao mouse ativado :set mouse=a, poderá interagir com as guias clicando nelas. Há também um +botão por padrão que criará uma nova guia.

Para a documentação das guias, digite :help tab-pageno modo normal. (Depois de fazer isso, você pode praticar movendo uma janela para uma guia usando <C-w>T.) Há uma longa lista de comandos. Alguns dos comandos da janela têm a ver com guias, portanto, você também pode consultar essa documentação :help windows.

Adição: 19-12-2013

Para abrir vários arquivos no vim com cada arquivo em uma guia separada, use vim -p file1 file2 .... Se você é como eu e sempre se esquece de adicionar -p, você pode adicioná-lo no final, pois o vim segue as regras normais de análise da opção de linha de comando. Como alternativa, você pode adicionar um mapeamento de alias do bash vimpara vim -p.

Zenexer
fonte
3
+1, no vim -pentanto, lembre-se de que apenas até 10 guias serão exibidas por padrão. Arquivos extras são carregados nos buffers, mas não são exibidos em sua própria guia.
22414 IanB
@ IanB: como superar a configuração padrão de limitá-lo a 10 guias?
0xC0000022L
3
@ 0xC0000022L ver tabpagemaxconfiguração
IanB
14

Eu tive o mesmo problema. Eu queria que as guias funcionassem como buffers e nunca consegui consegui-las. A solução que eu finalmente decidi foi fazer com que os buffers se comportassem como guias!

Confira o plug-in chamado Mini Buffer Explorer , uma vez instalado e configurado, você poderá trabalhar com os buffers praticamente da mesma maneira que as guias, sem perder nenhuma funcionalidade.

Dominic Dos Santos
fonte
10

Esta é uma resposta para aqueles que não estão familiarizados com o Vim e são de outros editores de texto (no meu caso, Sublime Text).

Eu li todas essas respostas e ainda não estava claro. Se você lê-los o suficiente, as coisas começam a fazer sentido, mas levei horas para ir e voltar entre as perguntas.

A primeira coisa é, como outros explicaram:

Páginas de guias , parecem muito com guias , funcionam como guias e se parecem muito com guias na maioria dos outros editores de GUI, mas não são. Eu acho que é um modelo mental ruim que foi construído no Vim, que infelizmente ofusca o poder extra que você tem em uma guia.

A primeira descrição que entendi foi da resposta do @ crenate é que eles são equivalentes a vários desktops. Quando visto a esse respeito, você teria apenas alguns desktops abertos, mas muitas janelas da GUI abertas em cada um.

Eu diria que eles são semelhantes em outros editores / navegadores:

  1. Agrupamentos de guias
  2. Áreas de trabalho de texto sublime (ou seja, uma lista dos arquivos abertos que você possui em um projeto)

Quando você os vê dessa maneira, percebe o poder deles que pode agrupar facilmente conjuntos de arquivos (buffers), por exemplo, seus arquivos CSS, HTML e JS em diferentes guias. O que é realmente incrível.

Outras descrições que acho confusas

Janela de exibição

Isso não faz sentido para mim. Uma viewport que, embora tenha um termo de dicionário definido , só ouvi falar das janelas do Vim no :help windowdocumento. Viewport não é um termo que eu já ouvi sobre editores como Sublime Text, Visual Studio, Atom, Notepad ++. Na verdade, eu nunca tinha ouvido falar sobre isso no Vim até começar a tentar usar as guias.

Se você visualizar as guias como várias áreas de trabalho, a referência a uma área de trabalho como uma única janela parecerá estranha.

Áreas de trabalho

Isso possivelmente faz mais sentido, a definição do dicionário é:

Um recurso de armazenamento de memória para uso temporário.

Portanto, é como um lugar onde você armazena um grupo de buffers.

Inicialmente, não soei como o conceito de espaço de trabalho do Sublime Text, que é uma lista de todos os arquivos que você abriu no seu projeto:

o arquivo sublime-workspace, que contém dados específicos do usuário, como os arquivos abertos e as modificações em cada um.

No entanto, pensando mais sobre isso, isso realmente concorda. Se você considera uma página da guia Vim como um projeto de Texto Sublime, parece estranho ter apenas um arquivo aberto em cada projeto e continuar alternando entre projetos. Por isso, o uso de uma guia para abrir apenas um arquivo é estranho.

Coleção de janelas

O :help windowrefere-se a páginas de guia desta forma. Além disso, várias outras respostas usam o mesmo conceito. No entanto, até você entender o que é uma janela do vim, isso não ajuda muito, como construir um castelo na areia.

Como mencionei acima, uma janela vim é igual a uma viewport e silenciosamente explicada excelentemente neste artigo do linux.com :

Um recurso realmente útil no Vim é a capacidade de dividir a área visível entre um ou mais arquivos, ou apenas dividir a janela para visualizar dois bits do mesmo arquivo mais facilmente. A documentação do Vim se refere a isso como uma janela de exibição ou janela, de forma intercambiável.

Você já deve estar familiarizado com esse recurso se já usou o recurso de ajuda do Vim usando: tópico da ajuda ou pressionando a tecla F1. Ao inserir a ajuda, o Vim divide a janela de visualização e abre a documentação de ajuda na janela de exibição superior, deixando o documento aberto na janela de exibição inferior.

Acho estranho que uma página de guia seja referida como uma coleção de janelas em vez de uma coleção de buffers. Mas acho que você pode ter duas guias separadas, cada uma com várias janelas, todas apontando para o mesmo buffer, pelo menos é o que entendi até agora.

icc97
fonte
11
Finalmente, após um ano sólido de uso do Vim em tempo integral, deparei-me com um caso em que queria usar mais de uma guia. Atualmente, os buffers funcionam perfeitamente para mim, pois eu usaria guias em outros editores. Mas, com um monitor grande, eu estava comparando um monte de 3-4 buffers diferentes. Então, um colega queria que eu procurasse algum código em outro lugar da base de código. Em vez de perder meu conjunto de janelas de comparação, eu poderia apenas criar uma nova página de guia que, em seguida, me permitisse fazer uma pesquisa separada, como faria ao usar o Vim normalmente e, em seguida, eu poderia fechar a página de guia uma vez concluída e retornar ao meu conjunto inicial
icc97
4

Olhando para: abas de ajuda, não parece que o vim quer funcionar da maneira que você ...

Os buffers são compartilhados entre as guias, portanto, não parece possível bloquear um determinado buffer para aparecer apenas em uma determinada guia.

É uma boa ideia, no entanto.

Você provavelmente poderia obter o efeito desejado usando um terminal que suporta guias, como multi-gnome-terminal, e executando instâncias do vim em cada guia do terminal. Não é perfeito, embora ...

Mike G.
fonte
Tentei fazer isso, o problema com que, além de torná-lo difícil de navegar entre as abas, é que o texto arrancou não podem ser compartilhados entre abas terminais, como eles são, essencialmente, dois terminais / shells diferentes
PUK
@puk: Experimente o plugin YankRing vim. Ele salva o texto arrancado em um arquivo, para que possa ser compartilhado entre instâncias do vim.
26412 pixelastic
@Pixelastic Encontrei aqui uma solução adequada para puxar a área de transferência do sistema. Além disso, o Vim funciona melhor em uma instância. Eu parei de fazer o que eu queria e aprendi a usar o vim :-) stackoverflow.com/a/8757876/654789
puk
@puk: Obrigado, isso não me ocorreu que utilizando os meios prancheta sistema de partilha-lo através de instâncias vim bem :)
pixelastic
4
  • Você pode mapear comandos que normalmente manipulam buffers para manipular guias, como eu fiz com o gf no meu .vimrc:

    map gf :tabe <cfile><CR>
    

    Tenho certeza que você pode fazer o mesmo com [^

  • Eu não acho que o vim suporte isso para abas (ainda). Eu uso gt e gT para passar para as guias próxima e anterior, respectivamente. Você também pode usar Ngt, onde N é o número da guia. Uma irritação que tenho é que, por padrão, o número da guia não é exibido na linha da guia. Para corrigir isso, coloquei algumas funções no final do meu arquivo .vimrc (não colei aqui porque é longo e não foi formatado corretamente).

Lucas Oman
fonte
<c-w>gfabrirá o nome do arquivo sob o cursor em uma nova aba
Peter Rincker
4

Eu uso buffers como guias, usando o plug- in BufExplorer e algumas macros:

" CTRL+b opens the buffer list
map <C-b> <esc>:BufExplorer<cr>

" gz in command mode closes the current buffer
map gz :bdelete<cr>

" g[bB] in command mode switch to the next/prev. buffer
map gb :bnext<cr>
map gB :bprev<cr>

Com o BufExplorer, você não tem uma barra de guias na parte superior, mas, por outro lado, economiza espaço na tela, além de poder ter um número infinito de arquivos / buffers abertos e a lista de buffers é pesquisável ...

jkramer
fonte
2

Se você deseja que os buffers funcionem como guias, confira o plug-in tabline .

Isso usa uma única janela e adiciona uma linha na parte superior para simular as guias (apenas mostrando a lista de buffers). Isso surgiu há muito tempo, quando as guias eram suportadas apenas no GVim, mas não na linha de comando vim. Como ele está operando apenas com buffers, tudo se integra bem ao restante do vim.

thien.vuong
fonte