vim nie pamięta ostatniej pozycji

89

Mój Ubuntu LTS 12.04 ma edytor vim. Jeśli otworzę plik, przejdę do akapitu i ponownie otworzę vim, wtedy kursor zawsze przechodzi na początek pliku.

To nie jest oczekiwane zachowanie. Jak vim może zapamiętać ostatnią pozycję odczytu po zamknięciu pliku?

Próbowałem viteż, ale wynik jest taki sam.

Grzyby Księżycowe
źródło
1
Przykro mi, ale wydaje się, że jest 0 dokumentacji, która mówi, że powinna. Czy jesteś w 100% pewien, że tak jest w przypadku Vima? I przepraszam, nie mam pojęcia, jak go skonfigurować, aby zapamiętał ostatnią pozycję. Może przeze mnie niepotrzebny komentarz, ale muszę wiedzieć, czy program robił to wcześniej.
Denny
4
Na przykład w Redhat ostatnia odsyłana linia w pliku jest pamiętana przez vima. vim wydaje się być niewygodny w Ubuntu 12.04
Lunar Mushrooms
Również w Ubuntu 10.04 z pewnością nie jest to zachowanie domyślne. Używam Vima na Ubuntu od dłuższego czasu, nigdy nie widziałem oczekiwanego zachowania. Prawdopodobnie skonfigurowałeś to w tej instalacji - patrz na przykład odpowiedź @GaryBishop.
gertvdijk
Niestety nie był to Ubuntu 10.04, tylko czerwony kapelusz, który działał. Zaktualizowałem mój komentarz
Lunar Mushrooms

Odpowiedzi:

116

Rozwiązany:

/ etc / vim / vimrc

Zawiera już niezbędną funkcję. Po prostu usuń komentarz:

" Uncomment the following to have Vim jump to the last position when
" reopening a file
if has("autocmd")
  au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
endif

(W rzeczywistości można również odnieść się do /usr/share/vim/vim73/vimrc_example.vim)

Grzyby Księżycowe
źródło
Wydaje się, że działa tylko z użytkownikiem root, a nie z innymi użytkownikami. Mój plik vimrc to -rw-r--r-- 1 root root; czy to byłby problem?
ADTC
2
Miałem dziwny problem, w którym jeden użytkownik zapamiętałby ostatnią pozycję, ale żaden inny. Okazuje się, że te linie były w pliku .vimrc użytkownika, ale zostały skomentowane w / etc / vim / vimrc. Odkomentowanie ich tam umożliwiło wszystkim użytkownikom.
felwithe
66

Miałem ten sam problem i okazało się, że plik .viminfo w moim katalogu domowym miał niewłaściwą własność. Był własnością root: root.

Gdy naprawiłem własność pliku, zmieniając go na siebie, zapamiętywanie pozycji pliku znów zaczęło działać

TikiTavi
źródło
3
W moim przypadku to działało. Miałem ten sam problem. Zmieniłem własność .viminfo (obecnego w katalogu domowym), która naprawia problemy z vimem. Ale dlaczego został stworzony z rootem: root?
Brijesh Valera
1
@BrijeshValera prawdopodobnie dlatego, że zacząłeś vima jako root, gdy plik jeszcze nie istniał.
Ruslan
1
@ Ruslan Ale czy zatem plik nie powinien zostać utworzony w katalogu domowym użytkownika root?
ankush981
5
@dotslash, co jest trudne sudo. Nie zmienia środowiska (przynajmniej w większości): spróbuj uruchomić sudo bash -c 'echo $HOME', dostaniesz katalog domowy zamiast katalogu głównego.
Ruslan
1
To było przyczyną mojego 18.04
Hanynowsky
2

Istnieje wtyczka o nazwie vim-lastplace (jestem autorem), która otworzy twoje pliki tam, gdzie zostało przerwane. Poprawia powyższe sugestie, ignorując komunikaty zatwierdzania, ponieważ zazwyczaj edytujesz nową wiadomość i chcesz zacząć od góry pliku wiadomości zatwierdzenia.

Greg Dietsche
źródło
dlaczego głosowanie negatywne? vim-lastplace robi dokładnie to, o co poprosił OP, i robi to nawet lepiej niż zaakceptowana odpowiedź (która zawiera wiele błędów).
Greg Dietsche
0

W moim przypadku, vi był dowiązaniem: /usr/bin/vi -> /etc/alternatives/vi -> /usr/bin/vim.tiny. Ten ostatni nie ma żadnych prawdziwych funkcji vima. Zainstalowanie pakietu „vim” (przy użyciu synaptic lub apt-get) spowodowało, że to dowiązanie symboliczne wskazywało /usr/bin/vim.basici rozwiązało problem.

Bruno Haible
źródło
-1

W rozwiązaniu Lunar Mushrooms jest błąd. Oto poprawka:

if has("autocmd")
  " When editing a file, always jump to the last known cursor position.
  " Don't do it when the position is invalid or when inside an event handler
  " (happens when dropping a file on gvim).
  " Also don't do it when the mark is in the first line, that is the default
  " position when opening a file.
  autocmd BufReadPost *
    \ if line("'\"") > 1 && line("'\"") <= line("$") |
    \   exe "normal! g`\"" |
    \ endif

endif
Arnaud
źródło
Dlaczego uważasz, że Twoje rozwiązanie jest prawidłowe? Wygląda podobnie, ale z odwrotnymi ukośnikami na początku linii. Jeśli tak, czy nie powinny znajdować się na końcu wiersza, co oznacza, że ​​polecenie jest kontynuowane w następnym wierszu ...? Akceptowana odpowiedź mówi tylko o odkomentowaniu sekcji w globalnym pliku konfiguracyjnym, który jest instalowany razem z vim. Najwyraźniej rozwiązało to problem. Gdzie jest błąd?
Nephente
Ponieważ jeśli skopiuję / wkleję pierwsze rozwiązanie, pojawi się błąd. I zamieściłem treść mojego /usr/share/vim/vim74/vimrc_example.vim (który zawierał ukośniki odwrotne na początku).
Arnaud,
1
@ Sprawdź obszar wierszy podany już w pliku, ale skomentował. Wystarczy usunąć "znak na początku wiersza, aby je odkomentować. Nie ma potrzeby „kopiowania / wklejania pierwszego rozwiązania”.
ADTC,