Как изменить режим чтения / записи для файла с помощью Emacs? - PullRequest
118 голосов
/ 08 октября 2008

Если файл настроен на режим только для чтения, как мне изменить его на режим записи и наоборот из Emacs?

Ответы [ 9 ]

172 голосов
/ 08 октября 2008

M-x только для чтения

или в более поздних версиях Emacs

M-x режим только для чтения

В моем окне Windows это Alt-x для вызова мета-приглашения и ввода «только для чтения», чтобы вызвать правильную функцию elisp.

Если вы используете привязки клавиатуры по умолчанию,

C-x C-q

(который вы читаете вслух как «Control-X Control-Q») будет иметь тот же эффект. Помните, однако, учитывая, что emacs по существу бесконечно реконфигурируем, ваш пробег может отличаться.

Вслед за комментарием: вы должны заметить, что состояние записи в буфер не меняет права на запись в файл. Если вы попытаетесь записать файл только для чтения , вы увидите сообщение с подтверждением. Однако, если вы являетесь владельцем файла, вы можете записать свои изменения без изменения прав доступа к файлу.

Это очень удобно, если вы хотите быстро изменить файл, не выполняя несколько этапов добавления разрешения на запись, записи изменений, удаления разрешения на запись. Я склонен забывать об этом последнем шаге, оставляя потенциально важные файлы открытыми для случайных изменений позже.

14 голосов
/ 09 октября 2008

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

12 голосов
/ 09 марта 2010

То, что я нашел, это M-x set-file-modes filename mode

Это работало на моей Windows Vista. Например: M-x set-file-modes <RET> ReadOnlyFile.txt <RET> 0666

7 голосов
/ 05 декабря 2014

Как упомянуто кем-то еще: M-x с переключателем только для чтения будет работать.

Однако теперь это устарело, и M-x-режим только для чтения является текущим способом сделать это, для него установлено C-x C-q связывание клавиш.

6 голосов
/ 16 октября 2008

Если только буфер (а не файл) доступен только для чтения, вы можете использовать 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.

6 голосов
/ 08 октября 2008

CTRL + X + CTRL + Q

2 голосов
/ 04 декабря 2011

Если вы смотрите каталог файлов (dired), то вы можете использовать Shift + M в имени файла и ввести modespec, те же атрибуты, что и в команде chmod.
M modespec <RET>

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

0 голосов
/ 09 декабря 2015

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.

0 голосов
/ 11 ноября 2008

Я опробовал решение Vebjorn Ljosa, и оказалось, что, по крайней мере, в моем Emacs (22.3.1) нет такой функции как «trim-right», которая используется для удаления бесполезной новой строки в конце вывод chmod.

Отмена вызова 'trim-right' помогла, но заставила строку состояния "подпрыгнуть" из-за дополнительного символа новой строки.

...