Grok Vim movimientos y ediciones simples

8

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 NORMALmodo para emitir un solo movimiento, solo para volver a ingresar al INSERTmodo no es óptimo.

Ejemplo 1: cuando INSERTesté 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 INSERTmodo 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 NORMALmodo 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.

SabreWolfy
fuente
1
La forma de Vim podría ser utilizar un complemento como algoritmo.com.au/code/vimacs . : P ¿Puede incluir una explicación de lo que hacen estos comandos en emacs? Una lista de Ctrl / Alt / Meta-foo / bar no tiene sentido para cualquiera que no use emacs. Y Ctrl-W elimina la palabra antes del cursor. Además, tengo la sensación de que esto es demasiado amplio.
muru
1
Si vamos por el plugin, debería visitar github.com/tpope/vim-rsi
dkns el
3
Al pasar del lenguaje de programación "A" a "B". Es mejor no escribir "B" al estilo de "A", sino aprender los modismos estándar de "B" (es una lección difícil para la mayoría de los desarrolladores). La misma regla se aplica a los editores. No intente aplicar el flujo de trabajo estándar del editor "A" a su nuevo editor "B". Prefiere aprender los modismos de usar "B" directamente. Mayor curva de aprendizaje pero mucho más productiva a largo plazo. En la vimedición, pasa la mayor parte del tiempo en modo normal, no en modo de inserción.
Martin York

Respuestas:

6

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)

inoremap <C-a> <C-o>0

o, si el inicio de la línea significa el primer carácter de línea no en blanco

inoremap <C-a> <C-o>^

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

let cchar = s:cchar["atx"]

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:ccharaún no tiene asignado un valor para la "atx"clave. Con mi cursor (en modo normal) en el primer carácter, 'l', podría escribir

f=wcf[MyFunction(<Esc>$r)

Brevemente, esto dice

  • f=- Reenviar a '=' (podría haber dicho fs, 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

let cchar = |"atx"]

donde |está el cursor, y estoy en modo de inserción. Luego escribo MyFunction(y salgo del modo de inserción ( <Esc>).

  • $- mover el cursor al final de la línea. Podría haberlo utilizado Epara el final de la gran palabra o f]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 con

inoremap <C-S-w> <C-o>dw

Nuevamente, lo <C-o>sacará del modo de inserción para un comando único y dw"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 utilizar W(ver :help W). Si ya está principalmente en modo normal, no necesita estas asignaciones, solo sí dw, dbo amigos.

Algunos capítulos de ayuda para ver más de cerca

  • :help <C-o>
  • :help Insert
  • :help fy las siguientes secciones ( F, t, T, ;y ,)
  • :help word-motions
jjaderberg
fuente
55
La escritura NO es lineal. Cualquiera que pueda escribir prosa (o código) de principio a fin sin realizar algún tipo de edición es una locura o tiene el poder de un Dios. Para el resto de nosotros, hacemos más edición que escritura y, por lo tanto, pensamos que su editor ejecuta comandos de edición (modo NORMAL) primero y escribir (modo INSERTAR) en segundo lugar es más eficiente. Y este es el verdadero meollo de por qué los editores como Emacs, MS Word, Notepad, etc., tienen un enfoque inverso. Es lamentable que exista el concepto sin modo, pero debe haber un mínimo común denominador.
Sukima
12

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).

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.

Ejemplo 1: en el modo INSERTAR 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?

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 justo ys$). 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 usar c3w()<esc>Po ys3w). ¿Qué pasa con toda la línea? cc()<esc>Po yss).

Ejemplo 2: Al editar texto, a menudo se desea eliminar una palabra hacia adelante o hacia atrás al escribir o editar 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 del modo INSERT 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 modo NORMAL para movimientos simples o eliminar palabras.

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 pueda jk<sequenceofcommands>ihacer comandos sin interrumpir su escritura.

Hovercouch
fuente
Además de :h ins-special-keys, echa un vistazo a :h ins-special-specialmás asignaciones.
Lithis
9

Alt-F, Alt-B, Ctrl-a, Ctrl-e, Alt-D y Alt-Retroceso

Los comandos equivalentes en modo normal son w, b, ^, $, dw, db. Tenga en cuenta la lógica: dwelimina lo que está cubierto wy dbelimina lo que está cubierto b. ¿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.

Regresar al NORMALmodo para emitir un solo movimiento, solo para volver a ingresar al INSERTmodo no es óptimo.

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.

Ejemplo 1: cuando INSERTesté 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?

Como en cualquier editor de texto o IDE o procesador de texto o <textarea>:

<End>)

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 INSERTmodo 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 NORMALmodo para movimientos simples o eliminar palabras.

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.

romainl
fuente
¿ Está bien usar movimientos (como Endlas teclas de flecha o) en el INSERTmodo?
SabreWolfy
44
Por supuesto, cualquier cosa que facilite su trabajo.
romainl
3

¿Cuál es la forma Vim de implementar una funcionalidad similar? Regresar al modo NORMAL para emitir un solo movimiento, solo para volver a ingresar al modo INSERTAR no es óptimo.

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):

nmap <C-BACKSPACE> dbi
nmap <C-DEL> dei
imap <C-BACKSPACE> <ESC>ldbi
imap <C-DEL> <ESC>ldei
tharibo
fuente