2013-07-02 15 views
5

Podoba mi się polecenie '. w vim. Od :help '.:Zapobieganie zapamiętywaniu Vima

'. `. 

[Skok do] pozycję, w której ostatnia zmiana została wprowadzona. Pozycja znajduje się w pobliżu miejsca rozpoczęcia zmiany.

Ok. Ale oto mój problem: używam funkcji autocmd, aby dodać wiersz "ostatniej modyfikacji" w nagłówku mojego pliku. Tak więc, po każdym napisaniu, '. przynosi mi nie do mojej "prawdziwej" ostatniej zmiany, ale do mojego nagłówka pliku. Moje obecne rozwiązanie polega na tym, że staram się zapamiętać, aby oznaczyć mój obecny punkt edycji numerem ma, aby móc go odesłać do 'a. Czasami jednak zapominam, a nawet kiedy pamiętam, to kolejne kilka naciśnięć klawiszy.

Moim idealnym rozwiązaniem byłoby polecenie, które mówi, że nie należy pamiętać ruchów. Mogę wysłać to polecenie, zanim funkcja autocmd przeskoczy, zapisując ostatnią zmodyfikowaną linię, a następnie anuluje ją po zakończeniu funkcji autocmd. W ten sposób lokalizacja związana z '. nie zostanie zmieniona. Jestem jednak otwarty na wszelkie inne opcje, które są bardziej wydajne.

Jeśli chcesz go zobaczyć, oto, co robi autocmd na :w.

function! UpdateHeader() 
    let b:winview = winsaveview() 

    " This is where I'd put the command to ignore future movements 

    "The periods concatenate all the arguments into one command. 
    "Silent! suppresses errors, usually 'pattern not found' 
    "The 1,6g means search only lines 1 thru 6 
    "Search for File Name: followed by anything 
    "'s'ubstitute 
    "Substitute in 'File Name: ' and the results of the expand command, on the 
    "current filename 
    execute "silent! 1," . 6 . "g/File Name:.*/s//File Name: " . expand("%") 
    execute "silent! 1," . 6 . "g/Last Modified:.*/s//Last Modified: " . strftime("%d-%m-%Y") 

    " This is where I'd put the command to start remembering movements again 

    call winrestview(b:winview) 
endfunction 

Odpowiedz

4

Możesz użyć :keepjumps {command} w swoim autocmd.

Zobacz :help :keepjumps.

+0

Idealny. Dzięki. – ravron

+0

Uwaga dla każdego, kto próbuje wdrożyć to rozwiązanie: komenda 'keepjumps' jest potrzebna w przypadku, gdy * faktyczna modyfikacja tekstu ma miejsce * - mianowicie w poleceniu': s' wykonywanym przez komendę ': g':' execute ' cichy! 1, ". 6. "g/Nazwa pliku:. */keepjumps s // Nazwa pliku:". expand ("%") '. – ravron

+0

Jeszcze jedna uwaga: polecenie zapisane w poprzednim komentarzu zapobiega ustawianiu '' .'. Jednak nadal dodaje do listy skoczków. Aby zapobiec * tej *, dodaj 'keepjumps' ponownie, zaraz po' cichym! '. – ravron

1

Możliwe, że będą na to lepsze sposoby, ale co z zachowaniem lokalizacji w innym znaku? Np:

" This is where I'd put the command to ignore future movements 
" go to the mark and label it as z 
`.mz 

" This is where I'd put the command to start remembering movements again 
" return to your mark and create a fake edit there to reset the most recent edit mark 
`zi <Esc>x 
+0

Interesujące. Rozważyłem również tego rodzaju rozwiązanie. W rzeczywistości oznaczenie nie byłoby nawet konieczne, ponieważ 'winsaveview()' i później 'winrestview()' zachowują i przywracają pozycję kursora. Bardziej wymownym punktem jest "fałszywa" edycja, aby zmusić znak '.' do powrotu do właściwego miejsca. To powinno zadziałać, ale na razie zamierzam zadbać o bardziej "ładne" rozwiązanie. Jeśli nic się nie pojawi, otrzymasz czek. +1 niezależnie. – ravron

3

Spróbuj :lockmarks <command> w swoim autocmd. Pomoc dla tego mówi, że '. jest jedną z rzeczy, która nie zostanie zmieniona przez polecenie.

+0

Wybrałem odpowiedź, powołując się na ': keepjumps' ponad': lockmarks', ponieważ polecenie to wydawało się bardziej ograniczone w zakresie, a jednocześnie spełniało założony cel. W każdym razie dzięki. – ravron

+0

@Riley To ma sens. Dziękuję za pytanie; Nauczyłem się kilku rzeczy. –