2010-01-10 13 views
14

Tengo la mala costumbre de utilizar la tecla "inicio" para volver al comienzo de una línea. Cuando empecé a usar vim recientemente, noté que cuando presiono la tecla de inicio en una línea con sangría, me devuelve al principio de la línea. En Notepad ++ (el editor que solía usar) me devolvería al principio del código en esa línea, justo después de la sangría.Al presionar "Inicio" en Vim en una línea con sangría

¿Hay alguna forma de replicar este comportamiento en vim? Por lo general, cuando estoy presionando inicio, está en el modo Insertar para (generalmente) pegar una variable allí.

tengo set smartindent en mi vimrc, con set noautoindent como una página "consejos" me dijo que asegúrese de desactivar el sangrado automático (aunque no parecía estar habilitado en el primer lugar -. Tal vez esa opción es ajeno)

Respuesta

26

Hay dos maneras habituales para ir al "principio" de una línea de Vim:

  • (cero) hasta llegar a la primera columna de texto
  • ^ ir a la primera no está en blanco en la línea

Me parece que el uso w suele ser la forma más conveniente para ir al primer carácter no en blanco en una línea, es el mismo número de claves que ^ y es e asier para alcanzar. (Por supuesto, si no hay espacios a la izquierda en la línea, no presione w .)

+1

Entonces, ¿no hay manera de hacer esto en el modo de inserción? Creo que debería acostumbrarme a cambiar entre los dos. – Reid

+0

No creo que haya una manera; No utilizo el movimiento del cursor en el modo de inserción en absoluto. Este artículo podría ser útil: http://www.viemu.com/a-why-vi-vim.html –

+0

@Reid - Probablemente podría asignarlo de una forma u otra (ver más abajo) - pero todo movimiento debería ser realmente hecho en modo N, no en I. – Rook

1

intente presionar 0 (véase también :help 0)

también, esto podría ayudar:

:imap <C-Home> <esc>0a 
13

Usted podría reasignar Inicio a ser el mismo que ^ (los documentos dicen Inicio 's función por defecto es equivalente al comando de movimiento |):

:map <Home>^ 
:imap <Home> <Esc>^i 

lo que debería hacer el mapeo modo de inserción sea equivalente a escapar fuera del modo de inserción , presionando ^ y luego volviendo al modo insertar. No sé cuál es el mejor método para mapear un comando de movimiento para usar dentro del modo de inserción, por lo que puede romper algo, pero parece funcionar.

En cuanto a las configuraciones de sangría, no deberían tener un efecto sobre los controles de movimiento, pero también creo que probablemente prefiera tenerlos configurados de forma diferente. autoindent simplemente mantiene su sangría actual para las nuevas líneas (por lo tanto, si coloca 4 espacios al principio de una línea, después de presionar regresar, su nueva línea también tendrá 4 espacios en frente). No sé por qué no querrías eso, ya que es bastante útil en casi cualquier lenguaje de programación, o incluso solo texto de forma libre. Por otro lado, smartindent implementa un par de reglas de indentación C-ish ligeramente codificadas, como sangría después de una apertura {, y deindentificación después de un cierre}, pero no transfiere automáticamente la sangría de las líneas anteriores. Los documentos recomiendan mantener la autoincripción si usa smartindent.

Sin embargo, smartindent es inútil para los idiomas que no cumplen con sus reglas rígidas, o incluso activamente dañinos (como cuando quita automáticamente la sangría de cualquier línea que comience con '#', que cree es una directiva de preprocesador pero está mal para los programadores de python que intentan escribir un comentario sangrado).

So vim también incluye un modo de indentación más avanzado, indentación de tipo de archivo, que permite reglas de indentación flexibles por idioma/tipo de archivo y es el modo de sangría preferido para la mayoría de las personas (incluso para los idiomas C). Si usa sangría de tipo de archivo, lo mejor es desactivar smartindent (de lo contrario, puede interferir con la sangría de tipo de archivo, como mover todas las líneas de comentario a la columna 0 en los archivos de Python).

Personalmente, siempre he autoindentado, uso el tipo de archivo cuando está disponible y nunca uso smartindent. Mi .vimrc incluye:

set autoindent " doesn't interfere with filetype indents, and is useful for text 
if has("autocmd") 
    " Enable file type detection and indentation 
    filetype plugin indent on 
    set nosmartindent 
endif 

Me imagino que hay algo que se podía hacer para tener smartindent enciende sólo cuando la sangría del tipo de archivo no existe para un tipo de archivo, si está editando que muchos diferentes lenguajes C-como sin filetype indentation disponible.

+1

puede cortar el mapa de modo de inserción por un personaje diciendo 'imap I' en lugar de'^i' –

7

Esto es lo que tengo en mi .vimrc. Esto asigna Inicio para pasar al principio del texto si se encuentra en algún lugar de la línea, y la columna 0 si está al principio del texto.

function ExtendedHome() 
    let column = col('.') 
    normal!^
    if column == col('.') 
     normal! 0 
    endif 
endfunction 
noremap <silent> <Home> :call ExtendedHome()<CR> 
inoremap <silent> <Home> <C-O>:call ExtendedHome()<CR> 

Nota: estoy usando un diseño de teclado que se asigna Inicio a Alt Gr +Un, por eso por lo que estoy usando esto. Si tiene que abandonar el campo de letras de su teclado para llegar al Inicio, probablemente debería pasar al modo normal.

2

También puede usar _ en modo Normal para ir al primer carácter que no sea de espacio en blanco de la línea actual. También puedes usar un conteo con este movimiento.

_ <underscore>  [count] - 1 lines downward, 
        on the first non-blank character linewise. 
Cuestiones relacionadas