2010-06-09 17 views
33

Cuando abro una nueva línea (a través de 'o') mi cursor salta a una posición con sangría correcta en la línea siguiente. Por otro lado, al ingresar el modo de inserción mientras mi cursor está en una línea en blanco, no muevo mi cursor a la ubicación con sangría correcta.Vim: sangría inteligente al entrar en modo insertar en línea en blanco?

¿Cómo hago para que vim coloque correctamente mi cursor al ingresar al modo insertar (a través de i) en una línea en blanco?

Respuesta

64

cc reemplazará el contenido de la línea actual y entrar en el modo de inserción en la hendidura correcta - así sucesivamente una línea en blanco va a hacer exactamente lo que está buscando.

creo que el comportamiento de i que usted describe es correcta porque hay muchos casos de uso donde se desea para insertar en esa ubicación específica en una línea en blanco, en lugar de saltar a cualquier lugar vim conjeturas que desea insertar.

+1

Bueno, mi solución hará que 'yo' se comporte de esa manera solo cuando la línea esté vacía, entonces solo un caso de uso. 'i' se comportará normalmente en todas las demás situaciones. Dicho sea de paso, cc está integrado y es más apropiado. Aceptando –

+0

lo que me gusta de vim no importa cuánto tiempo lo uses, puedes aprender cosas nuevas todos los días. Uso dd, yy yc con otros modificadores ampliamente cada día, nunca se me ocurrió probar cc. +1 –

+0

Para mí, esto no funciona * si hay una línea en blanco * entre la línea anterior e y la línea que desea sangrar. (es decir, has pulsado 'o' dos veces, porque quieres un espaciado entre la línea anterior y la siguiente sección del código.) Todavía me encantaría ver una forma rápida de saltar al modo insertar, en el nivel de sangría del * línea anterior de código real *. – ELLIOTTCABLE

13

Bueno, esto en realidad no fue tan malo como pensé que sería. Una forma de permitir que esto es agregar lo siguiente a su ~/.vimrc

"smart indent when entering insert mode with i on empty lines 
function! IndentWithI() 
    if len(getline('.')) == 0 
     return "\"_ccO" 
    else 
     return "i" 
    endif 
endfunction 
nnoremap <expr> i IndentWithI() 

Simplemente comprueba si hay una línea en blanco cuando se pulse 'i' del modo de inserción. Si efectivamente está en una línea vacía, la eliminará y abrirá una nueva, aprovechando de forma efectiva el funcionamiento de la "línea abierta".

Nota

: "_ antes de la CC se asegura de que su registro no se hacen borrosos

+0

nice. eso siempre me molestaba – michaelmichael

+1

Hay un error en el código actual. En 'return" \ "_ ccO" ', el' O' necesita ser eliminado, de lo contrario escribirá un 'O' literal en el modo de inserción. (Lo edité, pero los retardos de los revisores lo rechazaron. Originalmente el código lo hizo 'ddO', pero luego alguien editó la publicación para reemplazar' dd' por 'cc' pero olvidó eliminar' O'.) – pcworld

+0

Encontré que 'ccO' tampoco funcionaba, pero' ddko' did (delete línea actual, vaya a la línea anterior, agregue una nueva línea). –

7

En una línea vacía, para ingresar al modo Insertar con sangría correcta, simplemente puede usar s.

Tenga en cuenta que s es un sinónimo de cl, así que si estás no realidad en una línea vacía, que poco a poco la eliminación de un solo carácter, y no sangría. En ese caso, es mejor que use cc, como sugirió SML hace unos 18 meses. Pero con frecuencia he mejorado mi puntaje en VimGolf usando este atajo, así que pensé en mencionarlo. ;)

+2

¡Gracias por el consejo! Todavía estoy aprendiendo cosas sobre vim todos los días. –

+0

@ DaneO'Connor todos lo somos! :) – Enrico

Cuestiones relacionadas