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


Answers:


178

Mx切换只读

或更新的Emacs版本

Mx只读模式

在我的Windows机器上,相当于Alt-x弹出meta提示,然后键入“ toggle-read-only”以调用正确的elisp函数。

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

Cx Cq

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

注释的后续内容:您应注意,缓冲区的可写状态不会更改文件的可写权限。如果您尝试写出一个只读文件,则会看到一条确认消息。但是,如果您拥有该文件,则可以在更改文件权限的情况下写出您的更改。

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


5
嗨,如jfm3的回答所述,toggle-read-only仅切换缓冲区的只读状态,而不切换文件的只读状态。如果要更改文件的模式,请使用dired或在文件上chmod +w作为shell命令执行。
danielpoe

没错,这就是更改模式的方式。但是,如果您在指向您拥有的只读文件的缓冲区上切换只读模式,则可以对其进行编辑并写出您的更改(当然会有一个确认问题)。
鲍勃·克罗斯

对以上评论进行了跟进,并在答案中添加了文字。
Bob Cross

5
在最新版本的Emacs中,切换只读已被替换为只读模式。
本·基

15

确保您不会将“文件”与“缓冲区”混淆。您可以将缓冲区设置为只读,然后使用C-x C-qtoggle-read-only)再次返回。如果您具有读取(而非写入)文件的权限,则访问文件(C-x C-ffind-file)时获得的缓冲区将自动置于只读模式。如果要更改文件系统中文件的权限,则可能从dired包含该文件的目录开始。有关信息的内容,请参见信息。C-h i (emacs)dired RET


inc。教一个人钓鱼...
user234461


7

正如其他人提到的那样:Mx切换为只读将起作用。

但是,现在不建议这样做,并且将Mx只读模式设置为Cx Cq键绑定是当前的操作方式。



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


当我尝试使用此代码编译.emacs时,收到消息“警告:保存缓冲区被set-buffer打败”。
艾伦(Alan)

1
@Alan,编辑后放在set-buffer外面save-excursion
Vebjorn Ljosa

感谢您所做的更改,该更改消除了警告。但是,还有另外一个:“警告:cl包中的函数'subseq'在运行时调用。” 即使我在.emacs中添加了(eval-when-compile(require'cl)),也无法摆脱它。
艾伦(Alan)

看到这个线程。我已经编辑了代码subseqsubstring现在替换了。那应该避免警告。
Vebjorn Ljosa

现在,我转到Emacs 24,我收到消息“警告:未知函数'decf'的定义。”
艾伦(Alan)


0

我试用了Vebjorn Ljosa的解决方案,结果证明至少在我的Emacs(22.3.1)中没有诸如“ trim-right”之类的功能,该功能用于在chmod输出末尾删除无用的换行符。

删除对“ trim-right”的调用很有帮助,但是由于多余的换行符,使状态行“ bounce”。


忘记包括它…现在添加。
Vebjorn Ljosa

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.