¿El modo Ex tiene algún uso práctico?

115

Vim tiene un modo Ex que se puede ingresar ingresando Q, y un modo de línea de comando con el que se puede ingresar q:. Una queja común entre los nuevos usuarios de vim es que ingresan a estos modos accidentalmente cuando intentan salir de vim. Como tal, desactivo estas teclas en mi ~/.vimrcpara evitar golpearlas accidentalmente (particularmente q:):

map q: <Nop>
nnoremap Q <nop>

Aunque he leído la documentación de vim en Ex , soy un usuario de Vim con experiencia moderada y entiendo la idea básica detrás de ello, todavía me cuesta encontrarle algún uso en mi uso diario de vim. En general, parece menos útil que simplemente ingresar un comando de línea de comando vim estándar con el prefijo :, ya que los cambios no se repiten de inmediato.

¿Ex tiene algún uso práctico diario en Vim moderno? ¿Hay algo que sea más fácil de hacer en modo Ex que con los comandos estándar? ¿Cuál es la diferencia entre el modo de línea de comando y el modo ex?

Andrew Ferrier
fuente
13
Qy q:son bastante diferentes Solo te refieres a la Qderecha?
jamessan
@jamessan, en realidad, resulta que no estaba seguro ... tienes razón, parecen hacer cosas diferentes, aunque supuse que básicamente eran lo mismo. Si responde a esta pregunta, podría ayudar aclarar allí, ya que obviamente estoy confundido.
Andrew Ferrier
Esta pregunta se está discutiendo en Meta .
200_success
1
@AndrewFerrier Usted preguntó q:específicamente, y lo mencionó como, entre las dos secuencias clave, con la que tiene más problemas. Y dos de las respuestas aquí pueden ser útiles para las personas que lo están buscando con el término correcto.
Random832
44
Cuando aprenda qué q/y qué q:hacer, probablemente los considerará algunos de los comandos más útiles en Vim. Y sí, ya sabes cómo usarlos, simplemente aún no sabes lo que hacen. Mira este screencast para averiguarlo.
Sato Katsura

Respuestas:

81

Qes, como encontraste, el modo ex. No es del todo útil usar de forma interactiva, pero existe porque Vim se puede usar para emular el viejo exbinario. De hecho, muchos sistemas proporcionan el excomando simplemente simblinándolo vim.

q:o :<C-f>, en su lugar, proporciona una forma de examinar el historial de la línea de comandos y editarlo como un búfer normal. Esto facilita encontrar un comando anterior que ejecutó, editarlo con los comandos normales de Vim y luego ejecutar el comando modificado. Los comandos q/y q?existen para proporcionar la misma funcionalidad para el historial de búsqueda.

jamessan
fuente
64

Vim en modo Ex es útil cuando:

  • Necesita editar archivos (múltiples) de forma no interactiva (como parte del script).
  • Su conexión es muy lenta o la pantalla no se actualiza después de sus acciones.
  • Las asignaciones y abreviaturas están deshabilitadas.
  • Las claves comunes como Escapeo Controlno funcionan correctamente.

Básicamente vies el modo visual, por lo extanto, el modo Vim Ex es solo una emulación de ex(todavía ejecutan el mismo código), por lo que es posible acceder al modo de comando exdesde dentro de vi y viceversa. En realidad, hay dos modos: modo Ex ( vim -e) y modo Ex mejorado que permite comandos más avanzados que el modo Ex compatible con vi ( vim -E). Ver: ¿Cuál es la diferencia entre el modo Ex y el modo Ex mejorado?

Ex es la raíz de una familia de editores: edit, exy vi. Ex es un superconjunto de ed, con la extensión más notable que es una instalación de edición de pantalla. ex (1)

Editar archivos de forma no interactiva es el uso más común y las personas lo usan de manera similar sedy awk, sin embargo, están más orientados a la transmisión: solo leen el archivo hacia adelante de principio a fin (no están diseñados para trabajar con varias líneas ) mientras vimestá orientado al búfer: puede avanzar y retroceder en el archivo a su gusto, lo que lo hace tan poderoso.

Básicamente:

sedes un S TREAM ED itor, no un editor de archivos.

Sin embargo, la gente parece abusar de él por tratar de editar archivos y la verdad es que no edita archivos. En segundo lugar, sus opciones como in-place ( -i) son extensiones de FreeBSD no estándar y pueden no estar disponibles en otros sistemas operativos. Por lo tanto, si desea evitar el código no portable, la sobrecarga de E / S y los efectos secundarios negativos (como destruir enlaces simbólicos), debe usar excuál es el editor estándar basado en comandos de UNIX (junto con ed) BashFAQ .


Otras cosas que encuentro útiles en el modo Ex es usarlo como un patio de juegos (similar a la pythonconsola) donde puede ejecutar muchos comandos seguidos, trabajar / depurar expresiones regulares, verificar la configuración de vim, ejecutar comandos externos o trabajar con registros, etc. .

Por ejemplo:

let @d = '<td></td>'
let @r = '<tr>' . repeat(@d, 5) . '</tr>'
echo @r
let @t = '<table>' . repeat(@r, 5) . '</table>'
reg

que es más fácil en el modo Ex que en el modo normal (donde solo puede ver su último comando).


Usos practicos

Tengo los siguientes alias en mi .bash_aliases:

alias trim="ex +'bufdo!%s/\s\+$//e' -scxa"
alias retab="ex +'set ts=2' +'bufdo retab' -scxa"

Nota: El uso bufdono es exun método compatible con POSIX (según el manual ), por lo que puede considerar usarlo en su findlugar. El !se utiliza para forzar el cambio de las memorias intermedias sin guardar (de lo contrario, se genera una advertencia).

El primero que estoy usando para recortar los espacios finales en todos mis archivos fuente, por ejemplo:

trim **/*.php

El segundo convierte todas las pestañas en espacios (recursivamente), por ejemplo:

retab **/*.php

Para mí, usar retabes suficiente, pero hay algunas desventajas descritas aquí . Agregue extra -Vpara aumentar la producción de verbosidad.

Tenga en cuenta que los ejemplos anteriores usan zsh / bash4 globbing ( **), así que asegúrese de que su shell lo admita y esté habilitado.

Para ver ejemplos más prácticos (como analizar archivos html), consulte:

También aprenda más sobre el modo Ex en:

kenorb
fuente
¿Puede usted por favor puesto un ejemplo de la "edición (múltiple) archivos de forma no interactiva" operación que es más fácil de lograr con exlo que es con ed, sedo awk?
Sato Katsura
1
@SatoKatsura Se agregaron dos usos prácticos que tratan con múltiples archivos.
kenorb
He estado buscando en la documentación para comprender mejor el exmodo. No entiendo por qué tienes un bang ( !) en tu comando de trimalias bufdo. ¿No abandonará eso todos los cambios en todos los archivos excepto el último? ¿Si no, porque no?
Comodín el
@Wildcard Sin !básicamente no funcionará, ya que cada vez que se cambia el búfer, exse queja de los cambios no guardados (y estamos guardando los cambios al final con xa). La advertencia se puede deshabilitar, pero es mucho más fácil de agregar !.
kenorb
Ya veo ... supongo que estoy leyendo mal la documentación, entonces; especifica que sin el !comando fallará si el búfer no se puede abandonar, pero no especifica explícitamente que !hará que el búfer no se descarte ... Entonces, "abandonado" en este caso significa "descartado" , porque no contiene nada no escrito en el disco "? ¿O que? (Estoy mirando :help bufdo)
Comodín
18

Raramente uso el modo ex, pero cuando lo necesito estoy agradecido por su existencia.

A veces accedo a los sistemas a través de ssh a través de VPN, y estas conexiones a veces pueden ser lentas. Para empeorar el problema, a veces necesito editar un archivo en el lado remoto que, además de estar detrás de ssh y VPN, está sobre una conexión en serie lenta (por lo tanto, 9600 baudios más mucha latencia de red).

En momentos como este, tener retroalimentación visual y actualizaciones de pantalla se vuelve más un obstáculo porque lo que veo se retrasa (el efecto es como hablar por un micrófono pero con parlantes lejos, como en un estadio deportivo. Las acciones de uno se vuelven entrecortadas). y a veces confundido debido a la retroalimentación tardía).

En este caso, hacer que los cambios no se repitan es una ventaja útil, ya que puedo hacer más en menos tiempo cuando no estoy esperando que la pantalla se actualice.

Cuando termine de hacer las ediciones, vuelvo al modo visual para una actualización de pantalla única para revisar mi trabajo. Luego puedo volver al modo ex o guardar porque he terminado.

John O'M.
fuente
13

La ventana de línea de comandos es útil para escribir comandos largos y complicados. Dado que el historial de comandos se abre como una ventana, puede usar cualquier comando de vim navigation o edición / mapeo.

Supongamos que desea editar un comando de sustitución largo que ejecutó una vez, pero cometió un error:

:%165,177s:here is a whole bunch of text I wnat to replace:here is the replacement:c

Para cambiar la cadena de búsqueda, no puede usar movimientos vim como ben la línea Ex para navegar (aunque creo que hay asignaciones clave para esta navegación). En cambio, la mayoría de las personas presionarían la tecla de flecha izquierda varias veces.

Una mejor manera: presione q:para ir a la ventana de la línea de comandos, kpara avanzar hasta el último comando y navegar con movimientos normales a la parte del comando que desea cambiar. ¿Quieres cambiar una palabra completa, no hay problema: ciw.

bsmith89
fuente
OK gracias. ¿Estás seguro de que q: es la línea de comandos Ex? La ayuda solo usa la frase "Ex" para el modo que aparece Q, pero eso no es compatible con la edición estándar de vim a la que se refiere, solo lo q:hace, que la ayuda simplemente llama 'Modo de línea de comando'. Sé que confundí a los dos al principio, pero probablemente deberíamos asegurarnos de tener clara la distinción aquí.
Andrew Ferrier
1
Busqué :help q:antes de decidir usar esa frase, pero podría estar confundido acerca de la terminología.
bsmith89
1
También me ha confundido esta terminología. Por lo general, hablo de escribir un comando Ex como algo que sigue :, pero podría estar usando eso incorrectamente.
bsmith89
3
El contenido de su respuesta es correcto, pero la forma en que usa la terminología es (para mí) un poco confusa. Creo que estás interpretando la documentación un poco mal. q:no abre una línea de comando Ex. Abre la ventana del historial de comandos , en la que se pueden editar los comandos Ex actuales y anteriores. La línea de comando Ex es lo que obtienes cuando presionas :en modo Normal.
Rico
3
FWIW Creo que la documentación de Vim también está un poco confundida, ya que en algunos lugares se refiere a todos los :comandos como comandos 'Ex'. En mi humilde opinión, solo los comandos que están realmente disponibles en Ex deben considerarse comandos Ex.
Rico
6

Una persona con visión parcial me dijo que se está quedando ciego que está cambiando a ex, así que ese es un uso. Yo mismo soy considerablemente mayor que vi, y cambié de ed a ex hace mucho tiempo (sí, lo sé, "ed es el editor estándar"). Lo único que hago en modo vi es un% de rebote para que coincidan los parens cuando escribo el código Lisp.

John Cowan
fuente
Me recuerda a esta entrevista . Sin exembargo , no recuerdo si se mencionó específicamente.
Martin Tournoij 01 de
Excelente visión, nunca hubiera pensado en esto. Muchas gracias, gran respuesta.
Andrew Ferrier
2

Además de los usos ya mencionados aquí, ex también es una forma de editar archivos en la consola de Linux si se encuentra en la plataforma S / 390 y la consola está orientada a la línea en lugar de a la pantalla.

Thomas
fuente
0

¿El modo Ex tiene algún uso práctico?

Probablemente no. Sin embargo, aunque ingresar al modo Ex no es realmente útil, aprender los comandos Ex sigue siendo útil, particularmente porque usa comandos de edición ex con :g/comandos globales para operar en líneas coincidentes.

Lie Ryan
fuente
-1

El "ex" original era la versión mejorada del editor de texto "ed" en Unix. En 2BSD se agregó un modo visual y el nuevo editor se llamó "vi".

Si uno quiere usar la línea de comando ex, cambiará al modo de comando con la tecla ":". Entonces, en mi mejor entendimiento, ex no está allí para la nostalgia, es la parte para proporcionar el modo de comando.

También puede ingresar a su modo de inserción al

 :i 

luego presione "enter y escriba su texto. Salga con ^ c. O escríbalo todo en una línea de comando, como

 :i my multiline text \with a second line.^c
if2
fuente
1
Dado que el modo Ex no es exactamente lo mismo que el modo de línea de comandos , esto no parece responder a la pregunta. Y como nota adicional: el modo comando es un sinónimo desafortunado para el modo Normal, no para el modo de línea de comandos.
8bittree
Se tomó el punto "Modo de comando". Solo excusa, cuando cambiamos a vi la nueva adición, fuimos introducidos como "visual" (no el modo visual actual vim) en lugar de "comando" - ahora ex. Por otro lado, la línea de comandos parece invocar el mismo do_cmdline () que ex. No es que sugiera ningún "uso práctico", lo admito.
if2