Błąd Vima E138: Nie można zapisać pliku viminfo $ HOME / .viminfo!

20

Obawiam się, że wpadłem na coś raczej dziwnego. Kiedy otwieram plik normalnie vim README.txt, wszystko jest w porządku. Ale sudo vim README.txtplik staje się pusty i E138: Can't write viminfo file $HOME/.viminfo!wyświetla komunikat o błędzie przy próbie wyjścia.

Podejrzewałem, że .viminfoplik jest uszkodzony, więc go usunąłem. Ten problem pozostaje. Czy ktoś może pomóc?

James Adam Buckland
źródło
Czy możesz opublikować wynik podczas uruchamiania ls .viminf*?
cuonglm
Jakie są uprawnienia do pliku viminfo? Jaka jest wydajność ls -la .vininf*?
darnir

Odpowiedzi:

29

Po uruchomieniu sudo vimuruchamiasz vima jako root. Oznacza to, że problemem jest plik viminfo w katalogu / root. Powinieneś to zrobić rm /root/.viminf*.

Aby upewnić się co do tego, biegać sudo vimi wykonywać polecenia: :!echo $HOME. To pokaże, że twój katalog domowy to / root.

Polecam, abyś nie uruchamiał vima jako root, ale raczej używał sudoedit. Jest to bezpieczniejsze rozwiązanie, ponieważ edytor nie działa jako root. Nigdy nie wiesz, co może zrobić wtyczka. Dodatkowo pozwala używać własnych ustawień i wtyczek w vimie, a nie tych w rootach vimrc. sudoeditjest taki sam jak bieganie sudo -e. sudoedit działa, tworząc tymczasową kopię pliku, który jest własnością wywołującego użytkownika (Ciebie). Po zakończeniu edycji zmiany są zapisywane w rzeczywistym pliku, a plik tymczasowy jest usuwany.

Ogólna ogólna zasada: nie uruchamiaj rzeczy jako root, jeśli nie jest to konieczne.

arnefm
źródło
Myślę, że mogłeś uratować mnie od kłopotów z notatką: „To bezpieczniejsze rozwiązanie, ponieważ edytor nie działa jako root. Nigdy nie wiesz, co może zrobić wtyczka. Wierzyłem, że pomyślałem o wszystkim podatności, ale się myliłem.
bballdave025
14

Ten błąd pojawia się przy każdym wyjściu. Nie korzystałem sudo. Wyraźnie wspomniał o moim katalogu domowym użytkownika:

E138: Can't write viminfo file /Users/henrik/.viminfo!

Usunięcie ~/.viminfonie naprawiło błędu.

Okazało się, że miałem kilka plików tymczasowych viminfo, a usunięcie ich rozwiązało problem:

 ls ~/.viminf*      # If you want to see the files.
 rm -rf ~/.viminf*  # Remove them.

Znalazłem to rozwiązanie tutaj .

Henrik N.
źródło
5

Ten sam błąd wystąpił podczas próby :wqutworzenia pliku na dysku, który był całkowicie pełny. Jeśli otrzymasz ten komunikat, możesz sprawdzić dostępne miejsce na dysku.

duhaime
źródło
3

O wiele czystszym sposobem na utworzenie katalogu domowego byłoby na przykład użycie szkieletu, który zapewnia ci Linux.

sudo cp -a /etc/skel /home/usernmae && sudo chown -R usernmae:usernmae /home/usernmae
Stóg
źródło
1
Obawiam się, że pytanie nie ma wiele wspólnego z tworzeniem domowych katalogów ...
John WH Smith
Musisz stworzyć katalog domowy, aby vim mógł zapisać w pliku .viminfo, więc tak, powyższe polecenie ma zastosowanie.
Rick,
1
Istnieje wiele powodów, dla których ten plik nie istniałby, zanim nie można dojść do takiego wniosku. Brak katalogu domowego prawdopodobnie spowodowałby znacznie więcej problemów niż tylko brakujący plik; z tego powodu mogłem odpowiedzieć na dowolne pytanie dotyczące „brakującego pliku” za pomocą „Utwórz katalog domowy”. :)
John WH Smith,
1
+1 W moim przypadku ten błąd wystąpił dokładnie dlatego, że edytowałem plik jako użytkownik, który nie miał katalogu domowego.
Zoltán
3

Dla mnie problemem było to, że zmieniłem mój katalog domowy na lokalizację wewnątrz montowania NFS. Z jakiegoś powodu spowodowało to, że właścicielem katalogu był „nikt”. Dodanie uprawnień do zapisu dla „innych” rozwiązało problem, ponieważ wyraźnie nie byłem właścicielem pliku.

chmod o+w ~/.viminfo
Jon Deaton
źródło
1
Czy możesz wyjaśnić swoją odpowiedź. Odpowiedzi Oneline nie liczą się tak dobrze w SE
Romeo Ninov
2
Dziwne, że dodanie innych uprawnień do zapisu pomogło ci. Być może nie posiadasz własnego pliku?
Jeff Schaller
To działa dla mnie. Wydaje mi się, że moje „.viminfo” zostało utworzone przez użytkownika „root”, a jeśli użytkownik „ubuntu” spróbuje go zmodyfikować, potrzebuje pozwolenia na zapis. W skrócie „-rw-r - r--” staje się „-rw-r - rw-”.
emeraldhieu
0

Najprawdopodobniej dzieje się tak, ponieważ w katalogu domowym zabrakło miejsca na dysku i żadna nowa operacja vima nie może zapisać w pliku .viminfo.

psglinux
źródło
3
To wydaje się trochę przesadne: czy masz na to jakieś dowody?
jasonwryan
To jedna z możliwości, tak.
Ned64
0

Miałem ten sam problem podczas aktualizacji zawartości Makefile. Potrzebowałem zmiennej lokalnej i postanowiłem ją nazwać HOME, więc wpisałem wiersz HOME=2.154. Powoduje vim-HOMEto zastąpienie ustawienia nieistniejącym katalogiem. Nie używaj HOMEzmiennej do innych celów.

użytkownik191855
źródło
1
Należy pamiętać, że HOMEjest to predefiniowana zmienna środowiskowa, a jej ponowne zdefiniowanie zazwyczaj nie jest dobrym pomysłem.
Barun
0

Myślę, że może to dotyczyć tylko dość starych wersji linux / vi, ale znalazłem, że w katalogu głównym katalogu głównego znajdują się pliki tymczasowe o nazwach plików /root/.viminfa.tmp ... /root/.viminfz.tmp i że było ich 26 z datownikami obejmującymi kilka lat. Skończyły nam się litery alfabetu, ponieważ wszystkie az zostały zabrane. Usunąłem wszystkie te pliki i problem zniknął. Oczywiście Henrik # rm -rf ~/.viminf* naprawiłby ten problem.

Stephen Edge
źródło
0

Wygląda na to, że wyczyściłeś zmienne środowiskowe.

Zrób to:

eksportuj HOME = / root

To powinno rozwiązać problem.

Ashfaq
źródło
0

Nie jestem pewien, jak osobiście spotkałem się z tym scenariuszem, ponieważ nie przypominam sobie otwierania żadnych plików, sudo vimale na każdym :qz nich otrzymywałem podobny komunikat „Nie można zapisać viminfo nie jest zapisywalny”.

rm ~/.viminfonie rozwiązał tego i ~/.vim/był pusty.

chmod 666 ~/.viminforozwiązano ten komunikat ostrzegawczy podczas wychodzenia z pliku w Vimie. Chociaż nie jestem pewien, czy to najlepsze rozwiązanie? Ma sens, dlaczego zatrzymał to ostrzeżenie, ponieważ .viminfo był wcześniej rw ------ i zakładam, że zapisuje się w nim historie poleceń vim.

David Tahvildaran
źródło
0

W moim scenariuszu był to /root/.viminfocałkowity brak pliku. Po dotknięciu pliku błąd zatrzymał się i plik został zaktualizowany po wyjściu z vima. PS: To jest linux wbudowany w windriver.

Naveen Gara
źródło