La forma más rápida de cambiar a un búfer en vim?


43

Una forma de seleccionar un búfer en vim podría ser navegar por la lista de búferes, utilizando comandos estándar como :ls, o con algún código externo de plugin / vimscript para navegar por una lista en una ventana .

Digamos que quiero saltar directamente a un búfer, lo más rápido posible.

Para recorrer la lista de búferes en modo secuencial, ahora uso <C-J> <C-K>accesos directos, habiendo configurado en mi .vimrc:

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

Otra forma (acceso directo) podría ser cambiar por número : conociendo el número de búfer, es posible cambiar directamente ingresando el número de búfer seguido de <C-^>. Entonces, si quiero cambiar al buffer número 5, presionaría 5<C-^>.

Pero esto parece no funcionar para mí (uso vim 7.4 en ubuntu box, de un invitado de Windows, con teclado italiano ). Sospecho que eso se debe a que el ^carácter está en mayúscula en el teclado italiano, así que de hecho tengo ^que presionarSHIFT-^

¿Algunas ideas?


2
¿Puedes presionar en <c-6>lugar de <c-^>?
Peter Rincker

¿te refieres a Ctrl-1 para ir al buffer número 1? Lamentablemente no funciona. no pasa nada
Giorgio Robino

1
No. Algunos terminales pueden entender Ctrl-6, que es lo mismo que Ctrl- ^ en el teclado de EE. UU.
Peter Rincker

2
+1 ¡Genial, funciona! Yo uso un diseño de teclado italiano (usando emulador de terminal de masilla). Entonces: 1<C-6>cambia al número de búfer 1. ¡Gracias!
Giorgio Robino

Puedes intentar usar CtrlSpace .
Hongbo Liu

Respuestas:


52

El :bcomando también puede tomar una subcadena del nombre del archivo del búfer al que desea viajar, lo cual es muy conveniente.

Por ejemplo, si tiene tres memorias intermedias foo, bary baz, a continuación,

  • :b barcambiará al bararchivo.

  • :b ocambiará al fooarchivo.

  • :b ale dará un error porque podría significar uno baru otro baz, pero puede arreglar el nombre para que sea más específico, por ejemplo, con : r Enter.

Esto puede ser muy útil, porque significa en lugar de

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

puedes hacer algo como

:b LongFileName

que es mucho más corto y fácil

Este comando también puede tomar un número, si desea usar eso:

:b 5

8
Una advertencia sobre el uso de nombres de búfer parciales: si el nombre del búfer parcial aparece al comienzo del límite de una palabra en la ruta de algún búfer, el :bcomando no podrá acceder a ningún búfer con el nombre parcial en el medio de una palabra . Por ejemplo, si tiene dos buffers path/to/fooy path/to/tofu, el comando :b f<Tab>nunca coincidirá path/to/tofu, ya que coincide al comienzo de una palabra en path/to/foo.
tommcdo

2
:5bes un poco más corto que :b 5 ;-)
joeytwiddle

16

Esto es lo que uso:

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

Ahora presionando \bse enumerarán los buffers disponibles y se prepararán :bpara usted.

Luego puede simplemente escribir el número de búfer y presionar Enter.

O puede escribir parte del nombre del archivo y presionar Entrar. (Sin embargo, usualmente presiono Tab antes de presionar Enter, para verificar que obtuve el búfer correcto. Si no, continúo pedaleando con Tab hasta obtener el que quería).


De hecho, uso una versión ligeramente modificada de lo anterior:

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

Esto evitará que -- More --aparezca el mensaje cuando tenga más buffers que líneas disponibles para mostrarlos.

Pero si normalmente tiene la 'more'opción deshabilitada de todos modos, esta asignación realmente lo molestará, ¡porque vuelve a habilitar la 'more'opción después de hacerlo ls!


1
A decir verdad, en realidad no uso ninguno de esos, uso mi pequeño plugin , pero la funcionalidad es muy similar. Con el complemento, también puedo realizar Tab-complete en los nombres de archivo de buffers no abiertos.
joeytwiddle

1
Aunque esta técnica no es tan rápida como [count]<C-^>cuando se conoce el número de búfer, es bastante útil cuando no se conoce.
joeytwiddle

2
gracias joeytwiddle por tus notas. Comprobaré tu complemento lo antes posible. En mi caso (vea el problema del teclado más arriba), [count]<C-6>me parece la forma más rápida de cambiar al búfer conocido
Giorgio Robino,

Sí, también estoy usando [count]<C-^>estos días. Pero eso significa que necesito ejecutar MiniBufExplorer o algo similar, ¡para saber cuáles son los números de búfer!
joeytwiddle

¿Por qué necesita el <CR> y el <SPACE>? Al principio me parece, como si funcionara bien sin ellos ...
Felix Crazzolara

9

:CtrlPBufferdesde el complemento CtrlP (4k ★)

La característica principal de este complemento es proporcionar una coincidencia difusa para abrir convenientemente un búfer diferente con retroalimentación visual.

Abra la lista de búferes difusos con :CtrlPBuffero presione <C-p>seguido de <C-b>para cambiar el modo a buffer.

Ingrese un número suficiente de caracteres para especificar el búfer que desea abrir.
También puede usar <C-j>y <C-k>para recorrer la lista y seleccionar manualmente el búfer.

ingrese la descripción de la imagen aquí

Personalización

Si desea abrir la lista de búfer inmediatamente con <C-p>, agregue la siguiente línea a su vimrc:

let g:ctrlp_cmd = 'CtrlPBuffer'

Puede usar <C-f/b>para cambiar el modo de la ventana ctrlp.

Yo personalmente uso let g:ctrlp_cmd = 'CtrlPMRU'. La lista utilizada más recientemente (mru) también contiene los búferes abiertos. Si utiliza diferentes modos ctrlp y desea mantener su último modo, puede configurarlo let g:ctrlp_cmd = 'CtrlPLastMode [--dir]'.

Complementos similares

Hay más complementos que proporcionan una lista de búfer con un mensaje interactivo con coincidencia difusa, p. Ej.

El lado oscuro vs. el lado claro

(es decir, configuración vim con mucho plugin frente a la forma vim)

Antes de decidir usar estos complementos más complejos, estudie las respuestas de @Doorknob y @joeytwiddle . En particular, verifique el one-liner si uno de ellos ya satisface sus necesidades.

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

La instalación de los complementos solo para el cambio de búfer puede ser una exageración. Vea también las observaciones en https://www.vi-improved.org/recommendations y el artículo de Drew Neil 'Sobre el afilado de la sierra' .


sí Hotschke, confieso que a menudo uso: CtrlPBuffer
Giorgio Robino

Estoy usando map <leader>a <ESC>:CtrlPBuffer<CR><CR>para saltar al búfer abierto previamente con <leader>a(mientras <leader>bsolo abre la lista de búfer para mí)
Rolf

@Rolf: ¿sabes <C-^>(= <C-6>)? ver :h CTRL-^. Afaik, esto simplemente hace lo que <leader>aparece hacer tu mapeo . Por lo tanto, creo que acaba de dar un ejemplo de por qué la gente dice que el uso de complementos podría llevar a un usuario de vim que no sabe lo que vim ya puede hacer por sí solo.
Hotschke

@Hotschke: No, no lo sabía. Aprendí algo sabido, gracias! Sin embargo, voy a reasignar <C - ^>.
Rolf

1
Excelente referencia a <Cd> con vainilla vim. No he visto esa referencia en ningún otro lado.
radke

8

Además de las respuestas realmente útiles de joeytwiddle y Doorknob, no se olvide :b#, que cambia al búfer utilizado más recientemente. También se puede hacer con solo <C-^>. Cuando tiene muchos búferes y cambia constantemente entre ellos, el búfer más reciente suele ser el destino más común.

Personalmente uso la combinación de muchos métodos. Cuando trabajo principalmente con dos buffers y el resto se abre solo para referencia ocasional, tiendo a cambiar entre ellos con :b#o <C-^>. Cuando tengo que trabajar con más de ellos y cambiar más a menudo, utilizo números (como en la sugerencia joeytwiddle) o parte de los nombres (como en la sugerencia de Doorknob) con TAB para completarlos. Cuando los nombres son confusos, y hay muchos búferes abiertos (generalmente más de 10), uso el complemento Ctrl-P con más frecuencia ( https://github.com/kien/ctrlp.vim ) Con dos teclas rápidas obtuve la lista de todos ellos y puedo usar una poderosa búsqueda difusa sobre ellos para encontrar rápidamente lo que quiero.


2
<C - ^> solo (<C-6> en mi caso, como sugirió Peter Rincker) es un buen truco en caso de solo 2 buffers :-)
Giorgio Robino

5

[by ]bdesde el complemento vim-unimpaired(> 2k ★)

Si tiene instalado vim-unimpaired, puede usar

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

para recorrer en búfer abierto. No es necesario definir asignaciones más valiosas para los mismos comandos. Además, puede saltar al primer y último búfer si

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

Hay muchas más asignaciones de corchetes contenidas en las vim-unimpairedque puede ser útil. Todos siguen el mismo esquema que hace que sea fácil memorizarlos.

El lado oscuro vs. el lado claro

Este complemento puede considerarse ligero y 'vimish'. La comunidad #vim lo denota como un complemento "no daña".


+1 También vale la pena señalar que puede proporcionar un recuento. 3[bsaltar tres buffers hacia atrás.
joeytwiddle

1

Actualmente estoy usando la tecla <Leader>+ numberpara cambiar. La clave del líder es mi <space>clave. También uso vim-airline para mostrar el buffer nr en la parte superior de la ventana.

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

Si bien el búfer a menudo excede de 10, entonces modifico mi propio mapeo, si numberes la única coincidencia, cambie el búfer de inmediato, de lo contrario, espere más entrada de número o <space>clave 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

El código se pega desde aquí.

Por cierto, también uso <S-h>y <S-l>para :bpy :bn, o :tabpy :tabnsi actualmente se abre más de una pestaña. Es bastante intuitivo para mí.


1

En estos días estoy usando [buffer_number]<Ctrl-^>para cambiar buffers porque es muy rápido.

Pero, ¿cómo saber el número de búfer? Uso MiniBufExplorer para que siempre pueda ver los números de búfer en la parte superior de Vim.

También uso el siguiente mapeo, porque <C-^>es un poco difícil de alcanzar con una mano.

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

En una máquina nueva sin configuración, vuelvo a :b [part_of_filename]<Tab><Enter>

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.