如何使用Emacs更改文件的读/写模式?

时间:2008-10-08 00:08:37

标签: emacs file file-permissions

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

9 个答案:

答案 0 :(得分:170)

  

M-x toggle-read-only

或更新版本的Emacs

  

M-x只读模式

在我的Windows框中,相当于Alt-x以显示元提示并输入“toggle-read-only”来调用正确的elisp函数。

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

  

C-x C-q

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

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

如果您想快速更改文件而不必经过添加写入权限,写出更改,删除写入权限的多个步骤,这将非常方便。我倾向于忘记最后一步,将潜在的关键文件留待以后进行意外更改。

答案 1 :(得分:14)

请确保您不会将'file'与'buffer'混淆。您可以将缓冲区设置为只读,然后使用C-x C-qtoggle-read-only)重新设置。如果您有权读取文件,但不能写入文件,则访问文件(C-x C-ffind-file)时获得的缓冲区将自动置于只读模式。如果要更改文件系统中文件的权限,可以在包含该文件的目录上以dired开头。 dired的文档可以在info中找到; C-h i (emacs)dired RET

答案 2 :(得分:12)

我找到的是M-x set-file-modes filename mode

它在我的Windows Vista框中运行。 例如:M-x set-file-modes <RET> ReadOnlyFile.txt <RET> 0666

答案 3 :(得分:7)

正如其他人所说: M-x切换只读可行。

但是,现在已弃用此功能, Mx只读模式是当前的方法,它设置为 Cx Cq 键绑定。

答案 4 :(得分:6)

CTRL + X + CTRL + Q

答案 5 :(得分:6)

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

将功能放在M-x set-buffer-file-writable中,评估它们(或重新启动emacs)。然后,您可以使用{{1}}将当前缓冲区中的文件写入。

答案 6 :(得分:2)

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

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

答案 7 :(得分:0)

我尝试了Vebjorn Ljosa的解决方案,事实证明至少在我的Emacs(22.3.1)中没有'trim-right'这样的功能,用于在结束时移除无用的换行符。 chmod输出。

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

答案 8 :(得分:0)

NumPy没用。因为您还需要保存文件的权限。

我使用Spacemacs。它为我提供了解决这个问题的便捷功能。代码如下。

C-x C-q

我呼叫(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)))) 在emacs中打开文件并输入我的密码,我可以在没有只读模式的情况下更改文件。

您可以编写一个新功能,例如spacemacs/sudo-edit