¿Por qué los expertos de Vim prefieren los búferes en las tabs?

No entiendo los buffers Cuando abro 3 archivos en la misma pestaña y cierro mi ventana, en general me molesta saber que la próxima vez que abra uno de esos archivos me sorprenderá que haya extraños archivos de intercambio y me haya dado mensajes molestos. Pero una y otra vez leo que estas cosas son el nirvana de productividad que me estoy perdiendo y que las tabs fueron hechas para que los plebeyos las usen.

Así que le pregunto, el experto de Vim: ¿cuáles son las ventajas de usar almacenamientos intermedios en tabs? No veo cómo la diferencia podría ser profundamente diferente, pero me consideraría solo en el nivel principiante-intermedio en el funcionamiento de Vim. Is :ls :b# realmente mucho más rápido que gt around? Siento que debe ir más profundo que esto.

Como dijo ZyX en #vim, esta pregunta suena a “¿Por qué los expertos de Vim prefieren sabrosas en lugar de templadas?” .

Los “expertos de Vim” no prefieren los búferes en las tabs: usan búferes como los proxies de archivos y las páginas de tabs como espacios de trabajo. Los buffers y las páginas con tabs tienen diferentes propósitos, por lo que preferir uno al otro no tiene ningún sentido.

El problema con los buffers y las tabs es uno de confusión , causado por una combinación de hechos independientes.

  1. La mayoría de los editores de texto e IDE “modernos” usan una metáfora de tabs para representar los archivos cargados. Esa metáfora actúa como un sistema de información, le muestra al usuario qué archivos están abiertos y su estado, y como un dispositivo interactivo, le permite al usuario manipular (reordenar, seleccionar, cerrar …) los archivos abiertos. A pesar de sus muchas limitaciones, las tabs están en todas partes y la gente está acostumbrada a ellas y las espera en todas partes.

  2. Vim introdujo las páginas de tabs en 7.0 como una forma para que sus usuarios creen “espacios de trabajo” ad-hoc. Nada en sus características, sus opciones específicas, sus comandos específicos o sus secciones de :help sugieren que las páginas con tabs podrían o deberían usarse como archivos proxys.

    Nada, excepto el nombre y la apariencia de “páginas de tabs”, por supuesto, lo que lleva a mucha confusión.

  3. Sin :set hidden , que está deshabilitado por defecto y no es muy fácil de encontrar, Vim hace que sea imposible cambiar a otro buffer sin escribir el actual o abandonar sus cambios. Los nuevos usuarios, desconocedores de esa opción, no tienen más remedio que recurrir al uso intensivo de ventanas o a la función más cercana de “pestaña” que pueden encontrar: páginas con tabs.

La “página de tabs” es una desafortunada elección de nombre para esa función, especialmente en una era dominada por la idea de que leer documentación es una pérdida de tiempo.

En Vim, las páginas de tabs son una abstracción construida en la parte superior de las ventanas, que a su vez es una abstracción construida en la parte superior de los buffers. Cada nuevo nivel agrega características útiles pero restringe su flujo de trabajo.

La “forma de amortiguación”

Con un flujo de trabajo basado en búfer, los archivos con los que está trabajando se distribuyen a lo largo de una sola dimensión. Puede desplazarse por sus búferes, puede acceder a un búfer específico escribiendo parte de su nombre (con finalización) o su número, puede alternar entre búferes, puede orientarlos con bastante facilidad. Básicamente no hay fricción.

  1. Ocho buffers abiertos, solo uno visible:

    Ocho buffers abiertos

  2. Cambiar por número:

    Cambiar por número

  3. Cambiar por nombre:

    Cambiar por nombre

Los búferes son los archivos proxies de Vim. Si piensas en términos de archivos, piensas en términos de almacenamientos intermedios.

El “camino de la ventana”

Con un flujo de trabajo basado en ventanas, sus “archivos” se distribuyen a lo largo de la misma dimensión “virtual” como lo harían si solo utilizara búferes y otras dos dimensiones “físicas”. Pero los espacios cartesianos en los que se encuentran esas dimensiones están casi completamente separados: moverse a otro buffer aún significa “mover a otro archivo”, pero pasar a otra ventana no. El búfer que corresponde al archivo deseado puede mostrarse en esa ventana, pero también podría mostrarse en otro, tal vez en otra página de tabs, o no aparecer en absoluto.

Con Windows, navegar entre archivos abiertos se vuelve demasiado complejo o demasiado simplista, incluso con 'switchbuf' y :sb . Sobre todo porque se ven obligados a utilizar dos conjuntos de comandos para lo que es esencialmente lo mismo: acceder a un búfer.

Windows tiene su uso, como se describe a continuación, pero no tienen lo necesario para reemplazar los almacenamientos intermedios en el flujo de trabajo de cualquier persona.

Aquí estoy trabajando en un esquema de colores de Vim. Las dos ventanas son vistas diferentes del mismo buffer: el superior sirve como referencia, con una tabla de los códigos de color utilizados en el esquema de colores, y el de abajo es donde trabajo:

Trabajando en un esquema de colores

Windows no está diseñado como proxies de archivos y no puede convertirse en uno: son “contenedores” o “viewports” diseñados para ofrecerle una vista en un búfer. Ni mas ni menos.

La “forma de tabulación”

Con un flujo de trabajo basado en tabs, esencialmente intentas imitar la experiencia del usuario al que estás acostumbrado desde tu editor anterior a la vez que ignoras por completo la naturaleza misma de las tabs de Vim. Si olvidamos por un momento que esta estrategia generalmente es muy improductiva, también es imposible, al igual que con Windows, forzar a Vim a adherirse al paradigma de “un archivo = una sola pestaña” sin perder mucha flexibilidad.

Aún trabajando con los mismos archivos que arriba, la tabline ocupa un espacio significativo para prácticamente ningún beneficio. Todos mis archivos y todas mis tabs se llaman javascript*.vim así que no puedo hacer 3gt y estoy seguro de que terminaré en el lugar correcto y es imposible llegar a una pestaña específica por nombre. Agregue a eso el hecho de que su etiqueta puede ser muy poco útil pero perfectamente lógica [Quickfix List] … Dado que no hay una forma práctica de vincular un archivo / buffer a una página de tabs, básicamente queda solo con una forma práctica de navegar entre las páginas de tabs / búferes / archivos: ciclismo.

Y sí, mi tabline está carcomida con solo 8 tabs, ¡imagínense si tuviera 20!

  1. Ocho buffers abiertos en ocho páginas con tabs (incorrecto)

    Incorrecto

  2. Dos tabs para dos tareas específicas (derecha)

    Derecha

Las páginas con tabs son “contenedores” o “ventanas” diseñadas para contener una o más ventanas, que también son “contenedores” diseñados para contener almacenamientos intermedios.

En conclusión

Los “expertos de Vim” (supongamos que puedo hablar como si fuera uno) no prefieren los búferes en las tabs: simplemente usan Vim como fue diseñado y se sienten perfectamente cómodos con ese diseño:

  • Los “expertos de Vim” tienen 2, 30 o 97 búferes cargados y están muy contentos de no tener que lidiar con la distribución espacial;

  • cuando necesitan comparar dos archivos o trabajar en una parte del búfer en uso mientras guardan otra como referencia, los “expertos de Vim” usan ventanas porque así es como deben ser utilizadas;

  • cuando necesitan trabajar durante un tiempo en una parte separada del proyecto sin jugar con su vista actual, los “expertos de Vim” cargan una nueva página de tabs.

Solía ​​mantener cada buffer en una pestaña separada, pero me cansé de constantemente gt y gT-ing por todas partes.

También sentí que los buffers eran demasiado difíciles de manejar.

Aquí hay algunas técnicas que cambiaron por completo mi opinión anterior:

  • gestión de búfer: b. Te vuelves sorprendentemente rápido en esto. Ver vim, cambiar entre archivos rápidamente usando vanim Vim (sin complementos)
  • Listas de Saltar / Cambiar (ctrl o / i y g;)
  • Archivo alternativo (^)
  • El complemento de tpope está dañado: https://github.com/tpope/vim-unimpaird . Vuela entre las diferentes listas de almacenamiento intermedio con asignaciones.

Aquí está mi flujo de trabajo típico:

  • Abra vim y use edit (generalmente con una expresión regular) para abrir un buffer
  • Darse cuenta de que necesito abrir otro archivo. Use “editar” para eso también. Si quiero alternar entre este búfer y el búfer abierto actualmente, usaré “sp” o “vsp” para abrirlo en una ventana separada.
  • Repita hasta que tenga los 3-5 archivos que cambiaré entre usar las técnicas en la lista con viñetas anterior para volar entre sus búferes.
  • Si quiero “comenzar de nuevo” con mis búferes, simplemente cierre vim y vuelva a abrir.

Sentí que después de una semana más o menos de forzar estos nuevos patrones, se volvió mucho más fácil visualizar qué buffers tenía abiertos, y cómo llegar a cualquiera de ellos con solo unos pocos golpes automáticos.

La desventaja de las tabs es que solo puedes ver los contenidos de uno en uno. Entonces, si los usa como en un navegador, está perdiendo la oportunidad de ver varios almacenamientos intermedios uno al lado del otro, o incluso de ver partes separadas del mismo archivo en divisiones. Por lo tanto, muchos recomiendan usar tabs solo para segregar diferentes espacios de trabajo (por ejemplo, tener uno para un proyecto Java, otro para una lista de tareas pendientes, y un tercero para hackear un script en el lateral).

Los problemas que describes hacen parecer que estás usando Vim incorrectamente. O tiene (principalmente) una única instancia dedicada. Entonces, los búferes que se ocultan simplemente “reaparecerán” si los reeditamos (y ahora puede usar la lista de búfer para recuperarlos), y no habrá mensajes de intercambio de archivos. O bien, utilice instancias de Vim separadas por sesión de proyecto / archivo / edición, pero luego conviértalo en un hábito de completo :quit cada instancia cuando haya terminado con el archivo.

Otro consejo, cuando usa el nombre del buffer como argumento para: buffer, no tiene que especificar el nombre completo. Sin embargo, si más de un búfer coincide con el argumento dado, entonces los búferes no serán cambiados.

Se puede usar cualquier fragmento del nombre del búfer para hacer coincidir. Por ejemplo, si tiene los buffers queue_manager.java y queue_manager.java entonces :buffer que matches o: b que` ambos, pero cambiará a queue_manager.java como coincide al principio.

Utilizo tabs, CtrlP y Vim sesiones en mi flujo de trabajo y tengo desde hace más de un año:

  • Tengo ) y ( mapeado para “ir a la siguiente pestaña” y “ir a la pestaña anterior” respectivamente. T n abre una nueva pestaña. También uso tabm para ayudar a mantener las cosas organizadas.

  • Uso las sesiones de Vim para grupos de archivos relacionados con la historia / error actual en el que estoy trabajando, generalmente por categoría. Estas sesiones se sobrescriben durante el transcurso del proceso.

  • Todavía tengo que encontrar algo mejor que CtrlP , pero lleva un poco procesar todos los archivos para encontrar.

.vimrc a su .vimrc y comience a adorar buffers:

 :nnoremap  :n :nnoremap  :N 

De esta forma, puede avanzar o retroceder en ciclo en modo normal a través de la pestaña Tab / Shift .

Cargar los búferes “seleccionados” como tabs para rápidamente (TAB / S-TAB) alternar entre ellos. El marco de espacios de trabajo se ajusta aquí, ya que para mí, las tabs de VS son, en su mayoría, lo que se refiere a la visibilidad. Puedo mostrar archivos importantes / de trabajo en ventanas y tabs y esconder los que no necesito utilizar en el fondo sobre la marcha sin tener que recordar rutas o tomarme el tiempo para buscarlos y cargarlos una vez que surja la necesidad. Esto permite manejar varias tareas o proyectos en una sesión VIM, supongo que esto solía ser importante en máquinas con poca memoria, pero también es bueno para concentrar todas las tareas de edición en un marco de aplicación. También tengo atajos de desplazamiento de búfer establecidos en Ctrl-Derecha / Izquierda para poder desplazarme rápidamente a través de varios búferes también.

En pocas palabras, uno solo puede dividirse en algunas ventanas para sus usos tanto como el estado de la pantalla, pero uno puede mantener múltiples configuraciones de Windows en varias tabs expandiendo así el espacio de trabajo y mejorando el flujo de trabajo permitiendo la división conveniente de tareas complicadas que giran más de un archivo .

Para los archivos de intercambio, puede decirle a VIM que los mantenga a todos en una carpeta de su designación. Para este uso :set directory .