Como edito um buffer existente em uma nova guia no vim?

51

Suponha que eu tenha iniciado o vim assim:

vim foo bar

Agora eu decido que quero cada um desses arquivos em sua própria guia. Existe uma maneira de fazer isso sem sair do vim e adicionar a -popção à minha linha de comando?

innaM
fonte
Muitos de vocês provavelmente estão procurando o tabe %que é mencionado na resposta de liuyang1 abaixo.
Mateusz Piotrowski
1
@MateuszPiotrowski Como mencionei neste comentário a essa resposta , :tabe %não funciona com buffers que não possuem caminho de arquivo válido. :tab sbfunciona sempre.
JoL

Respostas:

30

Quando você inicia o vim assim, não recebe um cliente do vim, o editor de texto está usando o terminal ou o prompt do cmd - os dois arquivos estão em dois buffers diferentes. Use :lspara listar os buffers:

:ls
  1 %a   "foo"                 line 6
  2      "bar"             line 0

O% a é o buffer ativo. Você pode :b2alternar para o buffer 2 ou :bnalternar para o próximo ou o :bpanterior. Prefiro (CTRL-W v) dividir as janelas verticalmente, em vez de (CTRL-W s), que se divide horizontalmente.

Se você tiver 2 arquivos carregados e nenhuma :tabnewguia (ainda), poderá, e no novo tipo de guia:b2

Se você deseja sempre ter buffers carregados em suas próprias guias, consulte este artigo .

DaveParillo
fonte
Sim, mas quero ter abas.
InnaM
Então você já iniciou o vim de maneira a ter seus arquivos no cliente vim, não no shell do cmd / terminal?
DaveParillo
1
Não sei bem o que você quer dizer. Eu uso o shell para iniciar o vim como descrito acima e, em seguida, tenho um vim em execução.
InnaM
Ah! Acho que nunca realmente entendi que os buffers não são locais para as guias. Eu sempre pensei (sem pensar muito) que cada guia tem sua própria lista de buffers.
InnaM
Na minha máquina, vimlançarei um editor dentro do shell. Para obter a interface gráfica do usuário do vim, tenho que usar gvim. E você está correto - os buffers são globais para o aplicativo vim.
DaveParillo 5/11/09
47

Deseja abrir um buffer em uma nova guia?

Divida a tela (Ctrl-W s), abra uma janela e Ctrl-W T

Torre
fonte
Hmm. Não é exatamente o que eu tinha em mente, mas não é ruim para começar. Eu ainda não sabia Ctrl-w T. Obviamente, a primeira guia ainda terá dois buffers dessa maneira.
InnaM
Não. Depois de dividir a tela em duas janelas e abrir uma delas em uma nova guia, ela desaparece da primeira guia. Não permanecerá (pelo menos não está no meu gvim72). No que diz respeito aos buffers, eles não estão conectados às janelas / guias ... eles são mais parecidos com a memória em que o vim armazena o conteúdo do arquivo.
Rook
Ah! Você está certo. Eu estava interpretando mal a saída de :ls.
innaM 5/11/2009
Além disso, ctrl-w V divide a janela verticalmente.
5119 Shannon Nelson
1
CTRL-w v é o comando correto para dividir janelas verticalmente
JRM
27

Você pode fazer isso combinando o tabcomando com o sb[uffer]comando

Primeiro, você precisará saber o ID do buffer que deseja abrir em uma nova guia. Você pode descobrir isso com o lscomando:

:ls
  1 %a   "foo"                          line 1
  2      "bar"                          line 0

Depois de ter o ID, você pode abri-lo facilmente em uma nova guia usando:

:tab sb 2

O sbcomando normalmente abre o buffer especificado em uma nova janela dividida, mas o tabcomando faz com que ele seja aberto em uma nova guia.

O tabcomando também permite especificar onde, na lista de guias, a nova guia deve ser criada. Por exemplo, :0tab sb 2resultaria na nova guia 'barra' aparecendo no início da lista em vez de depois da guia atual.

rkjnsn
fonte
2
Você não precisa do número do buffer, forneça uma parte inequívoca do nome do buffer e o VIM fará o resto por você.
dessert
1
Essa era a resposta que eu procurava e precisava. Fiquei consternado quando :tab buffer part-of-namenão abriu uma nova guia! Mas :tab sb part-of-namefuncionou como um encanto. Obrigado!!!!
Sukima
Esta não é a pergunta exata do OP, mas era exatamente o que eu estava procurando :)
jackcogdill 2/11
25

Uma maneira melhor de realizar o que o OP pediu é:

:bufdo tab split

Isso abrirá cada buffer em uma guia própria, não importa quantos existam. Se você usa muito isso, é fácil transformar em um mapeamento no seu .vimrc. Combinado com algo como este pequeno plugin do vim, o seguinte abrirá todos os itens de :grep(ou : Ack ) em uma guia própria:

:grep foo
:QuickFixOpenAll
:bufdo tab split

Obviamente, ao recorrer a um plug-in, seria fácil modificá-lo para abrir o conteúdo da lista de correções rápidas diretamente nas guias.

ATUALIZAÇÃO : Eu realmente tenho que gritar o comentário de ggustafsson abaixo. É de longe a melhor resposta do lote e ilustra lindamente a tendência de Vim para o comportamento de composição. A sugestão é:

 :tab sball

Vale a pena procurar a ajuda do Vim para : tab e : sball para ver o que está acontecendo aqui.

John Whitley
fonte
Uma abordagem semelhante de uma edição anterior, para a posteridade, é :bufdo execute "tabnew %". Eu acho que a nova abordagem é um pouco mais clara.
John Whitley
Uma ressalva: se o buffer inicial no vim não estiver vazio, isso parece abrir o último buffer duas vezes. Vou postar uma atualização se encontrar uma correção simples.
John Whitley
12
:tab sballparece funcionar melhor.
precisa saber é o seguinte
6

1. Abra dois arquivos no Vim.

$ vim foo bar

2. Verifique o número de buffers.

: ls
  1% um "foo"
  2 "bar"

3. Encadeie dois comandos: tabnewpara abrir uma nova guia e b <buffer_number>carregar o buffer desejado na guia.

: tabnew | b 2
Shamaoke
fonte
8
O problema com a etapa 3 é que ele primeiro cria uma nova guia com um buffer vazio e abre o buffer 2, resultando em um buffer sem título extra na lista de buffers. Melhor usar:tab sb 2
rkjnsn
1
@rkjnsn você deve postar isso como resposta - é melhor responder à pergunta 'como faço para editar um buffer existente em uma nova guia no vim?'
JonnyRaa
1
@JonnyLeeds done.
rkjnsn
4

Basta adicionar um ponto que outros caras não mencionaram.

  • janela atual para nova guia

Se tiver várias janelas, ela <C-W>Tserá movida para uma nova guia. No entanto, este atalho apenas para "Janela", não "buffer". Se preferir esse estilo, :spou <C-W>sduplicar o buffer atual para mais uma janela, <C-W>Tmova-o para a nova guia.

4 teclas ou 7 teclas.

  • buffer atual para nova guia

:tabe % para abrir uma nova guia para o buffer atual.

7 pressionamentos de tecla.

  • buffer para nova guia

Se usar o plugin CtrlP, também poderá usar "CtrlPBuffer" e, em seguida, com <C-t>atalho para abri-lo com a nova página da guia. Este estilo, facilmente mudar para buffers diferentes.

Com atalho de "CtrlPBuffer", 4 pressionamentos de tecla ou mais.

liuyang1
fonte
:tabe %é o que eu procuro há muito tempo, obrigado!
pevik
Não, :tabe %não abre realmente uma nova guia para o buffer atual. O que acontece é que ele %é expandido para o caminho do arquivo do buffer atual e :tabeabre esse caminho. O Vim verá que você está tentando abrir um arquivo que você já abriu e reutilizará o buffer que você possui. Isso significa que isso não funciona com buffers que não possuem caminho de arquivo. Se você abrir um novo arquivo :newe não o salvou, não poderá colocá-lo em uma nova guia. O comando real que você precisa é o que rkjnsn colocou em sua resposta: :tab sb %ou mais curto::tab sb
JoL