Ответ 1
Попробуйте
:w !sudo tee %
w !
берет весь файл и передает его в команду оболочки. Команда оболочки sudo tee
, которая запускает tee
как суперпользователь. %
заменяется на текущее имя файла.
Хорошо, так что это происходит со мной все время. Должно быть лучшее решение. Скажем, вы делаете vim /etc/somefile.conf
, а затем вы делаете i
, но понимаете, что вы не sudo
, и вы не можете писать. Поэтому я теряю свои изменения, выполняя :q
, затем sudo !!
и снова меняю свои изменения. Есть ли лучший способ сделать это?
Попробуйте
:w !sudo tee %
w !
берет весь файл и передает его в команду оболочки. Команда оболочки sudo tee
, которая запускает tee
как суперпользователь. %
заменяется на текущее имя файла.
Сохраните файл в другом месте (например, в домашней папке), а затем sudo mv
его, чтобы перезаписать оригинал?
Сохраните изменения в качестве другого файла и сделайте замену approrpiate.
Когда vim запускается, в строке состояния указано [readonly]
, и при первом попытке редактирования он говорит W10: Warning: Changing a readonly file
и делает паузу в течение полной секунды. Этого достаточно для предупреждения, чтобы я ушел и сказал sudoedit /etc/somefile.conf
.
Вы можете принудительно выполнить это с помощью плагина: Сделать файл, совместимый с файлом соответствия файла состояния read.
В зависимости от объема ваших изменений может быть быстрее сохранить (:w
) ваш файл с другим именем, а затем использовать sudo
и cat
для перезаписи содержимого исходного файла:
sudo sh -c 'cat changed > file'
Обратите внимание, что оба cp
и mv
заменят исходный файл, и его атрибуты (права собственности, разрешения, списки управления доступом) будут потеряны. Не используйте их, если вы не знаете, как исправить разрешения после этого.
Я использую шаблоны zsh и завершение функции.
В частности этот. Если у меня нет прав на запись, он запрашивает мой пароль sudo и автоматически запускает "sudo vim"... среди прочего.
Я использовал это:
function! SaveAsSudo()
let v=winsaveview()
let a=system("stat -c \%a " . shellescape(expand('%')))
let a=substitute(a,"\n","","g")
let a=substitute(a,"\r","","g")
call system("sudo chmod 666 " . shellescape(expand('%')))
w
call system("sudo chmod " . a . " " . shellescape(expand('%')))
call winrestview(v)
endfunction
Я отобразил <F2>
на :w<CR>
. и <F8>
до :call SaveAsSudo()<CR>
Только преимущество, предоставляемое этим опцией sudo tee
, заключается в следующем: vim
не жалуется на несохраненный буфер или файл, модифицированный извне.