Если вы используете Vim или Neovim, вы наверняка сталкивались с тем, что не можете сохранить изменения, внесенные в файл, потому что у вас нет прав на запись или чтение файла.
Самое простое решение - не забывать использовать sudo перед
редактированием файла, на который у вас нет прав (обычно это
системные конфигурационные файлы). Но если вы уже забыли использовать
sudo и внесли множество изменений, следующий совет сэкономит вам
время и нервные клетки.
Первое, что нужно сделать, - проанализировать ситуацию. Если редактор
не позволяет нам сохранить файл, значит, у нас нет прав на его изменение.
Мы можем попробовать, выполнив команду :w!, но если файл принадлежит
другому пользователю и у нас нет прав на запись, это не сработает.
Если же нам разрешили прочитать содержимое файла, то мы можем сохранить
его под другим именем. В Vim мы можем сделать это, выполнив команду
:w other_filename. Но это решение не совсем удовлетворительно, так как
нам придется выполнить новую команду, чтобы заменить редактируемый файл:
!sudo mv other_filename %1.
Есть более простой способ достичь требуемой цели: использовать команду
dd. Просто выполните команду :w !sudo dd of=%. Эта инструкция работает
следующим образом:
:w !. Как объясняет документация Vim (:h w_c), операторы, следующие за восклицательным знаком, выполняются, принимая содержимое буфера (т.е. файла) в качестве стандартного ввода.sudoпозволяет нам выполнить команду с правами суперпользователя.dd of=%принимает стандартный ввод и записывает его содержимое в редактируемый файл.
asciinema-player это не работает без JavaScript
После выполнения приведенной выше команды мы должны ввести наш пароль. После этого Vim предупредит нас о том, что файл изменился и что буфер также был изменен. Просто нажмите O, а затем нажмите Enter, чтобы продолжить.
Этот совет может быть трудно запомнить, поэтому стоит добавить следующую строку в конфигурационный файл Vim:
cmap w!! w !sudo dd of=%<Enter>
С ним вам нужно будет только выполнить :w!! в следующий раз, когда у вас
возникнет подобная проблема.
-
%эквивалентно записи пути к редактируемому файлу (для получения дополнительной информации введите:h %). Знак!в начале команды указывает Vim на выполнение команды с помощью системной оболочки (выполните:h :!для получения дополнительной информации). ↩

Комментарии