Как заставить emacs автоматически писать в файлы только для чтения? - PullRequest
4 голосов
/ 19 июня 2010

Я обнаружил, что редактирую множество файлов, доступных только для чтения.Я обычно нажимаю C-x C-q, чтобы позвонить toggle-read-only.Затем я нажимаю C-x C-s, чтобы сохранить и получить,

File foo.txt is write-protected; try to save anyway? (y or n)

После нажатия y файл сохраняется, и разрешения для файла остаются доступными только для чтения.способ сократить этот процесс и сделать так, чтобы простое сохранение файла с помощью Cx Cs делало все без запроса?Стоит ли вставлять chmod в before-save-hook и after-save-hook или есть лучший способ?

Ответы [ 4 ]

4 голосов
/ 19 июня 2010

Добавление вызова к chmod в before-save-hook было бы чистым способом сделать это.Нет никаких настроек, которые вы можете изменить, чтобы избежать проверки прав доступа.

Исходя из следующего вопроса, звучит так, будто вы хотите, чтобы файлы автоматически изменялись на запись при открытии.Этот код помогает:

(defun change-file-permissions-to-writable ()
  "to be run from find-file-hook, change write permissions"
  (when (not (file-writable-p buffer-file-name))
    (chmod buffer-file-name (file-modes-symbolic-to-number "u+w" (nth 8 (file-attributes buffer-file-name))))
    (if (not (file-writable-p buffer-file-name))
        (message "Unable to make file writable."))))

(add-hook 'find-file-hook 'change-file-permissions-to-writable)

Примечание. Когда я тестировал его на своем компьютере с Windows, разрешения на файл не отображались до тех пор, пока я не попытался сохранить буфер, но он работал как ожидалось.Лично мне не нравится эта настройка, но это ваш Emacs.:)

3 голосов
/ 20 июня 2010

Я согласен с Треем, что универсальное выполнение chmod при записи рискованно - файлы только для чтения по какой-то причине доступны только для чтения, ИМХО. Вот способ специально переопределить вещи для каждого буфера. Он не идеален в том смысле, что он переопределяет file-writable-p на весь срок службы буфера (или, по крайней мере, до тех пор, пока вы не переключите my-override-mode-on-save обратно на ноль), но он заставляет вас принимать осознанное решение для каждого файла отдельно из; это действительно буфер за буфером, что довольно похоже). Конечно, поскольку вы хотите автоматически переключать флаг «только для чтения» при посещении файла, вас может не заинтересовать это различие. Тем не менее, вот оно; наслаждайся этим или игнорируй как хочешь.

(make-variable-buffer-local
 (defvar my-override-mode-on-save nil
   "Can be set to automatically ignore read-only mode of a file when saving."))

(defadvice file-writable-p (around my-overide-file-writeable-p act)
  "override file-writable-p if `my-override-mode-on-save' is set."
  (setq ad-return-value (or
                         my-override-mode-on-save
                         ad-do-it)))

(defun my-override-toggle-read-only ()
  "Toggle buffer's read-only status, keeping `my-override-mode-on-save' in sync."
  (interactive)
  (setq my-override-mode-on-save (not my-override-mode-on-save))
  (toggle-read-only))

P.S. Спасибо Трею за указатель ad-return-value в другом SO вопросе .

1 голос
/ 25 июня 2013

Так как мне полезно постоянно напоминать о том, что я собираюсь редактировать файл, к которому у меня нет прав, при открытии файла в буфере я хочу принудительно сделать буфер активным для записи с помощью C-x q,Однако открывать его с помощью tramp вручную довольно утомительно, поэтому я советую save-buffer запросить у меня пароль, если он не сможет записать.Я настоятельно рекомендую поместить этот фрагмент в ваш .emacs

(defadvice save-buffer (around save-buffer-as-root-around activate)
  "Use sudo to save the current buffer."
  (interactive "p")
  (if (and (buffer-file-name) (not (file-writable-p (buffer-file-name))))
      (let ((buffer-file-name (format "/sudo::%s" buffer-file-name)))
    ad-do-it)
    ad-do-it))
0 голосов
/ 08 августа 2018

По какой-то причине я не смог определить, что решение Trey Jackson не работает на моем gnu emacs 25.2 под windows: file-modes-rights-to-number, вызванный из file-modes-rights-to-number, не работает.Если кто-то застрянет с той же проблемой, он может использовать менее элегантное, но работающее решение, заменив блок:

(chmod buffer-file-name (file-modes-symbolic-to-number "u+w" (nth 8 (file-attributes buffer-file-name))))

на блок:

(cond ((or (eq system-type 'ms-dos) (eq system-type 'windows-nt))
              (progn
                (shell-command-to-string (concat "attrib -R " (buffer-file-name (current-buffer))))
                (message "Setting file and buffer to writeable (%s style)" system-type)
              ))
           ((eq system-type 'gnu/linux)
              (progn
              (shell-command-to-string (concat "chmod u+w " (buffer-file-name (current-buffer))))
              (message "Setting file and buffer to writeable (%s style)" system-type)
             ))
           (t (message "file permission change not handle for OS %s" system-type))               
)
...