A maneira mais rápida de mudar para um buffer no vim?


43

Uma maneira de selecionar um buffer no vim poderia ser procurar a lista de buffers, usando comandos padrão como :ls, ou com algum código externo de plugin / vimscript, para procurar uma lista em uma janela .

Digamos que eu queira pular para um buffer diretamente, o mais rápido possível.

Para percorrer a lista de buffers no modo seqüencial, agora uso <C-J> <C-K>atalhos, tendo definido em meu .vimrc:

" move among buffers with CTRL
map <C-J> :bnext<CR>
map <C-K> :bprev<CR>

Outra maneira (acesso direto) pode ser alternada por número : conhecendo o número do buffer, é possível alternar diretamente digitando o número do buffer seguido por <C-^>. Então, se eu quiser mudar para o buffer número 5, pressione 5<C-^>.

Mas isso parece não funcionar para mim (eu uso o vim 7.4 no ubuntu box, de um convidado do Windows, com teclado italiano ). Eu suspeito que é porque o ^caractere está na tecla maiúscula do teclado italiano, então, na verdade, ^preciso pressionarSHIFT-^

Alguma ideia?


2
Você pode pressionar em <c-6>vez de <c-^>?
Peter Rincker

você quer dizer que Ctrl-1 vai para o buffer número 1? Infelizmente não funciona. nada acontece
Giorgio Robino 23/02

11
Não. Alguns terminais podem entender Ctrl-6, que é o mesmo que Ctrl- ^ no teclado dos EUA.
Peter Rincker

2
+1 Ótimo, funciona! Eu uso um layout de teclado italiano (usando o emulador de terminal de massa). Então: 1<C-6>muda para o buffer número 1. Obrigado!
Giorgio Robino 24/02

Você pode tentar usar o CtrlSpace .
Hongbo Liu

Respostas:


51

O :bcomando também pode levar uma subcadeia do nome do arquivo do buffer para o qual você deseja viajar, o que é muito conveniente.

Por exemplo, se você tem três buffers foo, bare baz, em seguida,

  • :b barirá mudar para o bararquivo.

  • :b oirá mudar para o fooarquivo.

  • :b agera um erro porque pode significar um barou outro baz, mas é possível corrigir o nome para ser mais específico, por exemplo : r Enter,.

Isso pode ser muito útil, porque significa em vez de

:buffer very/very/long/path/to/a/veryVeryLongFileName.txt

você pode fazer algo como

:b LongFileName

o que é muito mais curto e fácil.

Este comando também pode levar um número, se você quiser usar isso:

:b 5

8
Uma ressalva sobre o uso de nomes parciais do buffer: se o nome do buffer parcial aparecer no início de um limite de palavra no caminho de algum buffer, nenhum buffer com o nome parcial no meio de uma palavra será acessível pelo :bcomando. Por exemplo, se você tiver dois buffers path/to/fooe path/to/tofu, o comando :b f<Tab>nunca corresponderá path/to/tofu, pois corresponde no início de uma palavra em path/to/foo.
23415 Tommcdo

2
:5bé ligeiramente mais curto, em seguida, :b 5 ;-)
joeytwiddle

16

Isto é o que eu uso:

nnoremap <Leader>b :ls<CR>:b<Space>

Agora, pressionar \birá listar os buffers disponíveis e se preparar :bpara você.

Depois, basta digitar o número do buffer e pressionar Enter.

Ou você pode digitar parte do nome do arquivo e pressionar Enter. (No entanto, geralmente pressione Tab antes de pressionar Enter, para verificar se tenho o buffer correto. Caso contrário, continuo pedalando com Tab até encontrar o que queria.)


Na verdade, eu uso uma versão ligeiramente aprimorada do acima:

nnoremap <C-e> :set nomore <Bar> :ls <Bar> :set more <CR>:b<Space>

Isso impedirá que o -- More --prompt apareça quando você tiver mais buffers do que as linhas disponíveis para exibi-los.

Mas se você normalmente tem a 'more'opção desabilitada de qualquer maneira, esse mapeamento realmente o incomoda, porque reativa a 'more'opção depois de fazer ls!


11
Verdade seja dita, na verdade eu não uso nenhum deles, uso meu próprio pequeno plug-in , mas a funcionalidade é muito semelhante. Com o plug-in, também posso executar Tab-complete nos nomes de arquivos de buffers não abertos.
Joeytwiddle

11
Embora essa técnica não seja tão rápida quanto usar [count]<C-^>quando você souber o número do buffer, é bastante útil quando você não souber.
Joeytwiddle

2
obrigado joeytwiddle por suas anotações. Vou verificar o seu plugin o mais rápido possível. No meu caso (ver questão teclado acima) [count]<C-6>parecem-me a maneira mais rápida para mudar para o tampão conhecido
Giorgio Robino

Sim, eu também estou usando [count]<C-^>esses dias. Mas isso significa que eu preciso executar o MiniBufExplorer ou algo semelhante para saber quais são os números do buffer!
Joeytwiddle

por que você precisa do <CR> e do <SPACE>? No começo, parece-me que funciona bem sem eles ...
Felix Crazzolara

9

:CtrlPBufferdo plugin CtrlP (4k ★)

A principal característica deste plug-in é fornecer uma correspondência difusa para abrir convenientemente um buffer diferente com feedback visual.

Abra a lista de buffers difusos com :CtrlPBufferou pressione <C-p>seguido de <C-b>para alterar o modo para buffer.

Digite um número suficiente de caracteres para especificar o buffer que você deseja abrir.
Você também pode usar <C-j>e <C-k>para percorrer a lista e selecionar manualmente o buffer.

insira a descrição da imagem aqui

Costumização

Se você deseja abrir a lista de buffers imediatamente com <C-p>, adicione a seguinte linha ao seu vimrc:

let g:ctrlp_cmd = 'CtrlPBuffer'

Você pode usar <C-f/b>para alternar o modo da janela ctrlp.

Eu pessoalmente uso let g:ctrlp_cmd = 'CtrlPMRU'. A lista usada mais recentemente (mru) também contém os buffers abertos. Se você usar diferentes modos de ctrlp e quiser manter o seu último modo, poderá definir let g:ctrlp_cmd = 'CtrlPLastMode [--dir]'.

Plugins semelhantes

Existem mais plugins que fornecem uma lista de buffers com um prompt interativo com correspondência difusa, por exemplo

O lado escuro vs. o lado claro

(ou seja, configuração do vim com plug-in pesado e maneira vim)

Antes de decidir usar esses plugins mais complexos, estude as respostas em @Doorknob e @joeytwiddle . Em particular, verifique a linha única se uma delas já atender às suas necessidades.

  1. nnoremap <Leader>b :b <C-d>
  2. nnoremap <Leader>b :ls<Cr>:b<Space>

Instalar os plugins apenas para alternar de buffer pode ser um exagero. Veja também as observações em https://www.vi-improved.org/recommendations e o artigo de Drew Neil 'On sharpening the saw' .


Sim Hotschke, confesso que costumo usar: CtrlPBuffer
Giorgio Robino

Eu estou usando map <leader>a <ESC>:CtrlPBuffer<CR><CR>para saltar para o buffer previamente aberta com <leader>a(enquanto <leader>bapenas abre a lista tampão para mim)
Rolf

@Rolf: você sabe <C-^>(= <C-6>)? veja :h CTRL-^. Afaik, isso apenas faz o que seu mapeamento <leader>aparece fazer. Portanto, acho que você acabou de dar um exemplo do porquê as pessoas dizem que o uso de plug-ins pode levar o usuário do vim que não sabe o que o vim já pode fazer por conta própria.
Hotschke 13/09/18

@ Hotschke: Não, eu não sabia disso. Aprendi algo sabia, obrigado! Vou remapear <C - ^> embora.
Rolf

Excelente referência a <Cd> com vanilla vim. Eu não vi essa referência em nenhum outro lugar.
radke 31/07

8

Além das respostas realmente úteis de joeytwiddle e Maçaneta da porta, não esqueça :b#, que muda para o buffer usado mais recentemente. Também pode ser feito com apenas <C-^>. Quando você possui muitos buffers e alterna constantemente entre eles, o buffer mais recente geralmente é o destino mais comum.

Pessoalmente, uso a combinação de vários métodos. Quando trabalho principalmente com dois buffers e o restante é aberto apenas para referência ocasional, costumo alternar entre eles com :b#ou <C-^>. Quando preciso trabalhar com mais deles e alternar com mais frequência, uso números (como na dica de joeytwiddle) ou parte dos nomes (como na dica da maçaneta da porta) com TAB para completá-los. Quando os nomes são confusos e há muitos buffers abertos (geralmente acima de 10), eu uso o plug-in Ctrl-P com mais frequência ( https://github.com/kien/ctrlp.vim ) Com duas teclas rápidas, obtive a lista de todos eles e eu posso usar a pesquisa difusa poderosa sobre eles para encontrar rapidamente o que eu quero.


2
<C - ^> sozinho (<C-6> no meu caso, como Peter Rincker sugerido) é um bom truque em caso de apenas 2 buffers :-)
Giorgio Robino

5

[be ]bdo plugin vim-unimpaired(> 2k ★)

Se você instalou vim-unimpaired, pode usar

  • [b( :bp[revious]) e
  • ]b( :bn[ext])

para pedalar através de buffers abertos. Não há necessidade de definir mapeamentos mais preciosos para os mesmos comandos. Além disso, o salto para o primeiro e o último buffer pode ser feito por

  • [B( :bf[irst]) e
  • ]B( :bl[ast])

muito mais mapeamentos de colchetes nos vim-unimpairedquais você pode achar útil. Todos eles seguem o mesmo esquema, o que facilita a memorização.

O lado escuro vs. o lado claro

Este plugin pode ser considerado leve e 'vimish'. É indicado pela comunidade #vim como um plug-in "não prejudica".


+1 Também vale a pena notar que você pode fornecer uma contagem. 3[bpara pular três buffers de volta.
joeytwiddle 29/04

1

Atualmente, estou usando a tecla <Leader>+ numberpara alternar. A chave do líder é a minha <space>chave. Também uso o vim-airlines para mostrar o buffer nr no topo da janela.

" airline settings
let g:airline#extensions#tabline#buffer_nr_show = 1
let g:airline#extensions#tabline#enabled = 1

Enquanto o bufnr geralmente excede 10, então eu ajusto meu próprio mapeamento; se essa numberé a única correspondência, troque o buffer imediatamente; caso contrário, aguarde mais entrada de número ou <space>chave para confirmar:

nnoremap <expr> <Leader>1 tweak#wtb_switch#key_leader_bufnum(1)
nnoremap <expr> <Leader>2 tweak#wtb_switch#key_leader_bufnum(2)
nnoremap <expr> <Leader>3 tweak#wtb_switch#key_leader_bufnum(3)
nnoremap <expr> <Leader>4 tweak#wtb_switch#key_leader_bufnum(4)
nnoremap <expr> <Leader>5 tweak#wtb_switch#key_leader_bufnum(5)
nnoremap <expr> <Leader>6 tweak#wtb_switch#key_leader_bufnum(6)
nnoremap <expr> <Leader>7 tweak#wtb_switch#key_leader_bufnum(7)
nnoremap <expr> <Leader>8 tweak#wtb_switch#key_leader_bufnum(8)
nnoremap <expr> <Leader>9 tweak#wtb_switch#key_leader_bufnum(9)




func! tweak#wtb_switch#key_leader_bufnum(num)
    let l:buffers = tweak#wtb_switch#buflisted()
    let l:input = a:num . ""

    while 1

        let l:cnt = 0
        let l:i=0
        " count matches
        while l:i<len(l:buffers)
            let l:bn = l:buffers[l:i] . ""
            if l:input==l:bn[0:len(l:input)-1]
                let l:cnt+=1
            endif
            let l:i+=1
        endwhile

        " no matches
        if l:cnt==0 && len(l:input)>0
            echo "no buffer [" . l:input . "]"
            return ''
        elseif l:cnt==1
            return ":b " . l:input . "\<CR>"
        endif

        echo ":b " . l:input

        let l:n = getchar()

        if l:n==char2nr("\<BS>") ||  l:n==char2nr("\<C-h>")
            " delete one word
            if len(l:input)>=2
                let l:input = l:input[0:len(l:input)-2]
            else
                let l:input = ""
            endif
        elseif l:n==char2nr("\<CR>") || (l:n<char2nr('0') || l:n>char2nr('9'))
            return ":b " . l:input . "\<CR>"
        else
            let l:input = l:input . nr2char(l:n)
        endif

        let g:n = l:n

    endwhile
endfunc

func! tweak#wtb_switch#buflisted()
  return filter(range(1, bufnr('$')), 'buflisted(v:val)')
endfunc

O código é colado a partir daqui

A propósito, eu também uso <S-h>e <S-l>para :bpe :bn, ou :tabpe :tabnse mais de uma guia estiver aberta no momento. É bastante intuitivo para mim.


1

Atualmente, estou usando [buffer_number]<Ctrl-^>para alternar buffers porque é muito rápido.

Mas como saber o número do buffer? Eu uso MiniBufExplorer para que possa sempre ver os números tampão na parte superior do Vim.

Também uso o seguinte mapeamento, porque <C-^>é um pouco difícil de alcançar com uma mão.

:nmap <C-E> <C-^>

Em uma máquina nova sem configuração, volto a :b [part_of_filename]<Tab><Enter>

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.