Сохранение файла в Vim от имени суперпользователя

Если вы используете 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!! в следующий раз, когда у вас возникнет подобная проблема.


  1. % эквивалентно записи пути к редактируемому файлу (для получения дополнительной информации введите :h %). Знак ! в начале команды указывает Vim на выполнение команды с помощью системной оболочки (выполните :h :! для получения дополнительной информации). 

Комментарии