Jak używać znaków, aby przeskakiwać do lokalizacji w plikach, które ostatnio otworzyłem, ale nie zmieniłem?

11

Często edytuję plik - myślę, że moja praca jest skończona - następnie zamykam plik i przechodzę do następnej rzeczy. Ale potem zdaję sobie sprawę, że muszę wrócić do tego kodu i nieco go ulepszyć.
Jeśli ponownie otworzę plik, mogę użyć .znacznika i przejść do pozycji ostatniej edycji za pomocą '..
Teraz próbuję znaleźć sposób użycia znaków vima do przeskakiwania do lokalizacji w plikach, które ostatnio odwiedziłem, ale nie zmieniłem.
Wiem, że mogę ustawić znak ręcznie, ale przez większość czasu nie oczekuję, że wrócę, więc nie ustawiam znaku i muszę użyć znaku, który vim generuje automatycznie. Znak Wygląda na to może być drogą do osiągnięcia tego celu, z .
":h motion

" Do pozycji kursora przy ostatnim wyjściu z bieżącego bufora. Domyślnie pierwszy znak pierwszego wiersza. Zobacz | skok z ostatniej pozycji | jak używać tego dla każdego otwartego pliku. Zapamiętana jest tylko jedna pozycja na bufor, a nie jedna dla każdego okna. Dopóki bufor jest widoczny w oknie, pozycja nie zostanie zmieniona. {nie w Vi}.

Jeśli jednak ja

  • zamknij wszystkie okna pokazujące bufor (ale bufor jest nadal obecny na liście buforów). lub:
  • zabij wszystkie instancje bufora

znak nie wydaje się aktualizować, jak mogę użyć znaku, aby przejść do położenia ostatniej pozycji kursora w buforze / pliku?

the_velour_fog
źródło
2
Myślę, że szukasz Ctrl+oi Ctrl+i... :h jump-motionsaby uzyskać więcej informacji
Sundeep
@spasic to niezła sugestia, ale gdy wykonasz kilkadziesiąt skoków, pozycja zostanie utracona na ogromnej liście skoków. Przesuwając znaki do bufora, masz mniejszą listę znaków / lokalizacji do zarządzania
the_velour_fog
Jeśli jeszcze tego nie przeczytałeś, myślę, że ta wskazówka byłaby interesująca. Może będziesz musiał dostosować swójviminfo
statox
@statox dzięki. Widziałem to i wskazówka w vimie pomaga. Myślę, że te rozwiązania powodują automatyczne przeskakiwanie do "znaku po otwarciu pliku. Naprawdę chciałem tylko ręcznie przeskoczyć do ostatniej pozycji kursora. Poza tym po prostu nie mogłem zrozumieć, kiedy "znak zostanie ustawiony i zaktualizowany, więc dla mnie "znak jest bezużyteczny.
the_velour_fog

Odpowiedzi:

6

Oto klasyczne rozwiązanie: użyj

`H

przejść do ostatniego pliku HTML i tak dalej…

augroup VIMRC
  autocmd!

  autocmd BufLeave *.css  normal! mC
  autocmd BufLeave *.html normal! mH
  autocmd BufLeave *.js   normal! mJ
  autocmd BufLeave *.php  normal! mP
augroup END
romainl
źródło
2
dzięki, wydaje się, że to może być naprawdę przydatne. Załadowałem go do mojego vimrc, aby go wypróbować. Zmieniłem na autocmd na, WinLeaveponieważ zauważyłem, BufLeaveże nie wydaje się strzelać po zamknięciu podziału, a bufor jest nadal otwarty gdzie indziej. Wiem, że to trochę skrajna sprawa, ale WinLeavewydaje się, że działa w szerszym zakresie sytuacji typu „zamykanie plików”, ale wciąż
testuję
3

Napisałem to oświadczenie vimscript, które wydaje się działać

autocmd BufLeave * :normal ml

Wyjaśnienie

  • BufLeave automatyczne polecenie: wydaje się to wyzwalać, gdy ty
    • przejdź do innego okna
    • po zamknięciu ostatniego okna wyświetlającego bufor
    • po zamknięciu samego bufora za pomocą bd
  • :normal- domyślnie wydaje się, że commandczęść autocmd jest poleceniem ex. Aby więc powiedzieć vimowi, aby uruchomił polecenie trybu normalnego, musisz dodać:normal
  • ml- ustaw znak l(mnemoniczny: ostatni )

Stosowanie

aby przywołać pozycję kursora od ostatniego pobytu w buforze, po prostu naciśnij

'l

lub

`l
the_velour_fog
źródło
0

Jeśli chcesz, aby kursor przywrócił ostatnią pozycję znaną z viminfo , możesz użyć

autocmd BufReadPost * call setpos(".", getpos("'\""))

Odpowiedź romainla była dla mnie szczególnie użyteczna i często z niej korzystam (ponieważ jestem web dev):

augroup VIMRC
    autocmd!
    autocmd BufLeave,WinLeave *.html normal! mH
    autocmd BufLeave,WinLeave *.css normal! mC
    autocmd BufLeave,WinLeave *.js normal! mJ
augroup end

nnoremap <space>h `Hzz
nnoremap <space>c `Czz
nnoremap <space>j `Jzz

Ostatnią potencjalnie przydatną rzeczą jest opcja :help 'nostartofline:

               *'startofline'* *'sol'* *'nostartofline'* *'nosol'*
'startofline' 'sol' boolean (default on)
            global
            {not in Vi}
    When "on" the commands listed below move the cursor to the first
    non-blank of the line.  When off the cursor is kept in the same column
    (if possible).  This applies to the commands: CTRL-D, CTRL-U, CTRL-B,
    CTRL-F, "G", "H", "M", "L", gg, and to the commands "d", "<<" and ">>"
    with a linewise operator, with "%" with a count and to buffer changing
    commands (CTRL-^, :bnext, :bNext, etc.).  Also for an Ex command that
    only has a line number, e.g., ":25" or ":+".
    In case of buffer changing commands the cursor is placed at the column
    where it was the last time the buffer was edited.
    NOTE: This option is set when 'compatible' is set.
dylnmc
źródło