Получение корня изнутри Vim

72

Иногда я начинаю редактировать файлы конфигурации в /etcVim, но забываю использовать его sudoдля запуска Vim. Неизбежным результатом является то, что после завершения моих правок я сталкиваюсь с ужасным уведомлением о том, что у меня нет разрешения на сохранение файла.

В основном, изменения настолько малы, что я просто выхожу из Vim и делаю все заново как root. Конечно, я могу сохранить в папку, в которую я могу написать, а затем скопировать с правами root, но это также несколько раздражает.

Но я уверен, что есть более простой способ стать пользователем root или использовать его sudoизнутри Vim, не отказываясь от изменений. Если бы метод не основывался на sudoнастройке для пользователя, это было бы еще лучше.

Злой ученый
источник
1
Я привык использовать sudoeditвместо vimвсего редактирования администратора. Это один из способов больше никогда не сталкиваться с этой проблемой :). +1 за ответ Жиля .
jw013
Эти предупреждающие вопросы и ответы от SO полезны, поэтому ссылки на них приведены здесь: Получение прав root для файла внутри vi? & Как работает трюк vim «напиши с sudo»? ,
СЛМ

Ответы:

46

sudo не может изменить действующего пользователя существующего процесса, он всегда создает новый процесс с повышенными привилегиями и исходная оболочка не изменяется. Это фундамент дизайна UNIX. Я чаще всего просто сохраняю файл в / tmp как обходной путь. Если вы действительно хотите сохранить его напрямую, вы можете попробовать использовать функцию Vim, которая может передавать файл другому процессу. Попробуйте сохранить с помощью этой команды:

:w !sudo dd of=%

Проверено и работает. Затем Vim попросит вас перезагрузить файл, но в этом нет необходимости: вы можете просто нажать, oчтобы избежать перезагрузки и потери истории отмен. Вы даже можете сохранить это в команде / функции Vim или даже связать с клавишей для легкого доступа, но я оставлю это как упражнение для читателя.

penguin359
источник
2
Это интересное решение, но вы можете заменить путь на %, который в vim будет путем к файлу, который вы в данный момент редактируете.
Рейд
Вы должны заключить %в кавычки в случае, если имя файла содержит пробел.
интуитивно
Также: это не сбрасывает 'modified'настройки; Вы можете сделать это вручную с set nomodified.
интуитивно
2
На самом деле, если вы действительно хотите быть осторожным, вы должны делать это exec 'w !sudo dd of=' . shellescape(expand('%'))в случае, если имя файла содержит кавычки, обратную косую черту, знаки доллара и т. Д.
интуитивно
Как это отличается от команды Commandlinefu-команд?
36

Сохранение файла как root:

: w! sudo tee%

plaes
источник
13

Звоните, sudoeditчтобы редактировать файлы как root.

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

Жиль "ТАК - перестань быть злым"
источник
8

Вы можете положить это в свой .vimrc

cmap w!! %!sudo tee > /dev/null %

Вы запускаете его, выполняя :w!!- он проталкивает файл sudo teeдо текущего имени файла ( %).

С https://stackoverflow.com/questions/95072/what-are-your-favorite-vim-tricks

Хэмиш Даунер
источник
И если у вас установлено moreutils, просто используйте !sudo sponge %вместо этого.
Towo
3

Это также хорошо работает:

:w !sudo sh -c "cat > %"

Это вдохновлено комментарием @Nathan Long в этом ответе .

ВНИМАНИЕ :

"должен использоваться вместо того, 'потому что мы хотим %быть расширенными перед передачей в оболочку.

Feihu
источник