Regreso a Vim después de usar Emacs durante algunos años. Estoy tratando de asimilar a Vim leyendo y viendo tutoriales, además de usarlo a diario.
Al editar texto, encuentro que los comandos Emacs de Alt-F, Alt-B, Ctrl-a, Ctrl-e, Alt-D y Alt-Backspace son muy útiles e intuitivos, permitiendo ediciones locales rápidas y fáciles mientras se trabaja con texto (palabras / código).
¿Cuál es la forma Vim de implementar una funcionalidad similar? Regresar al NORMAL
modo para emitir un solo movimiento, solo para volver a ingresar al INSERT
modo no es óptimo.
Ejemplo 1: cuando INSERT
esté en modo para insertar un (
al comienzo de una expresión, ¿cómo debo moverme al final de la expresión o la línea para insertar el correspondiente )
en Vim?
Ejemplo 2: Al editar texto, a menudo es posible que desee eliminar una palabra hacia adelante o hacia atrás mientras escribe o edita una oración o código. Sería inusual tener una oración / código perfectamente formado en la mente de uno, listo para escribir "una vez" antes de tiempo; a menudo una oración cambia a medida que se trabaja con el texto. Las restricciones de INSERT
modo me dificultan este tipo de edición en Vim. Me siento incapaz de manipular eficazmente el texto en modo de inserción, siempre me encuentro teniendo que volver al NORMAL
modo para movimientos simples o eliminar palabras.
PS: Alt-F y -B mueven el cursor hacia adelante o hacia atrás una palabra. Ctrl-a y -e mueven el cursor al inicio o al final de la línea. Alt-F elimina la palabra debajo del cursor. Alt-Retroceso elimina la palabra antes del cursor.
fuente
vim
edición, pasa la mayor parte del tiempo en modo normal, no en modo de inserción.Respuestas:
1
Puede lograr esas o mejores asignaciones de comandos (meñique) muy rápidamente. No recomiendo esta solución, pero como ejemplo, si desea mover el cursor al comienzo de la línea
<C-a>
, puede ejecutar la siguiente línea después de presionar:
desde el modo normal (o agregar la línea a su vimrc)o, si el inicio de la línea significa el primer carácter de línea no en blanco
Curiosamente, acabo de probar estas asignaciones en el búfer en el que estoy escribiendo esta respuesta, y me confundí por un momento porque no funcionaron. Entonces me di cuenta de que había olvidado ingresar al modo de inserción. Parece que le resulta difícil abandonar el modo de inserción para ejecutar comandos de modo normal. Después de usar Vim durante un tiempo, es posible que sea al revés, que permanezca en modo normal mientras piensa y solo realice excursiones para insertar el modo en ocasiones particulares. Vim es probable que sólo (o sobre todo) vale la pena aprender si usted encuentra que usted más la edición de escribir texto.
Entonces, una parte de una respuesta a su pregunta sobre la ejecución rápida de comandos de modo normal desde el modo de inserción es
<C-o>
, que le permite abandonar el modo de inserción temporalmente para ejecutar un comando de modo normal, luego volver a ingresar. Lea sobre esto en:help i_Ctrl-o
. Esto es útil para conveniencias únicas. Una ruta más sostenible probablemente sea tratar de adoptar el modo normal como predeterminado para la navegación y la edición, y solo ingresar al modo de inserción cuando realmente desee insertar nuevos caracteres a mano en el búfer.2
Sus ejemplos son muy generales, por lo que es difícil dar respuestas específicas. Voy a inventar un ejemplo específico con la esperanza de que se ajuste o sea traducible a algo que encuentres. Para su número 1, depende de cómo sepa dónde debe ir el paréntesis de cierre. digamos que tengo una línea como
Está destinado a ser una línea de VimL, el lenguaje de scripting de vim, y (o algo así) ocurre en un archivo de sintaxis de Vim con el que actualmente no estoy de acuerdo. Digamos que quiero cambiar la parte derecha de esta expresión a una llamada de función, tal vez porque la función proporciona valores predeterminados cuando el diccionario
s:cchar
aún no tiene asignado un valor para la"atx"
clave. Con mi cursor (en modo normal) en el primer carácter, 'l', podría escribirBrevemente, esto dice
f=
- Reenviar a '=' (podría haber dichofs
, pero probablemente no me detendría el tiempo suficiente para ver que la 's' que quiero alcanzar es la primera s en la línea, así que iría por el personaje que es obviamente único, y continuar desde allí)w
- siguiente palabra, ahora mi cursor está en la 's' de 's: cchar'cf[
- cambiar para reenviar a '['en este punto la línea se ve como
donde
|
está el cursor, y estoy en modo de inserción. Luego escriboMyFunction(
y salgo del modo de inserción (<Esc>
).$
- mover el cursor al final de la línea. Podría haberlo utilizadoE
para el final de la gran palabra of]
para reenviar a ']' o alguna otra moción, pero$
se me ocurrió primero.r)
- reemplace el carácter debajo del cursor con un ')'Ahora he cambiado la expresión de asignación de asignar de un diccionario local de script a usar el valor de retorno de una función, y al hacerlo introduje paréntesis. No sé cómo se ve su necesidad particular de paréntesis, tal vez es muy diferente, en cuyo caso habrá una serie diferente de comandos para lograrlo. Si me detuviera a pensar más sobre mi ejemplo inventado, también podría encontrar formas más eficientes de lograrlo, pero quién tiene tiempo para detenerse y pensar.
(Inténtelo, copie y pegue (lo siento, tire y ponga) el texto y el comando en un búfer, y con el cursor en el primer carácter, 'f', del comando pulsado
y$
. Ahora el comando está en su registro sin nombre. Muévase al comienzo de la primera línea y presione:normal <C-r>"
a) ingrese al modo de línea de comando, b) comience a ejecutar un comando de modo normal desde la línea de comando yc) pegue ( atchoo put) el registro sin nombre en la línea de comando como normal comando de modo a ejecutar. Lo único que necesita cambiar en el comando es reemplazar la<Esc>
serie falsa de caracteres (porque copió y pegó atchoo desde su navegador) con el código de la tecla Escape real, así que elimínelo y presione<C-v>
y luego su tecla Esc. Se verá algo así como^[
. Ahora presiona regresar para ejecutar el comando. O ... simplemente escriba la cadena de teclas para probar los comandos, solo quería mostrarle que también puede interactuar con el modo normal desde el modo cmdline, y<C-v>
, y<C-r>
, y todas las otras glorias de Wonderland. Además, ver:help Cmdline-mode
.)3
Para eliminar una palabra al revés, puede usar la asignación estándar
<C-w>
(ver:help i_Ctrl-w
). No sé si hay una asignación predeterminada para eliminar una palabra hacia adelante, pero supongo que podría hacer una conNuevamente, lo
<C-o>
sacará del modo de inserción para un comando único ydw
"eliminará" sobre el movimiento de "palabra". Ver:help d
,:help w
. Si las palabras de reenvío que elimina no son palabras reales sino nombres de class.function #, es posible que desee utilizarW
(ver:help W
). Si ya está principalmente en modo normal, no necesita estas asignaciones, solo sídw
,db
o amigos.Algunos capítulos de ayuda para ver más de cerca
:help <C-o>
:help Insert
:help f
y las siguientes secciones (F
,t
,T
,;
y,
):help word-motions
fuente
Para responder a su pregunta sobre ediciones locales: si está en modo de inserción y presiona
ctrl-O
, hará el siguiente comando en modo de inserción. Puede ser útil si decides borrar la línea. Hay algunos otros comandos en modo de inserción para cosas pequeñas, como pegar desde el registro y autocompletar palabras. Puedes leerlos todos con:h ins-special-keys
.A menudo hay una mejor manera de hacer las cosas en modo normal. Por ejemplo, supongamos que desea rodear una expresión entre paréntesis. Algunas cosas que puede hacer son
i(<end>)
,i(<esc>A)
,c$()<esc>P
. * Mi cosa favorita implica tener uno de los "necesario" vim plugins, vim-envolvente . Con vim-surround, es justoys$)
. Lo bueno de todo esto es que una vez que sabes cómo hacerlo en una situación, puedes hacerlo en todas las situaciones similares. ¿Qué pasa si en lugar de agregar paréntesis al final de la línea, son solo tres palabras? Puedes usarc3w()<esc>P
oys3w)
. ¿Qué pasa con toda la línea?cc()<esc>P
oyss)
.Una cosa que ayuda mucho es agregar
inoremap jk <esc>
a su vimrc. Luego puede salir del modo de inserción presionando jk. Esto elimina la mayor parte de la sobrecarga de salir del modo de inserción para que puedajk<sequenceofcommands>i
hacer comandos sin interrumpir su escritura.fuente
:h ins-special-keys
, echa un vistazo a:h ins-special-special
más asignaciones.Los comandos equivalentes en modo normal son
w
,b
,^
,$
,dw
,db
. Tenga en cuenta la lógica:dw
elimina lo que está cubiertow
ydb
elimina lo que está cubiertob
. ¿Qué comando usarías para eliminar lo que está cubierto^
? ¿O para tirar de él?Esa lógica de lenguaje es el punto central de la edición modal; Puede tomar algún tiempo adaptarse a él, pero no hay cambio de sentido.
Los comandos equivalentes en el modo de inserción son:
<C-Right>
,<C-Left>
,<Home>
,<End>
,<C-w>
y ... nada más que se puede crear una asignación simple:inoremap <C-something> <C-o>dw
.En efecto. El enfoque correcto es ingresar al modo de inserción para insertar la menor cantidad de texto posible y volver al modo normal lo antes posible.
Como en cualquier editor de texto o IDE o procesador de texto o
<textarea>
:Nuevamente, el modo de inserción es para insertar texto. Se supone que "manipular texto" y moverse se produce en modo normal.
Por favor haga preguntas más precisas.
fuente
End
las teclas de flecha o) en elINSERT
modo?Bueno, uno puede decir que Vim-way es no permanecer en modo INSERT. El momento esclarecedor en Vim llega cuando te das cuenta de que no necesitas permanecer en modo INSERT. Hay muchas formas de insertar texto, y todas comienzan desde el modo NORMAL.
Dicho esto, no soy un verdadero yo, y reasigné las claves para hacer el trabajo (a la Windows):
fuente