Ошибка Vim E138: невозможно записать файл viminfo $ HOME / .viminfo!


20

Боюсь, я столкнулся с чем-то довольно странным. Когда я нормально открываю файл vim README.txt, все нормально. Но после sudo vim README.txtэтого файл становится пустым и выдает E138: Can't write viminfo file $HOME/.viminfo!ошибку при попытке выйти.

Я подозревал, что .viminfoфайл поврежден, поэтому удалил его. Эта проблема остается. Кто-нибудь может помочь?


Можете ли вы опубликовать результат при запуске ls .viminf*?
cuonglm

Каковы права на файл viminfo? Какой выход ls -la .vininf*?
Дарнир

Ответы:


29

При запуске sudo vimвы запускаете vim от имени пользователя root. Это означает, что проблема заключается в файле viminfo в / root. Вы должны сделать rm /root/.viminf*.

Чтобы убедиться в этом, запустите sudo vimи выполнить следующую команду: :!echo $HOME. Это покажет вам, что ваш домашний каталог - / root.

Я бы порекомендовал вам не запускать vim от имени пользователя root, а использовать sudoedit. Это более безопасное решение, так как редактор не работает от имени пользователя root. Вы никогда не знаете, что может сделать плагин. Кроме того, он позволяет вам использовать ваши собственные настройки и плагины в vim, а не те, что в корнях vimrc. sudoeditтак же, как бег sudo -e. sudoedit работает путем создания временной копии файла, который принадлежит вызывающему пользователю (вам). Когда вы закончите редактирование, изменения записываются в фактический файл, а временный файл удаляется.

Общее правило: не запускайте все с правами root, если в этом нет необходимости.


Я думаю, что вы, возможно, избавили меня от кучки беспокойства, заметив: «Это более безопасное решение, так как редактор не работает от имени пользователя root. Вы никогда не знаете, что может делать плагин». Я полагал, что подумал обо всех Уязвимости, но я был не прав.
bballdave025

14

Я получаю эту ошибку на каждом выходе. Я не использовал sudo. В нем явно упоминается мой домашний каталог пользователя:

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

Удаление ~/.viminfoне исправило ошибку.

Оказывается, у меня была куча временных файлов viminfo, и удаление этих исправило проблему:

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

Нашел это решение здесь .


5

Я получил ту же ошибку при попытке :wqфайла на диске, который был полностью заполнен. Если вы получите это сообщение, вы можете проверить доступное дисковое пространство.


3

Гораздо более чистый способ создать домашний каталог - использовать скелет, который Linux предоставит вам, например.

sudo cp -a /etc/skel /home/usernmae && sudo chown -R usernmae:usernmae /home/usernmae

1
Боюсь, что вопрос имеет мало общего с созданием домашних каталогов ...
Джон В. У. Смит

Вам нужно создать домашний каталог, чтобы vim мог сохранять его в файл .viminfo, так что да, вышеуказанная команда применима.
Рик

1
Есть бесчисленное множество причин, почему этот файл не существует, прежде чем вы сможете прийти к такому выводу. Отсутствие домашнего каталога, вероятно, вызовет гораздо больше проблем, чем просто отсутствующий файл; По этой причине я мог ответить на любой вопрос о «отсутствующем файле» с помощью «создать свой домашний каталог». :)
Джон В. У. Смит,

1
+1 В моем случае эта ошибка произошла именно потому, что я редактировал файл как пользователь, у которого не было домашнего каталога.
Золтан

3

Для меня проблема заключалась в том, что я изменил свой домашний каталог на расположение внутри монтирования NFS. По какой-то причине это привело к тому, что владельцем каталога стал "никто". Добавление разрешений на запись для «других» решило проблему, поскольку я явно не являлся владельцем файла.

chmod o+w ~/.viminfo

1
Не могли бы вы уточнить ваш ответ. Ответы Oneline не считаются хорошими в SE
Ромео Нинов

2
Странно, что добавление других разрешений на запись помогло вам. Возможно, у вас не было своего собственного файла?
Джефф Шаллер

Это работает для меня. Я предполагаю, что мой ".viminfo" был создан пользователем "root", и если пользователь "ubuntu" пытается изменить его, ему нужно разрешение на запись. Короче говоря, "-rw-r - r--" становится "-rw-r - rw-".
Изумрудный

0

Скорее всего, это происходит из-за того, что домашнему каталогу не хватило места на диске, и любая новая операция vim не может записать в файл .viminfo.


3
Это кажется немного надуманным: есть ли у вас доказательства этого?
Джейсонвриан

Это одна возможность, да.
Нед64

0

У меня была такая же проблема при обновлении содержимого Makefile. Мне нужна была локальная переменная, и я решил назвать ее HOME, поэтому я вошел в строку HOME=2.154. Это приводит vim-HOMEк замене параметра на несуществующий каталог. Не используйте HOMEпеременную для другого использования.


1
Обратите внимание, что HOMEэто предопределенная переменная среды, и ее переопределение обычно не очень хорошая идея.
Барун

0

Я думаю, что это может относиться только к довольно старым версиям linux / vi, но я обнаружил, что в домашнем каталоге root есть временные файлы с именами файлов /root/.viminfa.tmp ... /root/.viminfz.tmp и что их было 26 с метками времени, охватывающими несколько лет. У нас закончились буквы алфавита, так как все аз были взяты. Я удалил все эти файлы, и проблема исчезла. Конечно, Хенрик исправил # rm -rf ~/.viminf* бы эту проблему просто отлично.


0

Кажется, вы очистили переменные окружения.

Сделай это:

export HOME = / root

Это должно решить вашу проблему.


0

Не знаю, как я сам столкнулся с этим сценарием, так как не помню, чтобы я открывал какие-либо файлы, sudo vimно для каждого :qфайла я получал похожее: «Не могу записать, viminfo is not writeable».

rm ~/.viminfoне решил и ~/.vim/был пуст.

chmod 666 ~/.viminfoУстранено это предупреждение при выходе из файла в Vim. Хотя я не уверен, что это лучшее решение? Имеет смысл, почему он прекратил предупреждение, поскольку .viminfo ранее был rw ------, и я предполагаю, что он записывается с использованием истории команд vim.


0

По моему сценарию, это было полное отсутствие /root/.viminfoфайла. После того, как я коснулся файла, ошибка прекратилась, и файл был обновлен при выходе из vim. PS: Это встроенный в Windriver Linux.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.