Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

C-x C-q

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

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

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

Ответ 2

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

Ответ 3

Я нашел M-x set-file-modes filename mode

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

Ответ 4

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

Ответ 5

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

Однако это теперь устарело, а Mx только для чтения-режим - это текущий способ сделать это, что для него установлено Cx Cq.

Ответ 6

CTRL + X + CTRL + Q    

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

C-x C-q бесполезен. Поскольку вам также необходимо разрешение на сохранение файла.

Я использую Spacemacs. Это дает мне удобную функцию для решения этого вопроса. Следующий код.

(defun spacemacs/sudo-edit (&optional arg)
  (interactive "p")
  (if (or arg (not buffer-file-name))
      (find-file (concat "/sudo:[email protected]:" (ido-read-file-name "File: ")))
    (find-alternate-file (concat "/sudo:[email protected]:" buffer-file-name))))

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

Вы можете написать новую функцию, например spacemacs/sudo-edit.