Як зберегти файл, для якого у мене немає дозволу на запис?


26

Іноді трапляється, що я відкриваю файл і вношу деякі зміни як власний користувач, не помічаючи і не «забуваючи» помічати [read-only]попередження в рядку стану (наприклад, якийсь випадковий /etcфайл конфігурації, як /etc/resolv.conf).

:w!в цьому випадку, очевидно, не вдається, тому що мій користувач не має дозволу на запис. Тож мені доводиться :w /home/filename, виходити і sudo mv ..., дуже незручно.

Чи є спосіб, щоб я тимчасово зростала до root, щоб мати можливість зберегти відкритий на даний момент файл? (з огляду на те, що я перебуваю sudoersабо / і можу suбезпосередньо)?

Відповіді:


24

Хитрість полягає у використанні зовнішнього дзвінка для sudo:

:w !sudo tee %

Як це працює:

  • :w !<command>виконується <command>із вмістом буфера як stdin.
  • teeдублює stdin у файл & stdout; %розширюється до поточного імені файлу ..
  • Ви маєте префікс sudoдля дозволів root.

Ви насправді не зберігаєте файл за допомогою Vim, скоріше ви викликаєте зовнішню програму, щоб перезаписати вміст файлу, який ви редагуєте. Ось чому ви отримаєте попередження від Vim:

W12: Warning: File "xxx" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File: 

Ви можете перетворити це на функцію:

fun! SuperWrite()
        write !sudo tee %
        " Or with :silent (but that doesn't seem to work for everyone)
        "silent write !sudo tee %
        edit!
endfun

І клавіша:

nnoremap <Leader>w! :call SuperWrite()<CR>

З su, тільки кореневий користувач може використовувати -cдля негайного виконання команди. Я не думаю, що ти можеш suце зробити, але, можливо, є хитрість, про яку я не знаю ...


SuperWriteпрацює, але це повторює файл у вас. Запустивши його :silent, ви ввели свій пароль непомітно.
TankorSmash

@TankorSmash Спасибі; оновлена ​​відповідь. Не впевнений, що ви маєте на увазі під "невидимим паролем"? Додавання, silentздається, працює добре?
Мартін Турноїй

Я не запускаю vim з sudo, так що це може бути в грі тут, але коли я переходжу до файлу sudo tee, він запрошує мене на пароль sudo. Якщо його мовчить, я не бачу підказки, але все ж потрібно ввести пароль.
TankorSmash

1
Те, що ви бачите, - це типова функціональність відлуння до stdout, а також наданий файл. Рішенням є перенаправлення stdout на / dev / null, a la: w ! tee % > /dev/null Це все одно буде перегукуватися на результат команди (один рядок), але не весь вміст буфера.
Джон Картер

Замість того, щоб використати teeпотім викинути свій вихід, чи не вийшло б, catякщо ви не хочете, щоб файл роздруковувався?
Лежати Райан

12

Я використовую таке відображення у своєму .vimrc, яке вважаю корисним:

cnoremap w!! w !sudo tee %

Це легко запам’ятати, тому що wце „пишіть”, w!це „сила запису”, і w!!це „наддупер-сила запису”. : P


1
Я давно мапив це W, але w!!має набагато більше сенсу, щоб оновити мій .vimrc. Спасибі
jalanb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.