¿Cómo se muestran los búferes en una ventana de revisión rápida en Vim?

13

Usando el editor vim, una tarea común es buscar buffers. Ahora uso comandos estándar como :lso a :bnext. De hecho puse en mi .vimrc:

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

Me gustaría examinar los buffers como una lista en la ventana de revisión rápida, de la manera simple (= excelente) que implementa el complemento MRU .

¿Existe un complemento tan simple como MRU pero que actúa sobre buffers?

OK, una posible solución podría ser usar el :CtrlpBufferscomando, parte del complemento Ctrlp, pero no soy un gran admirador de Ctrlp, porque a veces tengo comportamientos extraños que no entiendo completamente (las selecciones de modo difuso ...); así que busco algo realmente simple como el complemento MRU.

Por cierto, bromeé con el :cexpr {expr}comando, intentando llenar las ventanas de corrección rápida con el contenido de la :bufferslista, sin éxito (tal vez porque mi ignorancia programaba vimscripts)

Cualquier sugerencia ?

Giorgio Robino
fuente
¿Quiso decir en :bnextlugar de :cnext?
tommcdo
¿Necesita específicamente que sea la ventana de corrección rápida ? ¿O simplemente quieres poder ver los buffers abiertos en una ventana? (Porque hay varios complementos para hacer esto último).
Rico
Quiero poder explorar los buffers abiertos en una ventana. De hecho quickfix no se reuired
Giorgio Robino
@tommcdo: sí, lo siento, mis errores tipográficos habituales. Quiero decir: a continuación y actualicé la pregunta
Giorgio Robino
relacionado: stackoverflow.com/questions/28669101/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

18

Puede completar la lista de soluciones rápidas con cada búfer de esta manera:

:call setqflist(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '{"bufnr": v:val}'))
  • setqflist()toma una lista de elementos del diccionario que describe cada error (nombre de archivo, número de línea, posición, etc.). En este caso, estamos especificando un conjunto mínimo de información: el número de búfer
  • map()toma una Lista y una expresión (una cadena) y devuelve una nueva Lista de la expresión aplicada a cada elemento de la Lista de entrada. Aquí, tomamos una Lista de números de búfer enumerados y los formateamos para su uso en setqflist()( '{"bufnr": v:val}', donde v:vales el valor del elemento en la lista)
  • filter()filtra una Lista, eliminando elementos que no satisfacen una expresión dada. Aquí la expresión es buflisted(v:val), lo que significa que el número de búfer existe y está en la lista, es decir, aparece en la :lssalida
  • range(a, b)genera una lista de números desde ahastab
  • bufnr()devuelve el número de un nombre de búfer dado. Si el argumento es '$', devuelve el número de búfer más alto

Es mucho para escribir, y no es muy memorable, por lo que puede envolverlo en un comando en su vimrc:

command! Qbuffers call setqflist(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '{"bufnr":v:val}'))

Ahora puede usar :Qbufferspara completar la lista de soluciones rápidas.


Si desea que esto se actualice automáticamente a medida que se agregan nuevas memorias intermedias, puede hacer algo como esto:

autocmd BufAdd * Qbuffers

Sin embargo, no recomendaría esto, ya que hará que la lista de soluciones rápidas sea bastante inutilizable para cosas como :makeo :grep.

tommcdo
fuente
1
gracias por las explicaciones, tommcdo. Qbuffers es hermoso! Tal vez agregaría un: copen al final de su llamada para abrir inmediatamente la ventana de corrección rápida y tal vez podría ser útil informar la posición del cursor. Tengo que estudiar un poco de vimscript :-)
Giorgio Robino
9

Deberías probar este mapeo:

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

En el indicador, escriba el número de búfer deseado y presione Entrar.

gb

romainl
fuente
La pregunta sobre la lista de buffers en la ventana de búsqueda rápida.
VeXii
Sí, y mi respuesta ofrece una alternativa ligera.
romainl
1
OP afirma que conoce la lista de búfer, pero le gusta tenerla en la ventana de revisión rápida. y tu solución es usar la lista de búfer?
VeXii
1

Echa un vistazo al plugin bufexplorer . Abre una lista navegable de todos los buffers en una barra lateral, similar al complemento MRU mencionado. Además, hay varios complementos más en vim.org .

PD: Has hecho la misma pregunta sobre Stack Overflow ; ¡no envíe la misma pregunta a varios sitios en paralelo!

Ingo Karkat
fuente
tks Ingo, probé un poco bufexplorer y me gusta. También publiqué aquí porque se sugirió hacer un stackoverflow
Giorgio Robino
1
Si, lo ví. Hubiera preferido que hubiera eliminado la publicación SO original, o al menos vinculada a la publicación cruzada.
Ingo Karkat