Cómo iterar sobre búferes en Vimscript

Pregunta:

¿Cómo puedo iterar sobre los búferes abiertos actuales y decir, cargar los números de búfer en una matriz en vimscript?

Sé que existen matrices o estructuras de datos similares en vimscript.
Sé que a cada búfer se le asigna un número único.
Mi objetivo es poner cada uno de esos números en una matriz de la misma longitud que la cantidad de búferes, es decir, for i in number of open buffers: array[i] = #buffer
Me gustaría permitir que la array sea ​​una variable en mi archivo vimscript.

Respuesta:

Puede iterar sobre búferes si usa :bnext y todo. Recomiendo encarecidamente este método. Activará comandos automáticos y tendrás que recordar dónde estabas. En otras palabras, puede ser muy lento y con muchos efectos secundarios. Manténgase alejado si puede.

Hasta ahora, mi enfoque preferido era usar filter() en el range(1, bufnr('$')) para mantener los búferes que me interesan ( bufloaded() , bufexists() o buflisted() ). Lo que da:

:let buffers = filter(range(1, bufnr('$')), 'bufexists(v:val)')

Incluso podemos ir más allá y usar otras formas de filtrar la lista de búfer: de acuerdo con su nombre, o variables de búfer (.eg getbufvar(v:val, 'foo', sentinelvalue) =~ "regex for b:foo") ) .

Como ves, hay muchas opciones. Los puntos de entrada son filter() y funciones con buf en su nombre -> :h *buf*()^D ( ^D como al presionar ctrl + D para ver la lista de funciones)

Tenga en cuenta también que las versiones recientes de vim proporcionan una nueva función getbufinfo() que devolverá una lista de diccionarios: cada diccionario contiene mucha información para cada búfer existente. Otra forma de obtener búferes existentes es con:

:let buffers = map(copy(getbufinfo()), 'v:val.bufnr')

O tampones listados con

:let buffers = map(filter(copy(getbufinfo()), 'v:val.listed'), 'v:val.bufnr')

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım