Если вы используете 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 :!
для получения дополнительной информации). ↩
Комментарии