2010-03-06 20 views
9

El código siguiente es dentro de mi .vimrc y generalmente restaura la última posición del cursor de un archivo abrí con vim:vim restaura la posición del cursor; excluir archivos especiales

autocmd BufReadPost * 
    \ if line("'\"") > 1 && line("'\"") <= line("$") | 
    \ exe "normal! g`\"" | 
    \ endif 

me gusta mucho esta característica y quiere dejarla encendida, a excepción de un archivo: cuando se compromete con git, vim se enciende y puedo editar el mensaje de confirmación con él. Sin embargo, el archivo de mensaje de confirmación existe antes de que vim se inicie (y se prellene), por lo que vim lo ve como un archivo existente y restaura la última posición del cursor (que normalmente no está donde me gustaría comenzar a escribir).

¿Existe la posibilidad de modificar el script anterior para excluir el archivo COMMIT_EDITMSG?

+2

: -) Me tomó menos tiempo escribir 'ggI' después de que git commits, en realidad. –

+1

'ggI'? ¿Que es eso? – poke

+1

es un comando vim para ir al comienzo de un archivo y cambiar al modo de inserción :-) –

Respuesta

8

Después de leer el manual de comandos automáticos, noté que no parece posible definir el patrón con el que coinciden de forma que excluyan un patrón especial. Y tampoco pude usar alguna variable que contenga el nombre de archivo actual, de modo que simplemente amplíe el existente si se excluye el archivo.

Sin embargo, en base a la observación formulada por Pavel Shved (sobre la gg de pasar a la parte superior del archivo) pensé que de la misma manera que debe ser posible simplemente sobrescribir el efecto de la posición de la restauración, simplemente moviéndolo a la parte superior más tarde nuevamente. Así que se me ocurrió esto:

autocmd BufReadPost COMMIT_EDITMSG 
    \ exe "normal! gg" 

La colocación de esto después de los anteriores autocmd BufReadPost simplemente cadenas de la ejecución del evento, por lo que vim, después de ejecutarse la primera y la restauración de la posición, lee esto y lo compara en el nombre excluidos y usa el gg para mover el cursor a la parte superior, básicamente sobreescribiendo el efecto del autocmd original.

y que funciona muy bien :)

1

Probablemente deberías investigar mksession. Puede configurar comandos automáticos de VimEnter/VimLeave para "hacer lo correcto" cuando haya especificado archivos en la línea de comando (como cuando git invoca vim). Existen numerosas secuencias de comandos para esta función, por ejemplo, vea http://vim.wikia.com/wiki/Working_with_multiple_sessions.

3

entiendo que ya haya llegado a una solución pero no tenía la misma pregunta y se acercó con una alternativa que no requiere de encadenamiento.

function! PositionCursorFromViminfo() 
    if !(bufname("%") =~ '\(COMMIT_EDITMSG\)') && line("'\"") > 1 && line("'\"") <= line("$") 
    exe "normal! g`\"" 
    endif 
endfunction 
:au BufReadPost * call PositionCursorFromViminfo() 
+0

Bonito refinamiento: ¡parece más limpio que un doble salto! –

0

Prueba de esto, su movimiento del cursor a la última posición

conjunto oculta

1

Poner las siguientes líneas en lugar de sus líneas en el .vimrc:

au BufWinLeave * mkview 
au BufWinEnter * silent loadview 
Cuestiones relacionadas