Використовуючи vim, щоб примусити редагувати файл під час відкриття без дозволів


51

Я використовую vim для редагування файлу. Іноді я забуваю мати відповідні дозволи. Я запускаю vim та файл як файл лише для читання. Я можу вносити зміни, але фактично не можу їх змінити. Раз у раз я відкриваю файл і вношу зміни до нього, усвідомлюю, що я його не запускаю в судо, кричу собі, а потім змушую вийти та відкрити його знову як користувач root.

Чи існує рішення для цього? Чи можу я примусити зміни до файлу, незважаючи на стан файлу лише для читання? Чи можу я принаймні зберегти зміни, запустити diff та об'єднати файли разом?


3
Здається, на це питання вже відповіли тут: stackoverflow.com/questions/1005/…
Осінній

Мої вибачення. Я не знайшов такої відповіді. Дякую.
andor kesselman

3
Використовуйте [Vim write with sudo trick] [1]: w! Sudo tee% [1]: stackoverflow.com/questions/2600783/…
Mattias Åslund

Відповіді:


81

Здається, є кілька різних підходів, залежно від вашої поточної проблеми:

  1. Читайте лише від vi. Якщо ваш файл є, :set readonlyви можете
    • Використовувати :w!для примусового запису, або
    • Видайте, :set noreadonlyа потім просто використовуйте звичайне:w
  2. Дозвіл проблеми ( Sudo ) , ви не можете писати , але у вас є права SUDO.
    • Випуск: :w !sudo tee %. Це дозволить записати буфер teeв команду, яка отримує інформацію про трубу і може записувати у файли. Оскільки трійник працює з судо повноваженнями, трійник може змінювати файл.
  3. Дозвіл проблеми ( немає Судо ): ви не маєте права на запис в файл , і ви не маєте права адміністратора.
    • Використовуйте :w! ~/tempfile.extдля запису змін у тимчасовий файл, а потім вживайте заходів для переміщення тимчасового файлу до каталогу (надішліть тимчасовий файл власнику / адміністратору каталогу).

Більше про це можна прочитати тут:

  1. З StackOverflow
  2. Від Geekyboy
  3. З даних Агаріка

Ярлик

Оскільки це часто проблема №2 ( проблема дозволу , з судо ), ви можете /etc/vim/vimrc(або ~/.vimrc) вказати наступний ярлик:

  • cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!

Тоді ви можете просто набрати, :w!!щоб заощадити за допомогою судо . Я не поясню це тут, але посилання вище стосуються багатьох ярликів.


1
І з вашим анонімним начебто я щойно заслужив значок некроманта! Дякую! Мені зараз подобається захищати Мордор. ;)
Д-р Беко

5

Я можу придумати два способи зробити це.

Перший спосіб передбачає, що ви володієте файлом, але файл - НАЙКРАДНО.

Просто використовуйте суфікс вигукального знака vi до команди write (: w!), Щоб змусити перезаписати власний файл READONLY. Звичайно, це передбачає, що у вас є дозвіл на запис та виконання у поточній папці.

:w!

призведе до того, що vi перезапише оригінальний файл НАЙДІЛЬНО

Другий спосіб передбачає, що хтось інший володіє файлом, і ви хочете зберегти свої зміни у цьому файлі.

Один із способів досягти цього - зберегти зміни, внесені до вихідного файлу, у вигляді редактору сценарію зсередини vi. Цей сценарій редагування може бути застосований до оригінального файлу (або інших подібних файлів) пізніше за межами vi з редактором рядка ed.

Спосіб збереження поточного сеансу редагування як редагування сценарію - це передавання вихідного імені файлу та відредагованого буфера vi в якості стандартного вводу до утиліти diff за допомогою перемикача командного рядка --ed, тобто відображення відмінностей як сценарію ed.

Отже, припускаючи відредагований буфер vi, виконайте наступне

:.,$!diff --ed [original_file] -

Це замінює всі рядки в поточному буфері (., $!) Розробленим сценарієм ed (diff --ed [original_file] -), необхідним для перетворення оригінального файлу у вміст поточного буфера. Потім ми хочемо зберегти цей ed-скрипт у безпечному місці та застосувати його до версії оригінального файлу, до якого ми можемо записати. Отже, збережіть скрипт у потрібному для запису місці, наприклад, у свою папку для входу:

:w ~/my_ed_script

Тепер вийдіть з vi та використовуйте цей скрипт ed, щоб отримати відредагований файл, який не вдалося зберегти в першу чергу. Ось як це зробити з командного рядка bash, '$':

$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file

Ця послідовність команд у словах полягає в тому, щоб катетувати сценарій, який ми створили з розрізненням, і повторює команду ed, «w», на стандартне введення ed. Потім Ед застосовує цей скрипт до записуваної копії оригінального файлу і записує ці зміни зміненого буфера назад у файл.

Таким чином, це спосіб зберегти роботу, виконану в vi, у файл, який спочатку належав хтось іншим, використовуючи vi, diff та ed.


1

Просто хочу висвітлити випадок, коли немає дозволів на запис файлів.

:!chmod +w %
:w!

Між тим vim поскаржиться на зміни у файлі (через зміну прапорів) - їх, очевидно, безпечно ігнорувати


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