Usando as abas do Vim como buffers

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

Eu gostaria que cada arquivo distinto que eu tenha aberto sempre esteja em sua própria guia. No entanto, existem algumas coisas que atrapalham isso. Como faço para corrigir isso:

  1. Quando comandos como gf e ^] 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 abrir o arquivo em uma nova guia ou alternar para a guia existente com o arquivo se ele já estiver aberto?

  2. Ao trocar buffers, posso usar :b e ele completará os nomes dos arquivos nos buffers existentes. pode até ser o meio de um nome de arquivo em vez do começo. Existe um equivalente para mudar de abas?

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 tab == 1 buffer é um exercício de futilidade. O Vim não sabe ou se importa e não o respeitará em todos os comandos – em particular, qualquer coisa que use o buffer de correção rápida ( :make :helpgrep :grep e :helpgrep são os que vêm à mente) irá alegremente ignorar as abas e não há nada que você possa fazer para parar isso.

Em vez de:

  • :set hidden
    Se você ainda não tiver esse conjunto, faça isso. Faz o vim funcionar como qualquer outro editor de arquivos múltiplos no planeta. Você pode ter editado buffers que não são visíveis em uma janela em algum lugar.
  • Use :bn :bp :b # ctrl-6 :b name e ctrl-6 para alternar entre buffers. Eu gosto de ctrl-6 eu (sozinho ele muda para o buffer usado anteriormente, ou #ctrl-6 muda para o número de buffer # ).
  • Use :ls para listar buffers, ou um plugin como o MiniBufExpl ou o BufExplorer .

Pouco tarde para a festa aqui, mas surpreso eu não vi o seguinte nesta lista:

:tab sball – abre uma nova aba para cada buffer aberto.

:help switchbuf – isso controla o comportamento de troca de buffer, tente :set switchbuf=usetab,newtab . Isso deve significar alternar para a guia existente se o buffer estiver aberto ou criar um novo caso contrário.

Vim :help window explica a confusão “tabs vs buffers” muito bem.

Um buffer é o texto na memory de um arquivo.
Uma janela é uma viewport 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, o notepad ++), isso é feito com guias, portanto, a guia de nome no vim talvez induza em erro.

As janelas são para dividir o espaço de trabalho e exibir vários arquivos (buffers) juntos em uma canvas. Em outros editores, isso pode ser feito abrindo várias janelas da GUI e reorganizando-as na área de trabalho.

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

Como vim help: tab-page explica que uma página de guia pode ser usada, quando se deseja editar temporariamente um arquivo, mas não deseja alterar nada no layout atual de janelas e buffers. Nesse caso, outra página de guia pode ser usada apenas para editar esse arquivo em particular.

É claro que você precisa lembrar que exibir o mesmo arquivo em muitas páginas de guias ou janelas resultaria na exibição da mesma cópia de trabalho (buffer).

Ao contrário de algumas das outras respostas aqui, eu digo que você pode usar as abas da maneira que quiser. O vim foi projetado para ser versátil e personalizável, em vez de forçá-lo a trabalhar de acordo com parâmetros pré-definidos. Todos nós sabemos como nós, programadores, amamos impor nossa “ética” a todos os demais, de modo que essa conquista é certamente uma característica primordial.

gf é o equivalente da guia do comando gf dos buffers. e alternarão entre as guias. (No Byobu, esses dois comandos nunca funcionam para mim, mas funcionam fora do Byobu / tmux. As alternativas são gt e gT .) T moverá a janela atual para uma nova página da guia.

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

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

Para a documentação nas guias, digite :help tab-page no modo normal. (Depois de fazer isso, você pode praticar movendo uma janela para uma guia usando T ) Há uma longa lista de comandos. Alguns dos comandos da janela têm a ver com as guias, portanto, talvez você queira examinar essa documentação também por meio de :help windows .

Adição: 2013-12-19

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 de análise da opção de linha de comando normal. Alternativamente, você pode adicionar um alias bash ao mapeamento do vim para vim -p .

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

Confira o plugin chamado Mini Buffer Explorer , uma vez instalado e configurado, você será capaz de trabalhar com buffers virtaully da mesma forma que as guias sem perder nenhuma funcionalidade.

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

Eu li todas essas respostas e ainda não estava claro. Se você ler através deles, as coisas começam a fazer sentido, mas eu levei horas para ir e voltar entre as perguntas.

A primeira coisa é, como outros explicaram:

Tab Pages , soam muito como guias , eles agem 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 obscurece o poder extra que você tem dentro de uma página de guia.

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

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

  1. Agrupamentos de separadores
  2. Áreas de trabalho Sublime Text (ou seja, uma lista dos arquivos abertos que você tem em um projeto)

Quando você os vê assim, percebe o poder deles que pode agrupar facilmente conjuntos de arquivos (buffers) juntos, por exemplo, seus arquivos CSS, seus arquivos HTML e seus arquivos JS em páginas de guias diferentes. O que é realmente muito legal.

Outras descrições que acho confusas

Janela de exibição

Isso não faz sentido para mim. Uma janela de visualização que, embora tenha um termo de dictionary definido , ouvi apenas referir-se às janelas do Vim no :help window doc :help window . Viewport não é um termo que eu já ouvi no que diz respeito a editores como o Sublime Text, o Visual Studio, o Atom, o Notepad ++. Na verdade, eu nunca tinha ouvido falar sobre isso para o Vim até que comecei a usar as abas.

Se você visualizar páginas de guia como várias áreas de trabalho, referir-se a uma área de trabalho como uma única janela parecerá estranho.

Espaços de trabalho

Isso possivelmente faz mais sentido, a definição do dictionary é:

Um recurso de armazenamento de memory para uso temporário.

Então é como um lugar onde você armazena um grupo de buffers.

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

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

No entanto, pensando mais sobre isso, isso realmente concorda. Se você considerar uma guia Vim como um projeto Sublime Text, seria estranho ter apenas um arquivo aberto em cada projeto e continuar alternando entre os projetos. Portanto, usar uma página de guia para abrir apenas um arquivo é ímpar.

Coleção de janelas

A :help window refere-se a páginas de tabulação dessa maneira. Além disso, várias outras respostas usam o mesmo conceito. No entanto, até você ter a cabeça em volta do que é uma janela vim, então isso não é muito útil, como construir um castelo na areia.

Como eu mencionei acima, uma janela vim é a mesma que uma janela de visualização e uma tranquilidade excelente explicada 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 mais facilmente dois bits do mesmo arquivo. A documentação do Vim refere-se a isso como uma janela de visualizaçã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 de ajuda ou pressionando a tecla F1. Quando você insere a ajuda, o Vim divide a viewport e abre a documentação de ajuda na viewport superior, deixando o documento aberto na viewport inferior.

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

Olhando para: guias de ajuda, não parece que vim quer trabalhar do jeito que você faz …

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

É uma boa ideia, no entanto.

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

  • Você pode mapear comandos que normalmente manipulam buffers para manipular guias, como fiz com gf no meu .vimrc:

     map gf :tabe  

    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 próximas e anteriores guias, respectivamente. Você também pode usar Ngt, onde N é o número da guia. Uma coisa 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).

Eu uso buffers como abas, usando o plugin BufExplorer e algumas macros:

 " CTRL+b opens the buffer list map  :BufExplorer " gz in command mode closes the current buffer map gz :bdelete " g[bB] in command mode switch to the next/prev. buffer map gb :bnext map gB :bprev 

Com BufExplorer você não tem uma barra de abas no topo, mas por outro lado economiza espaço em sua canvas, mais você pode ter um número infinito de arquivos / buffers abertos e a lista de buffer é pesquisável …

Se você quiser 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 saiu há muito tempo atrás, quando as guias eram suportadas apenas no GVim, mas não na linha de comando vim. Como está operando somente com buffers, tudo se integra bem com o resto do vim.