簡體   English   中英

如何讓emacs自動寫入只讀文件?

[英]How do I get emacs to write to read-only files automatically?

我發現自己編輯了許多只讀的文件。 我經常點擊Cx Cq來調用toggle-read-only 然后我點擊Cx Cs保存並獲取,

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

點擊y ,文件將被保存,文件的權限保持為只讀。

有沒有辦法縮短這個過程,並使它只是保存一個Cx Cs文件完成所有事情沒有提示? 我應該考慮在before-save-hookafter-save-hook插入chmod還是有更好的方法?

before-save-hook添加對chmod的調用將是實現此目的的簡潔方法。 沒有任何設置可以更改以避免權限檢查。

根據后續問題,聽起來您希望在打開時自動將文件更改為可寫。 這段代碼可以解決問題:

(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。 :)

我同意Trey的看法,普遍認為寫一個chmod是有風險的 - 只讀文件是只讀的有一個原因,恕我直言。 這是一種在每個緩沖區的基礎上專門覆蓋事物的方法。 它不是理想的,因為它在緩沖區的生命周期中覆蓋了file-writable-p (或者至少在你將my-override-mode-on-save切換回nil之前),但它會讓你有意識地決定一個文件-by-file basis(sort-of;它實際上是一個緩沖區的緩沖區,非常相似)。 當然,因為您希望在訪問文件時自動切換只讀標志,所以您可能對這種區別不感興趣。 不過,這里是; 享受它或者像你一樣忽略它。

(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))

PS感謝Trey在另一個SO問題中ad-return-value指針。

因為我發現不斷提醒我即將編輯一個我沒有權限的文件很有用,當我在緩沖區中打開一個文件時,我想強迫自己主動使緩沖區可寫為Cx q 然后手動打開它是非常繁瑣的,所以我建議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))

出於某種原因,我無法確定Trey Jackson 解決方案在我的gnu emacs 25.2下無法正常工作:從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))               
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM