Si bien no puedo negar que yo también luché con vi al principio, creo que se puede argumentar que vi es realmente muy simple de aprender. (Cuando comencé a usar Unix, la opción era vi o emacs, así que en el momento en que elegí ed, ed era un editor de líneas muy simple, que ya había aprendido al leer los primeros libros de texto de Unix). Uso vi diariamente, pero probablemente use solo un subconjunto muy pequeño de sus características.
Aquí hay un argumento para usar vi: vi existe en todos los sistemas, usa muy pocos recursos y puede usarse en conexiones inestables y lentas, donde otros editores pueden fallar o ser lentos e inutilizables. O en situaciones en las que el sistema no funciona, por lo que las teclas de flecha no se interpretan correctamente (por ejemplo, una configuración incorrecta de terminfo). Por lo tanto, vi se puede utilizar para reparar los archivos de configuración que conducen al problema, sin verse afectados por el problema.
Y aquí está cómo aprender un subconjunto útil de vi: Primero: deje de pensar en vi como un "editor" interactivo de terminal GUI, y véalo como un lenguaje de programación para manipular archivos de texto. Al principio, "vi" representaba el modo visual, y vi tiene una contraparte no visual ex, que es un buen lugar para comenzar. Escriba ex en el símbolo del sistema (usaré ¬ para representar el retorno):
$ ex¬
Entering Ex mode. Type "visual" to go to Normal mode.
:
Ahora presiona enter.
:¬
E749: empty buffer
:
Entonces, pongámosle algo. Escriba "a¬", y escriba una línea de texto, luego un punto en una línea por sí mismo:
:a¬
Hello World¬
.¬
:
Ese fue el comando agregar. Fácil, corto y mnemónico. Pero sería bueno ver qué hay en el búfer:
:%p¬
Hello World
:
Ese fue el comando de impresión, p, obviamente. El% es una abreviatura de rango de línea. Cada comando puede estar precedido por un número de línea o rango al que debe aplicarse el comando. % significa "todas las líneas". $ significa la última línea, y un punto significa la línea actual. Un número significa esa línea particular. Un rango se escribe n, my se puede sumar o restar un número, por lo que. + 1, $ - 1 significa desde la siguiente línea hasta la penúltima línea. Un comando que consta de solo un número de línea va a esa línea. Aquí está el pequeño subconjunto restante de comandos que uso:
:1i¬
this text is inserted before line 1.¬
.¬
:
:w /tmp/filename¬
"/tmp/filename" [New] 2L, 49C written
:
w escribe todas (o el rango elegido de) líneas en un archivo.
:1d¬
elimina la línea 1.
:.s/Hello/Hello,/¬
Hello, World
:.s/$/!/¬
Hello, World!
s sustituye una expresión regular. ¡Es bueno saber expresiones regulares!
:q¬
E37: No write since last change (add ! to override)
q se cierra. wq escribe y se cierra. q! se cierra sin escribir, y en una línea similar, w! fuerza una escritura en un archivo si es posible.
Ahora uno genial:
:p
Hello, World!
:.!tr a-z A-Z
:p
HELLO, WORLD!
! como un comando filtra las líneas en un comando de shell.
Y finalmente:
:vi¬
entra en modo VISUAL. No te dejes engañar. Parece un editor, pero sigue siendo solo una consola de programación interactiva. Solo tienes que mirar el búfer todo el tiempo y algunos comandos más. En modo visual a: muestra el indicador: del modo ex. Las teclas de flecha (si funcionan) se mueven, y si no lo hacen, entonces hjkl lo hace. h izquierda, j abajo, k arriba y l derecha. 0 se mueve al primer carácter y ^ (¡piense en expresiones regulares aquí!) Al primer carácter no espacial en la línea. $ (regex de nuevo!) se mueve al final de la línea. Mecanografía: 999¬ va a la línea 999, naturalmente, al igual que en el modo ex.
"i" ingresa al modo de inserción, que ahora se inserta en caracteres en lugar de líneas, y termina presionando escape en lugar de ".¬". "I" se inserta al principio, "a" después del carácter debajo del cursor y "A" después del final de la línea actual. Siempre presione escape cuando termine de escribir texto. "x" elimina el carácter debajo del cursor y "D" elimina del cursor al final de la línea. "Y" tira (copia) la línea actual y "P" la pega de nuevo. ": pu" hace lo mismo, pero puede ir precedido de un número de línea. ": ya" es el ex equivalente de "Y", y de nuevo, útil para aplicar a un rango de línea. Creo que también hay un comando de marca, pero admito que no lo recuerdo. No me lo pierdo
Lo anterior es lo que uso, y sé que probablemente no soy un usuario vi muy "eficiente". Por otro lado, uso la versatilidad de ex, por ejemplo, para editar archivos de configuración de script. ¿Necesita cambiar su nombre de host foo.bar.com a www.foobar.com en varios archivos conf?
for file in conf/*
do (echo "%s/foo.bar.com/www.foobar.com/" ; echo "wq") |ex $file ; done
Lo que intento decir es que creo que el problema con vi es que la gente lo considera un editor difícil. Todo lo que se necesita es cambiar un poco su mentalidad y verlo como un lenguaje de programación interactivo muy simple pero también muy poderoso. Tan poderoso que incluso con un subconjunto de los comandos disponibles, puede usarlo con gran efecto, no solo como editor, sino como una herramienta general con secuencias de comandos bien integrada con el resto de Unix. Dudo que nano haga todo esto, emacs ... tal vez.