2010-03-06 14 views
9

Poniższy kod jest wewnątrz mojego .vimrc i ogólnie przywraca ostatnią pozycję kursora pliku I otwarty z vim:vim przywraca pozycję kursora; wykluczyć pliki specjalne

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

Naprawdę lubię tę funkcję i chce pozostawić włączone, wyjątkiem jeden plik: Podczas zatwierdzania z git, vim zostaje uruchomiony i mogę edytować wiadomość zatwierdzenia. Jednak plik komunikatu zatwierdzenia istnieje przed uruchomieniem vima (i jest wstępnie wypełniony), więc vim widzi go jako istniejący plik i przywraca ostatnią pozycję kursora (zwykle nie jest to miejsce, w którym chciałbym zacząć pisać).

Czy istnieje możliwość modyfikacji powyższego skryptu w celu wykluczenia pliku COMMIT_EDITMSG?

+2

: -) Właściwie to zajęło mi mniej czasu na wpisanie 'ggI' po zatwierdzeniu git. –

+1

'ggI'? Co to jest? – poke

+1

to polecenie vim, aby przejść do początku pliku i przejść do trybu wstawiania :-) –

Odpowiedz

8

Po przeczytaniu instrukcji na temat automatycznych poleceń, zauważyłem, że nie można zdefiniować wzorca, który dopasowują w taki sposób, aby wykluczyć specjalny wzór. Nie mogłem też użyć zmiennej, która zawiera bieżącą nazwę pliku, więc po prostu rozwiń istniejący, jeśli chcemy wykluczyć plik.

Jednak na podstawie komentarza Pavel Shved (o gg przejście do początku pliku) myślałem, że w taki sam sposób, powinno być możliwe, aby po prostu nadpisać efekt położenia przywracania, po prostu ponownie przesuwając go na szczyt. Więc wpadłem na to:

autocmd BufReadPost COMMIT_EDITMSG 
    \ exe "normal! gg" 

Umieszczenie tego po poprzednich autocmd BufReadPost prostu łańcuchami dotyczące wykonania wydarzenie, więc vim, po wykonaniu pierwszego i przywracając pozycję, to czyta i dopasowuje go na wyłączonego pliku i używa gg, aby przesunąć kursor do góry, zasadniczo nadpisując efekt oryginalnego autocmd.

I to działa dobrze :)

1

Powinieneś prawdopodobnie zbadać mksession. Możesz skonfigurować automatyczne polecenia VimEnter/VimLeave, aby "robić to, co trzeba", gdy masz określone pliki w wierszu poleceń (tak, jak git wywołuje vim). Istnieje wiele skryptów do tego pływających wokół, patrz na przykład http://vim.wikia.com/wiki/Working_with_multiple_sessions.

3

Rozumiem już wymyślić rozwiązanie, ale miałem to samo pytanie i wymyślił alternatywę, która nie wymaga łączenia.

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

Niezłe wyrafinowanie - wydaje się czystsze niż podwójny skok! –

0

Spróbuj tego, jego ruch kursora do ostatniej pozycji

zestaw ukryty

1

Umieść następujące linie zamiast swoich liniach w .vimrc:

au BufWinLeave * mkview 
au BufWinEnter * silent loadview 
Powiązane problemy