代码之家  ›  专栏  ›  技术社区  ›  sigjuice

如何让Emacs自动写入只读文件?

  •  4
  • sigjuice  · 技术社区  · 14 年前

    我发现自己正在编辑许多只读文件。我通常打 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 ,将保存该文件,并且该文件的权限保持为只读。

    有没有一种方法可以缩短这个过程并使之成为这样的一个过程,即简单地用C-X C-S保存一个文件,而不需要提示就可以完成整个过程?我应该调查一下插页吗 chmod 在里面 before-save-hook after-save-hook 还是有更好的方法?

    4 回复  |  直到 6 年前
        1
  •  4
  •   Trey Jackson    14 年前

    向添加呼叫 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。:)

        2
  •  3
  •   Community CDub    7 年前

    我同意Trey的观点,即在写时普遍使用chmod是有风险的——只读文件出于某种原因是只读的,imho。这里有一种方法可以在每个缓冲区的基础上具体地重写内容。它不太理想,因为它覆盖了 file-writable-p 在缓冲区的使用寿命内(或者至少在切换之前 my-override-mode-on-save 回到nil),但是它让你在一个文件一个文件的基础上做出一个有意识的决定(有点;它实际上是一个缓冲区一个缓冲区的基础,这是相当相似的)。当然,由于您希望在访问文件时自动切换只读标志,因此您可能对这种区别不感兴趣。尽管如此,它还是在这里;尽情享受它,或者随意忽略它。

    (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 ad-return-value 中的指针 other SO question .

        3
  •  1
  •   fakedrake    11 年前

    因为我发现经常提醒我要编辑一个我没有权限的文件很有用,所以当我在缓冲区中打开一个文件时,我想强迫自己主动地使缓冲区可写。 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))
    
        4
  •  0
  •   Manuel Rozier    6 年前

    因为某种原因,我不能确定特雷·杰克逊 solution 无法在Windows下的GNU Emacs 25.2上工作: 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))               
    )