2010-06-19 70 views
4

我發現自己編輯了很多隻讀的文件。我通常打C-x C-q致電toggle-read-only。然後我打C-x C-s保存和獲取,如何讓emacs自動寫入只讀文件?

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

y後,保存文件和文件的權限仍是隻讀的。

有沒有辦法縮短這個過程,並使之簡單地使用C-x C-s保存文件,而不用提示就能完成整個過程?我應該考慮在before-save-hookafter-save-hook中插入chmod還是有更好的方法?

+0

我試圖拿出你某一替代品更有針對性,並試圖勸原始'文件寫的時候我已經在一些奇怪的行爲打-p'。你可以按照你想要的其他問題:http://stackoverflow.com/questions/3075862/how-to-advise-primitives-in-emacs – 2010-06-19 14:46:10

回答

4

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

+0

我能做些什麼來自動切換隻讀?是否有一個鉤子在訪問文件時觸發? – sigjuice 2010-06-19 05:07:07

+0

@sigjuice有一個'find-file-hook'你可以使用。 – 2010-06-19 05:12:11

3

我同意Trey普遍做一個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.感謝Trey爲other SO question中的ad-return-value指針。

1

因爲我覺得有用的是不斷地提醒我即將編輯一個我沒有權限的文件,當我在緩衝區中打開一個文件時,我想強制自己主動將緩衝區寫成C-x 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))