Duplique o buffer na nova guia em vez de movê-lo

10

Freqüentemente, quero maximizar temporariamente um buffer em uma página de guia e, em seguida, voltar à antiga configuração de buffer que eu estava examinando. Meu fluxo de trabalho atual para fazer algo assim é fechar todos os outros buffers usando <c-w>oou mover o buffer que estou vendo atualmente para sua própria guia <c-w>T. O problema com a segunda abordagem é que ele remove o buffer da página da guia original.

Eu preencher três arquivos a.txt, b.txte c.txtcom a, be, crespectivamente.

% echo a > a.txt
% echo b > b.txt
% echo c > c.txt

Quando abro todos esses três arquivos em uma página da guia, obtenho o seguinte.

insira a descrição da imagem aqui

Então eu posso passar a.txtpara uma guia sozinha. Quando eu faço, no entanto, a.txté removido da página da guia original. (Então isso seria depois de <c-w>Tgt)

insira a descrição da imagem aqui

Gostaria da opção de escolher no momento em que pressionaria <c-w>Tpara preservar o conteúdo do buffer original, criar uma nova página de guia contendo apenas o buffer atualmente focado e, em seguida, focar a nova página de guia que acabei de criada. Em outras palavras, um comando quase exatamente como, <c-w>Texceto que a página da guia original é preservada e agora a.txtestá em duas páginas da guia.

Existe uma maneira de fazer isso?

Gregory Nisbet
fonte

Respostas:

13

Não tenho certeza, mas você pode tentar :tab split(ou a versão mais curta :tab sp).

O :splitcomando deve duplicar a exibição da janela de exibição a.txt, enquanto o :tabmodificador deve movê-la para uma página de guia dedicada.


Se você quiser alterar o comportamento de C-w T, poderá remapear da seguinte maneira:

nnoremap <C-w>T :tab split<CR>

De maneira mais geral, sempre que você encontra um comando que divide a janela e prefere que ele crie uma nova página de guia, é possível prefixá-lo :tab.

Pode ser usado, por exemplo, para ler um buffer de ajuda em uma nova ficha de registro:

:tab help {your_topic}

Por padrão, a nova página da guia aparecerá após a atual. Mas se você quiser que ele apareça em outro lugar, você pode prefixar :tabuma contagem.

Por exemplo, para duplicar a viewport atual em uma página de guia após a terceira, você pode digitar:

:3tab split

E para fazê-lo aparecer como o primeiro:

:0tab split

Para mais informações, você pode ler :h :tab:

:[count]tab {cmd}                   *:tab*
        Execute {cmd} and when it opens a new window open a new tab
        page instead.  Doesn't work for |:diffsplit|, |:diffpatch|,
        |:execute| and |:normal|.
        If [count] is given the new tab page appears after the tab
        page [count] otherwise the new tab page will appear after the
        current one.
        Examples:

            :tab split      " opens current buffer in new tab page
            :tab help gt    " opens tab page with help for "gt"
            :.tab help gt   " as above
            :+tab help      " opens tab page with help after the next
                            " tab page
            :-tab help      " opens tab page with help before the
                            " current one
            :0tab help      " opens tab page with help before the
                            " first one
            :$tab help      " opens tab page with help after the last
                            " one
user9433424
fonte
2

Eu tenho evitado guias principalmente por causa desse problema, mas agora tenho uma função que possui o comportamento de duplicação de guias que eu quero. Eu testei, mas não comecei a usá-lo a sério. Pode haver alguma desvantagem oculta para esse fluxo de trabalho.

Um problema com a função é que ela não duplica parte do estado do par anterior da janela de buffer (como se set numberestá ativada ou não). Especular um pouco, c-w Tprovavelmente não tem esse problema, porque nenhuma duplicação é executada e a janela provavelmente é apenas reparada.

O Vim tem algumas listas baseadas em 1 para itens como buffers, guias e janelas. Pelo que sei, eles são baseados em 1, porque a 0tecla é usada para mover para o início de uma linha e, como resultado, é impossível passar zero como argumento numérico.

Nos preocupamos com três listas para emular essa funcionalidade:

  • A lista global de guias
  • A lista de janelas por [tab page]
  • A lista global de buffers

Salvamos todos esses valores e criamos uma nova guia via "tabnew". Novas guias sempre são criadas à direita, portanto, nenhum dos índices abaixo da guia de onde partimos tabnewé invalidado. (Uma maneira mais robusta de fazer isso provavelmente seria melhor).

O tabnewcomando também move o foco para a nova guia e a janela única dentro dela. A partir daí, podemos usar o buffercomando para criar uma visualização no buffer que originalmente tinha foco.

Em seguida, usamos o índice salvo da guia original para restaurar o foco novamente nessa guia. E então, em grande parte por paranóia, definimos o foco nessa guia para a janela original. O Vim parece se lembrar de qual janela está focada em guias não visíveis, mas eu não gosto de confiar nisso.

(Alguns pontos estilísticos: a conversão numérica explícita 0+, variáveis ​​globais e asserções são intencionais)

function! TabDuplicate()
  " set vars, sanity checking
  let g:tabdup_win      = 0+ winnr()
  let g:tabdup_buf      = 0+ bufnr('%')
  let g:tabdup_tabpage  = 0+ tabpagenr()
  call assert_true(g:tabdup_win > 0)
  call assert_true(g:tabdup_buf > 0)
  call assert_true(g:tabdup_tabpage > 0)
  " make a new tab page,
  " the new tab page will have focus
  " none of the indices, which are all
  " less than the current index, are
  " invalidated by creating a new tab
  execute "tabnew"
  " visit the buffer we saved
  execute "buffer " . g:tabdup_buf
  " return to the original tab page
  execute "tabnext " . g:tabdup_tabpage
  " return focus to original window
  execute g:tabdup_win . " windcmd w"
endfunction
Gregory Nisbet
fonte