Як змінити режим читання / запису для файлу за допомогою Emacs?


126

Якщо файл встановлений лише в режимі читання, як я можу змінити його на режим запису і навпаки зсередини Emacs?

Відповіді:


178

Mx перемикання - лише для читання

або в останніх версіях Emacs

Mx-режим лише для читання

У моєму вікні Windows це дорівнює Alt-x, щоб відкрити мета-підказку та ввести "тільки для читання", щоб викликати правильну функцію elisp.

Якщо ви використовуєте типові прив’язки клавіатури,

Cx Cq

(який ви читаєте вголос як "Control-X Control-Q") матиме такий же ефект. Пам’ятайте, однак, враховуючи, що emacs по суті нескінченно перенастроюється, ваш пробіг може змінюватися.

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

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


5
Привіт, як зазначено у відповіді від jfm3, toggle-read-onlyлише перемикає стан лише для читання буфера, а не файлу. Якщо ви хочете змінити режим файлу, використовуйте diredабо виконайте chmod +wяк команду оболонки у файлі.
danielpoe

Правда, саме так ви б змінили режим. Однак якщо ви перемкнете режим лише для читання на буфері, який вказує на власний файл, який є лише для читання, ви зможете відредагувати його та записати свої зміни (звичайно, виникне питання підтвердження).
Боб Крос,

Слідкуйте за коментарями вище та додайте текст до відповіді.
Боб Крос

5
В останніх версіях Emacs режим перемикання лише для читання замінено режимом лише для читання.
Бен Кі

15

Будьте впевнені, що ви не плутаєте "файл" з "буфером". Ви можете встановити буфери лише для читання та повернути знову за допомогою C-x C-q( toggle-read-only). Якщо у вас є дозвіл на читання, але не запис, файл, буфер, який ви отримаєте під час відвідування файлу ( C-x C-fабо find-file), буде автоматично переведений у режим лише для читання. Якщо ви хочете змінити дозволи на файл у файловій системі, можливо, почніть з diredкаталогу, який містить файл. Документацію для заточених можна знайти в інформації; C-h i (emacs)dired RET.


inc. Навчіть людину ловити рибу ...
user234461

12

Що я знайшов - це M-x set-file-modes filename mode

Він працював у моєму вікні Windows Vista. Наприклад:M-x set-file-modes <RET> ReadOnlyFile.txt <RET> 0666


На мою думку, це правильна відповідь на точне запитання.
Матіас Дал

1
У Elisp це спрацювало: (set-file-modes FILE 438)(де 438 - десятковий еквівалент 2#0110110110або 666).
Каушал Моді

7

Як згадував там хтось інший: Mx перемикання читання лише для роботи.

Однак це тепер застаріло, і Mx-режим лише для читання - це поточний спосіб зробити це, якщо він встановлений на Cx Cq-прив'язку клавіш.



6

Якщо лише буфер (а не файл) доступний лише для читання, ви можете використовувати toggle-read-only, до якого зазвичай пов'язано C-x C-q.

Якщо сам файл лише для читання, вам може бути корисна наступна функція:

(defun set-buffer-file-writable ()
  "Make the file shown in the current buffer writable.
Make the buffer writable as well."
  (interactive)
  (unix-output "chmod" "+w" (buffer-file-name))
  (toggle-read-only nil)
  (message (trim-right '(?\n) (unix-output "ls" "-l" (buffer-file-name)))))

Функція залежить від unix-outputта trim-right:

(defun unix-output (command &rest args)
  "Run a unix command and, if it returns 0, return the output as a string.
Otherwise, signal an error.  The error message is the first line of the output."
  (let ((output-buffer (generate-new-buffer "*stdout*")))
    (unwind-protect
     (let ((return-value (apply 'call-process command nil
                    output-buffer nil args)))
       (set-buffer output-buffer)
       (save-excursion 
         (unless (= return-value 0)
           (goto-char (point-min))
           (end-of-line)
           (if (= (point-min) (point))
           (error "Command failed: %s%s" command
              (with-output-to-string
                  (dolist (arg args)
                (princ " ")
                (princ arg))))
           (error "%s" (buffer-substring-no-properties (point-min) 
                                   (point)))))
         (buffer-substring-no-properties (point-min) (point-max))))
      (kill-buffer output-buffer))))

(defun trim-right (bag string &optional start end)
  (setq bag (if (eq bag t) '(?\  ?\n ?\t ?\v ?\r ?\f) bag)
    start (or start 0)
    end (or end (length string)))
  (while (and (> end 0)
          (member (aref string (1- end)) bag))
    (decf end))
  (substring string start end))

Розмістіть функції у своїх ~/.emacs.el, оцініть їх (або перезавантажте emacs). Потім ви можете зробити файл у поточному буфері для запису M-x set-buffer-file-writable.


Коли я намагаюся скласти свої .emacs з цим кодом, я отримую повідомлення "Попередження: збереження-екскурсія переможена set-buffer".
Алан

1
@Alan, відредагований для розміщення set-bufferзовнішньої сторінки save-excursion.
Вебйорн Льоза

спасибі за ту зміну, яка усунула попередження. Однак є ще одне: "Увага: функція` subseq 'з пакета cl, який викликається під час виконання. " Я не міг цього позбутися, навіть коли додав (eval-when-compile (вимагаю 'cl)) до своїх .emacs.
Алан

Дивіться цю нитку . Я редагував код і замінити subseqз substringкомпанією. Це повинно уникати попередження.
Вебйорн Льоса

Тепер, коли я перейшов до Emacs 24, я отримую повідомлення "Попередження: функція` decf ", як відомо, не визначена."
Алан

3

Якщо ви дивитесь на каталог файлів (dired), то можете скористатися Shift + Mім'ям файлу та ввести modespecті самі атрибути, які використовувались у chmodкоманді.
M modespec <RET>

Дивіться інші корисні команди для файлів у списку каталогів за адресою адресою http://www.gnu.org/s/libtool/manual/emacs/Operating-on-Files.html


0

Я спробував рішення Vebjorn Ljosa, і виявилося, що принаймні в моєму Emacs (22.3.1) немає такої функції, як "trim-right", яка використовується для видалення марного нового рядка в кінці виходу chmod.

Видалення виклику "обрізати право" допомогло, але рядок статусу "відскочив" через додатковий новий рядок.


Забули включити його… додано зараз.
Вебйорн Льоса

0

C-x C-qмарно. Тому що вам також потрібен дозвіл на збереження файлу.

Я використовую Spacemacs . Це дає мені зручну функцію для вирішення цього питання. Код наступний.

(defun spacemacs/sudo-edit (&optional arg)
  (interactive "p")
  (if (or arg (not buffer-file-name))
      (find-file (concat "/sudo:root@localhost:" (ido-read-file-name "File: ")))
    (find-alternate-file (concat "/sudo:root@localhost:" buffer-file-name))))

Я дзвоню spacemacs/sudo-edit відкрити файл в emacs і ввести свій пароль, я можу змінити файл без режиму лише для читання.

Ви можете написати нову функцію на кшталт spacemacs/sudo-edit.

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