如何使用Emacs更改文件的读/写模式?
如果一个文件被设置为只读模式,我怎样才能在Emacs中将其改写为写模式,反之亦然?
Mx切换只读
在我的Windows机器上,这相当于Alt-x调出元提示并键入“toggle-read-only”来调用正确的elisp函数。
如果您使用默认的键盘绑定,
Cx Cq
(您大声朗读为“Control-X Control-Q”)将具有相同的效果。 记住,但是,考虑到emacs本质上可以无限重新configuration,你的里程可能会有所不同。
跟着评论:你应该注意到,缓冲区的可写入状态不会改变文件的可写入权限。 如果您尝试写入只读文件 ,您将看到一条确认消息。 但是,如果您拥有该文件,则可以在不更改文件权限的情况下写出更改。
如果您想要快速更改文件,而不必经过添加写入权限,写入更改,删除写入权限等多个步骤,这非常方便。 我倾向于忘记最后一步,留下潜在的重要文件以便随后发生意外更改。
确保你没有把'文件'和'缓冲区'混淆。 您可以将缓冲区设置为只读,并使用Cx Cq
( toggle-read-only
)重新设置。 如果您有权限读取但不写入文件,则在访问文件( Cx Cf
或find-file
)时获得的缓冲区将自动处于只读模式。 如果要更改文件系统中某个文件的权限,可能需要从包含该文件的目录开始。 dired的文档可以在info中find; Ch i (emacs)dired RET
。
我发现的是Mx set-file-modes filename mode
它在我的Windows Vista框中工作。 例如: Mx set-file-modes <RET> ReadOnlyFile.txt <RET> 0666
如果只有缓冲区(而不是文件)是只读的,则可以使用toggle-read-only
,通常绑定到Cx Cq
。
但是,如果文件本身是只读的,则可能会发现以下function有用:
(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)))))
该function取决于unix-output
和trim-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)。 然后,您可以使用Mx set-buffer-file-writable
使当前Mx set-buffer-file-writable
。
正如其他人提到的那样: Mx切换只读将起作用。
但是,现在不推荐使用Mx只读模式 ,而是将其设置为Cx Cq键绑定。
CTRL + X + CTRL + Q
如果您正在查看文件目录(dired),则可以对文件名使用Shift + M
并inputmodespec
,与chmod
命令中使用的属性相同。
M modespec <RET>
查看http://www.gnu.org/s/libtool/manual/emacs/Operating-on-Files.html目录中文件的其他有用命令;
我尝试了Vebjorn Ljosa的解决scheme,结果发现至less在我的Emacs(22.3.1)中没有像trim-right这样的函数,用于在chmod输出结束时删除无用的换行符。
删除调用“修剪右”帮助,但使状态行“反弹”,因为额外的换行符。
Cx Cq
没用。 因为你也需要保存文件的权限。
我使用Spacemacs 。 这给我一个方便的function来解决这个问题。 代码如下。
(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中打开一个文件并input我的密码,我可以在没有只读模式的情况下更改文件。
你可以写一个像spacemacs/sudo-edit
这样的新function。