2012-04-28 16 views
9

tengo set autoindent
voy a una línea, pulse A y <CR> que me llega a la siguiente línea y inserta un guión. Sin embargo, si presiono Esc, el cursor salta al principio de la línea y la sangría desaparece.
Tengo que ir y presionar las pestañas para volver al lugar correcto.¿Cómo preservar guión después de pulsar la tecla Esc en Vim

Sé que la ayuda dice:

If you do not type anything on the new line except <BS> or CTRL-D and then type 
<Esc>, CTRL-O or <CR>, the indent is deleted again. 

¿Hay una manera de desactivar esto, o al menos una solución?

+1

Argh. +1 a esto, es realmente molesto. Vamos, VIM. Ya no estamos en 1985, tenemos gigabytes de RAM y terabyes de almacenamiento, podemos ahorrar algunos bytes de espacios adicionales en líneas en blanco en nuestros archivos de texto para ahorrarle al programador algunas molestias. – QuadrupleA

Respuesta

3

Muy bien, me di cuenta de esto.

Basado en la respuesta de Edan Maor, S o cc debe entrar en el modo de inserción con el nivel apropiado de indentación.
... excepto cuando no :)

Esto funciona en dos circunstancias.

  • cuando cindent se establece, se insertará guión basado en reglas de formato C
    Esto puede resultar molesto cuando la edición de archivos no como C.
  • cuando se establece indentexpr.

He encontrado que la mejor solución es hacer que esta es mi .vimrc

set autoindent 
set indentexpr=GetIndent() 

function GetIndent() 
    let lnum = prevnonblank(v:lnum - 1) 
    let ind = indent(lnum) 
    return ind 
endfunction 

Ahora cuando pulso S o cc, se insertará el mismo punto que en la anterior no linea en blanco.

+0

He desvirtuado esta respuesta por error hace 10 horas (mi intención era la de revalorizarla), y ahora no puedo cambiar mi voto hasta que se edite la respuesta. :( –

+0

@EmanueleNatale np, lo edité ahora – mihai

+0

Gracias, vota modificado. –

1

Una manera simple es presionar '.' (o cualquier char), escape, luego presione x para eliminar el carácter. La sangría debe ser preservada.

+0

No me gusta, pero si no hay mejor manera ... Supongo que estoy atascado con este – mihai

1

escribir el texto a continuación, pulse == en modo normal en esa línea

6

tuve este problema exacto hasta hace dos días.

No es sin manera de desactivar esto, pero por suerte, que no necesita, porque en vez:

el modo insertar con S o cc. Al ingresar al modo de inserción nuevamente con S se ingresará el modo de inserción con el nivel de sangría correcto, lo que hace que el hecho de que Vim elimine las sangrías no sea importante.

Nota: Descubrí que este truco me funcionaba en la mayoría de los lugares. Pero por alguna razón, hizo no trabajar con archivos de Python. Supongo que tiene algo que ver con el tipo de archivo Python jugando con sus propias funciones de sangría, o algo así.

Editar:

Otro truco, puede definir cpoptions de una manera que, si estás en una línea con un guión y mueve el cursor, se preservará el guión. no va a resolver su problema de golpear Esc de inmediato, pero es un problema relacionado que también podría estar molestando.

+0

S o cc ... no funciona (si ya presioné Esc). Todavía estoy atrapado al principio de la línea. ¿Hay una configuración específica para esto? – mihai

+0

No, debería funcionar de la caja. Necesitas tener activado el autoguiado, lo cual supongo que debes hacer a partir de la pregunta. –

1

Vale la pena señalar que con los complementos adecuados S y cc parecen funcionar correctamente otra vez. Lo más probable es que el modo python esté solucionando esto.

https://github.com/klen/python-mode

0

tuve quieren lograr el mismo efecto, sino porque quiero the plugin showing indent funcione correctamente. Esta es mi solución: he encontrado que <enter> en modo normal es casi inútil. Solo mueve el cursor una línea hacia abajo, lo que se puede lograr con j.

por lo que añade esto en mi .vimrc:

nmap <cr> o.<c-h><esc> 

Cada vez que necesito una línea en blanco para su sangría, que haría uso de <enter> lugar.

2

considero que uso 'o' para comenzar una nueva línea. Añado a continuación config en _vimrc (aviso I have ': set autoindent')

" ugly hack to start newline and keep indent 
nnoremap o ox<BS> 
nnoremap O Ox<BS> 
Cuestiones relacionadas