¿Qué hace: abrir hacer en vim?

18

La documentación de Vim tiene esto que decir sobre el :opencomando:

This command is in Vi, but Vim only simulates it:

                                                        *:o* *:op* *:open*
:[range]o[pen]                      Works like |:visual|: end Ex mode.
                                {Vi: start editing in open mode}

:[range]o[pen] /pattern/    As above, additionally move the cursor to the
                                column where "pattern" matches in the cursor
                                line.

Vim does not support open mode, since it's not really useful.  For those
situations where ":open" would start open mode Vim will leave Ex mode, which
allows executing the same commands, but updates the whole screen instead of
only one line.

No comenta sobre la naturaleza de la "simulación", y por qué esto se considera una simulación en lugar de un comando real con un comportamiento diferente. Cuando se ejecuta desde el modo ex (Q), de hecho se comporta como se describe.

Sin embargo, también parece haber un comando de apertura diferente. Cuando se ejecuta desde la línea de comando normal, o desde el modo ex con diferentes argumentos, parece ser un sinónimo de :edit. Cuando se ejecuta desde el modo de comando con a /pattern/, posiciona el cursor y aparentemente se ejecuta :edit(con la posición del cursor solo evidente si: la edición falla). También se puede ejecutar como :open /pattern/ file, que posiciona el cursor y se ejecuta:edit file

Mi pregunta es: ¿Por qué esto no está documentado? ¿Hay alguna diferencia con respecto a :editeso que no estoy notando? ¿ :openAlguna vez fue sinónimo :edity solo cambió más tarde en un intento de cumplir a medias con POSIX?

Aleatorio832
fuente

Respuestas:

13

El "modo abierto" de vi fue útil para terminales que tenían una sola línea, como las terminales de copia impresa. En modo abierto, vi tenía una "vista de una sola línea" del archivo. Mover el cursor redibujaría toda la línea y los caracteres eliminados se imprimirían de manera diferente.

La "simulación" que hace vim es simplemente apoyar el comando, haciéndolo actuar (como dice la documentación) como :visualy como :visuales "de otra manera igual que :edit", probablemente es por eso que lo ves actuando así :edit.

Desde la perspectiva del código fuente, :opense implementa en ex_docmd.c( ex_open()). Hace algunas cosas para tratar el caso en el que se le proporciona una expresión regular, pero siempre termina con una llamada a do_exedit().

La implementación de :edit, :baddy :visualestá contenida en la ex_edit()función en el mismo archivo, y esa función es una llamada directa a do_exedit()(nada más). Por lo tanto, aparte de cuando se maneja el parámetro de expresión regular, se llama al mismo código. do_exedit()es un poco complicado, y su comportamiento se modifica en gran medida en función del comando real que se emitió, pero nunca comprueba explícitamente los tokens de comando para abrir / editar / visual. Por lo tanto, los tres comandos dan como resultado que se ejecute más o menos el mismo código do_exedit().


fuente
8

De una introducción a la edición de pantallas con Vi :

Si está en un terminal de copia impresa o un terminal que no tiene un cursor que se puede mover de la línea inferior, aún puede usar el conjunto de comandos de vi, pero en un modo diferente. Cuando le das un comando vi, el editor te dirá que está usando el modo abierto. Este nombre proviene del comando open en ex, que se usa para ingresar al mismo modo.

La única diferencia entre el modo visual y el modo abierto es la forma en que se muestra el texto.

En modo abierto, el editor utiliza una ventana de una sola línea en el archivo, y al retroceder y avanzar en el archivo, se muestran nuevas líneas, siempre debajo de la línea actual. Dos comandos de vi funcionan de manera diferente en abierto: z y ^ R. El comando z no toma parámetros, sino que dibuja una ventana de contexto alrededor de la línea actual y luego lo regresa a la línea actual.

Si está en un terminal de copia impresa, el comando ^ R volverá a escribir la línea actual. En tales terminales, el editor normalmente usa dos líneas para representar la línea actual. La primera línea es una copia de la línea cuando comenzó a editarla, y trabaja en la línea debajo de esta línea. Cuando eliminas caracteres, el editor teclea varios \ 's para mostrarte los caracteres que se eliminan. El editor también vuelve a imprimir la línea actual poco después de dichos cambios para que pueda ver cómo se ve la línea nuevamente.

A veces es útil usar este modo en terminales muy lentos que pueden soportar vi en el modo de pantalla completa. Puede hacer esto ingresando ex y usando un comando abierto.

:openes un artefacto del origen de Vim como un clon Vi que es completamente inútil hoy en día. Solo puedo suponer que permanece allí por compatibilidad POSIX.

A pesar de vagas similitudes, no:open es una alternativa a cualquier tramo de la imaginación.:edit

romainl
fuente