128

如果文件设置为只读模式,我如何在 Emacs 中将其更改为写入模式,反之亦然?

4

9 回答 9

180

Mx 只读模式

在非常旧的 Emacs 版本中,命令是:

Mx 切换只读

在我的 Windows 机器上,这相当于 Alt-x 来调出元提示并键入“只读模式”来调用正确的 elisp 函数。

如果您使用默认键盘绑定,

Cx Cq

(您大声朗读为“Control-X Control-Q”)将具有相同的效果。但是请记住,鉴于 emacs 本质上是无限可重新配置的,您的里程可能会有所不同。

从评论跟进:您应该注意缓冲区的可写状态不会改变文件的可写权限。如果您尝试写入只读文件,您将看到一条确认消息。但是,如果您拥有该文件,则可以在不更改文件权限的情况下写出您的更改。

如果您想快速更改文件,而无需执行添加写入权限、写出更改、删除写入权限等多个步骤,这将非常方便。我倾向于忘记最后一步,留下潜在的关键文件以供以后意外更改。

于 2008-10-08T00:10:47.930 回答
15

确保您没有将“文件”与“缓冲区”混淆。C-x C-q您可以使用( )将缓冲区设置为只读并再次返回toggle-read-only。如果您有权读取但不能写入文件,则访问该文件(C-x C-ffind-file)时获得的缓冲区将自动置于只读模式。如果要更改文件系统中文件的权限,可能从dired包含该文件的目录开始。dired 的文档可以在 info 中找到;C-h i (emacs)dired RET.

于 2008-10-09T15:52:31.460 回答
13

我发现的是M-x set-file-modes filename mode

它在我的 Windows Vista 机器上工作。例如:M-x set-file-modes <RET> ReadOnlyFile.txt <RET> 0666

于 2010-03-09T10:19:30.687 回答
7

CTRL + X+CTRL + Q     

于 2008-10-08T00:13:34.880 回答
7

正如其他人在那里提到的那样:Mx toggle-read-only可以工作。

但是,现在已弃用,而Mx 只读模式是当前的执行方式,即设置为Cx Cq键绑定。

于 2014-12-05T13:45:26.430 回答
6

如果只有缓冲区(而不是文件)是只读的,则可以使用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-outputtrim-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.

于 2008-10-16T14:30:25.430 回答
3

如果您正在查看文件目录(dired),则可以Shift + M在文件名上使用并输入命令modespec中使用的相同属性chmod
M modespec <RET>

http://www.gnu.org/s/libtool/manual/emacs/Operating-on-Files.html的目录列表中查看其他有用的文件命令

于 2011-12-04T00:14:54.527 回答
0

我尝试了 Vebjorn Ljosa 的解决方案,结果发现至少在我的 Emacs (22.3.1) 中没有“trim-right”这样的功能,用于在 chmod 输出末尾删除无用的换行符。

删除对 'trim-right' 的调用有所帮助,但由于额外的换行符而使状态行“反弹”。

于 2008-11-11T07:50:00.227 回答
0

C-x C-q没用。因为您还需要保存文件的权限。

我使用Spacemacs。它给了我一个方便的功能来解决这个问题。代码如下。

(defun spacemacs/sudo-edit (&optional arg)
  (interactive "p")
  (if (or arg (not buffer-file-name))
      (find-file (concat "/sudo:root@localhost:" (ido-read-file-name "File: ")))
    (find-alternate-file (concat "/sudo:root@localhost:" buffer-file-name))))

我打电话spacemacs/sudo-edit在emacs中打开一个文件并输入我的密码,我可以在没有只读模式的情况下更改文件。

您可以编写一个新函数,例如spacemacs/sudo-edit.

于 2015-12-09T07:32:27.207 回答