¿Cómo vincular un conjunto de buffers a una pestaña?

14

Cuando necesito trabajar en diferentes proyectos al mismo tiempo, tengo el siguiente flujo de trabajo:

  • Creo una pestaña para cada proyecto.
  • En cada pestaña abro los archivos que quiero editar, lo que genera varios búferes.
  • Opcionalmente, si necesito ver dos (o más) archivos al mismo tiempo, creo ventanas divididas, así que tengo una pestaña que contiene diferentes ventanas que muestra un búfer.

Para navegar entre mis buffers que realmente no uso :lsy en su :b [name or number of buffer]lugar creé algunas asignaciones convenientes que me permiten cambiar entre los buffers con :bnexty:bprevious

Esta forma de trabajar es bastante buena, pero algo me molesta: los buffers se comparten entre las pestañas.

Si abro file1y file2en tab1y file3adentro tab2, si tab1uso varias veces :bnext, veré file3en esta pestaña lo que no quiero. El flujo de trabajo que me gustaría obtener es el siguiente :

  • Inicie vim (tengo una primera pestaña con un búfer): $ vim foo
  • Agregue un búfer a esta pestaña: :e bar
  • Abra una nueva pestaña y cambie a ella: :tabnew
  • Abra un nuevo búfer en esta pestaña: :e baz
  • Si me quedo en este búfer y hago :bnexto :bpreviousme quedaré en el bazbúfer (ya que es el único en esta pestaña)
  • Si entro en la pestaña anterior :tabpreviousy ejecuto varias veces :bnext, solo cambiaré entre fooy barbuffers, pero no verébaz

Así que aquí viene mi pregunta: ¿es posible vincular un conjunto de buffers a una pestaña y hacer que vim no permita el acceso a algunos buffers desde otra pestaña que no sea en la que están destinados?

Nota: Soy consciente de que usar :b [myBuffer]sería una manera de mantener un búfer en una pestaña, pero cuando tengo 3 o 4 archivos para editar, siento que soy realmente más rápido usando mis asignaciones que escribiendo el nombre del búfer (incluso si puedo escriba solo algunos caracteres para que coincidan con el nombre del búfer) .

statox
fuente
1
Aquí hay una vieja discusión que destaca los pros y los contras de tal enfoque, y sugiere en cambio algo que hoy podría traducirse como: múltiples instancias vim (una por proyecto / lista de búfer) + tmux: vim.1045645.n5.nabble.com/…
VanLaser
@VanLaser: ¡Gracias por el enlace, es una discusión interesante! De hecho, incluyo tmux y diferentes instancias de vim cuando estoy en mi máquina personal. Mi pregunta proviene del hecho de que tengo que usar Windows para mi trabajo profesional y realmente no me gusta cómo se manejan las ventanas: usar alt+tab(o peor aún, el mouse) se siente mucho menos fácil que cambiar de pestaña dentro de vim.
statox
1
Tal vez vim-ctrlspace pueda ayudar: anuncia por listas de búferes de tabulación; Sin embargo, no lo uso.
VanLaser

Respuestas:

7

Mhh, no encontré ningún complemento, pero puedes escribirlo tú mismo. Necesita aprender vimscript para esto. Acabo de implementar la funcionalidad que puede cambiar entre buffers en una pestaña (aún no se elimina). Puede copiar esto en su vimrc:

if !exists("g:WindowBufManager") 
  let g:WindowBufManager= {}
endif

function! StoreBufTab()
  if !has_key(g:WindowBufManager, tabpagenr())
    let  g:WindowBufManager[tabpagenr()] = []
  endif

  " add the new buffer to our explorer
  if index(g:WindowBufManager[tabpagenr()], bufname("%")) == -1 && bufname("%") != ""
    call add (g:WindowBufManager[tabpagenr()],bufname("%"))
  endif
endfunction

function! WindowBufManagerNext() 
  " find the next index of the buffer
  let s = index(g:WindowBufManager[tabpagenr()], bufname("%"))
  if (s!= -1)
    let s = (s +1) % len(g:WindowBufManager[tabpagenr()])
    execute 'b ' . g:WindowBufManager[tabpagenr()][s]
  endif
endfunction

augroup WindowBufManagerGroup
  autocmd! BufEnter * call StoreBufTab()
augroup END

Cierre su vimrc y ábralo nuevamente. Para encontrar el siguiente búfer simplemente use

:call WindowBufManagerNext()

o defina su propio comando o mapeo. Esto funcionará siempre que no cierre ni elimine una pestaña o búfer. Tampoco funcionará para múltiples buffers. Requeriría un poco más de trabajo agregar esas características, pero definitivamente es factible.

philolo1
fuente
Tampoco encontré un complemento y esperaba tener una función incorporada para hacerlo, pero parece que tienes razón, probablemente tendré que hacerlo solo. Gracias por su código, podría usarlo, tiene una base para desarrollar un complemento completo.
statox
6

Los buffers son globales y no hay nada que pueda hacer al respecto, excepto escribir su propia capa de abstracción en la parte superior de las páginas de pestañas, ventanas y buffers. La respuesta de philolo1 muestra un enfoque razonable del problema, pero encontrará rápidamente los límites de dicha "solución" y necesitará duplicar muchas funciones integradas como:bufdo el archivo alternativo ...

Los "argumentos", por otro lado, pueden ser locales en una ventana, por lo que pueden ser más útiles en su flujo de trabajo que los "buffers" (en el sentido más estricto de la palabra):

$ vim file1 file2
:tabnew
:argl file3 file4 file5
:n
:n
gt
:n
gt
:N
and so on…

Los argumentos no son tan flexibles como las memorias intermedias, pero pueden proporcionar una base más confiable para su flujo de trabajo.

Pero trabajar en cada proyecto en su propia instancia de Vim es, en mi opinión, la única solución práctica.

romainl
fuente
Estoy de acuerdo con la idea de que usar instancias vim separadas es mejor cuando puedo usarlo en una terminal, como dije en otro comentario, tengo que usar Windows en mi computadora profesional y cambiar entre instancias gvim es un fastidio con este sistema operativo . Echaré un vistazo a los argumentos que nunca he usado antes y esa podría ser una buena solución, ¡gracias!
statox
2

Entonces, con algo de retraso, creo que he encontrado una respuesta satisfactoria (¡al menos para mí!). Necesitarás dos de los complementos de Shougo:

y un mapa de acceso rápido para usar en lugar de :ls, para ver (y seleccionar) solo buffers de la pestaña actual .

Por ejemplo, algo como:

nnoremap <leader>b :<C-u>Unite buffer_tab -no-split<CR>

unir - por tampones de pestañas

Ahora puede moverse por la lista de búferes de pestañas actual ( j, k), seleccionar uno ( CR), cancelar ( q), ingresar al modo de "entrada" (insertar) para filtrar rápidamente la selección del búfer escribiendo algunas letras, o incluso presionar Tabpara abrir la lista de acciones para el elemento seleccionado actual (por ejemplo, para abrir el búfer por encima del activo actual) - en resumen, usted actúa de manera genérica "Unir".

(ver también :h unite_default_key_mappingsy ayuda de Unite en general).


Y ahora para el truco final (pero opcional). Con altercmd , puede crear su propio lscomando , habilitado por tabulación, (basado en la funcionalidad Unite anterior):

:command! LS Unite buffer_tab -no-split
:AlterCommand ls LS

... y cada vez que golpeas :ls, Vim realmente correrá tu comando.

Tenga en cuenta que tampoco necesitará :bno :bp, ya que la visualización y selección de los buffers de la pestaña ahora son el mismo comando.

VanLaser
fuente
Probaré esta solución también. Por el momento, intento probar ctrl-space mencionado por VanLaser en el comentario, lo cual es bastante bueno. Veré qué solución es la más conveniente. ¡También +1 para el complemento altercmd que es genial!
statox
2

No puedo comentar porque mi cuenta es nueva, lo siento, pero ++++ 1 para ctrl-space.

Me vendieron cuando llegué a la mitad de la ayuda. Ctrlspace tiene una estructura como esta:

workspaces --> contain tabs --> contain buffers

Por lo tanto, puede guardar un espacio de trabajo para cada proyecto en el que esté trabajando y luego cargarlo inmediatamente cuando lo desee. Esto significa que cada vez que cierre vim puede guardar todos sus búferes y divisiones de pestañas.

También puedes nombrar tus pestañas. Si eso no es suficiente, también puede cambiar fácilmente los directorios de trabajo y crear marcadores para los directorios que utiliza con frecuencia.

Se conecta muy bien con nerdtree si lo usa (aunque, sinceramente, probablemente ni siquiera sentirá que lo necesita después de una semana con ctrlspace)


Considere este caso de uso:

Tienes un proyecto Implica plantar árboles. Hay árboles frutales y árboles de dinero. Los árboles de dinero contienen dólares y centavos, mientras que los árboles frutales contienen manzanas y naranjas.

En este ejemplo, las manzanas, naranjas, dólares y centavos son "amortiguadores".

Ctrlspace le permite separar manzanas y naranjas en una "pestaña" que puede etiquetar como "fruta". Esta etiqueta aparecerá en la línea de etiqueta en la parte superior de su ventana. Del mismo modo, dólares y centavos van a la pestaña "dinero".

El espacio de trabajo "árboles" guarda toda esta configuración y le permite acceder a ella inmediatamente cada vez que abra vim.


Ahora que soy consciente de su existencia, realmente no puedo imaginar hacer un desarrollo orientado a objetos en vim sin este complemento. Por si acaso, aquí está el enlace: https://github.com/szw/vim-ctrlspace

Espinacas
fuente
2

Así que finalmente decidí crear mi propio complemento para resolver mi problema, está disponible en github .

Utilicé la idea de @ philolo1 e intenté completarla, en el momento en que escribo esta respuesta todavía es un trabajo en progreso.

EDITAR Ya no mantengo el complemento a medida que mi flujo de trabajo evolucionó y me di cuenta de que vincular los búferes a una pestaña agrega más problemas de los que resuelve.


El complemento une las memorias intermedias a las pestañas: cuando el usuario abre una memoria intermedia, se "almacena" automáticamente en la pestaña y no se puede acceder desde otra pestaña.

La instalación debe ser "amigable para el administrador de complementos" (al menos funciona bien con Vim-Plug and Vundle )

Algunas de las características principales son:

  • Manejar automáticamente la unión de buffers (el usuario puede abrirlos como lo hizo antes)
  • :NextBufy :PrevBufreemplazar :bny :bNmantener un estado constante de las pestañas
  • :ListBufpermite enumerar los búferes de manera similar a la :lsexcepción de que están separados en pestañas y un signo permite al usuario ver fácilmente en qué pestaña se encuentra actualmente.
  • :ChangeBuf aceptar un número de búfer o un nombre de búfer para cambiar de búfer y cambiar de pestaña automáticamente
  • El cierre de un búfer se realiza con :CloseBuf
  • Cerrar una pestaña se hace con :CloseTab

Para otras operaciones, el usuario debe poder usar las funciones integradas (como :tabopen,:tabnext , etc ...)

Para cada comando se proporcionan algunas asignaciones predeterminadas y se pueden deshabilitar fácilmente agregando let g:betterTabsVim_map_keys = 0a su.vimrc .

También intenté hacer un archivo de ayuda explícito (:h betterTabs.txt ): aún no está completo, pero los usuarios deberían encontrar el mínimo para usar el complemento.

Todavía tengo muchas pruebas que hacer para asegurarme de que el complemento no altere ningún comportamiento nativo.

Finalmente, si alguien quiere ayudar, siempre es posible crear problemas en la página de Github o crear solicitudes de extracción.

statox
fuente
1

Echa un vistazo a este complemento. Me parece que se adapta perfectamente a tus necesidades. https://github.com/szw/vim-ctrlspace

Alex T.
fuente
De hecho, VanLaser lo mencionó en los comentarios y no lo miré lo suficientemente cerca al principio, pero parece ser realmente bueno, lo he estado intentando durante unos días.
statox