Как изменить режим чтения / записи для файла с помощью Emacs?


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

9 112

9 ответов:

M-x toggle-read-only

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

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

в моем окне Windows это равносильно Alt-x, чтобы вызвать приглашение meta и ввести "toggle-read-only" для вызова правильной функции elisp.

Если вы используете комбинации клавиш по умолчанию:

C-x C-q

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

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

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

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

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

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

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

Как говорили там кто-то другой: M-x toggle-read-only будет работать.

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

CTRL + X + CTRL + Q

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

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

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

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

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.