Emacs 如何防止内置el文件在Windows上被意外编辑

Emacs 如何防止内置el文件在Windows上被意外编辑,emacs,Emacs,在Linux上,内置el文件都是只读的,因此没有问题 但在MS Windows上,情况是这样的: 我对命令isearch forward的定义感到好奇,因此我键入ctrl-hf isearch forward并单击帮助中的链接isearch.el以获得函数的定义。 在阅读其定义时,我多次按ctrl-h或ctrl-c,但我以前将Caps Lock设置为另一个ctrl键,因此有时我过早地释放Caps Lock,在这种情况下,ctrl-h或ctrl-c变为插入h或c。 有时我会注意到这一点并将其撤消,

在Linux上,内置el文件都是只读的,因此没有问题

但在MS Windows上,情况是这样的:

我对命令isearch forward的定义感到好奇,因此我键入ctrl-hf isearch forward并单击帮助中的链接isearch.el以获得函数的定义。 在阅读其定义时,我多次按ctrl-h或ctrl-c,但我以前将Caps Lock设置为另一个ctrl键,因此有时我过早地释放Caps Lock,在这种情况下,ctrl-h或ctrl-c变为插入h或c。 有时我会注意到这一点并将其撤消,但有时我没有注意到,甚至会使用ctrl-xs保存它们。
在MS Windows上保护内置el文件不被我看到的好方法是什么?

将权限更改为只读

M-x find-function isearch-forward RET
M-x dired RET
% m . RET
M -w RET
序列将打开文件isearch.el,然后在其目录中使用dired。此时将标记所有文件,然后将权限更改为只读

c:/Program Files/Emacs/emacs/lisp/emacs-lisp/lisp-mode.el
c:/Program Files/Emacs/EmacsW32/lisp/w32shell.el
您还需要为子目录执行此操作。因此,启动一个宏并运行它,直到完成为止

从您在上面创建的lisp-dired缓冲区开始,转到下面的第一个文件。然后,开始:

C-x (
>
RET
% m . RET
M -w RET
q
C-x )
在这里,您定义了一个宏,用于转到下一个目录,输入它,将其所有文件标记为只读,然后离开该目录。现在为Emacs 23.1运行它几次20

C-u 20 C-x e RET
你完成了

如果你有一个cygwin外壳,那就容易多了

M-x shell
cd c:/Program\ Files/emacs-23.1/lisp/
chmod -R -w .

将权限更改为只读

M-x find-function isearch-forward RET
M-x dired RET
% m . RET
M -w RET
序列将打开文件isearch.el,然后在其目录中使用dired。此时将标记所有文件,然后将权限更改为只读

c:/Program Files/Emacs/emacs/lisp/emacs-lisp/lisp-mode.el
c:/Program Files/Emacs/EmacsW32/lisp/w32shell.el
您还需要为子目录执行此操作。因此,启动一个宏并运行它,直到完成为止

从您在上面创建的lisp-dired缓冲区开始,转到下面的第一个文件。然后,开始:

C-x (
>
RET
% m . RET
M -w RET
q
C-x )
在这里,您定义了一个宏,用于转到下一个目录,输入它,将其所有文件标记为只读,然后离开该目录。现在为Emacs 23.1运行它几次20

C-u 20 C-x e RET
你完成了

如果你有一个cygwin外壳,那就容易多了

M-x shell
cd c:/Program\ Files/emacs-23.1/lisp/
chmod -R -w .
看一看。这应该满足您的需要:

(dir-locals-set-class-variables
 'read-only '((nil (buffer-read-only . t))))
(dir-locals-set-directory-class
 source-directory 'read-only)
相应地更改源目录。

查看。这应该满足您的需要:

(dir-locals-set-class-variables
 'read-only '((nil (buffer-read-only . t))))
(dir-locals-set-directory-class
 source-directory 'read-only)

相应地更改源目录。

打开cmd.exe提示符,然后执行以下操作:

c:\> cd \emacs\lisp
c:\emacs\lisp> find -name "*.el" -exec attrib +R {} ;

您需要一个find.exe实用程序。我使用。

打开cmd.exe提示符,然后执行以下操作:

c:\> cd \emacs\lisp
c:\emacs\lisp> find -name "*.el" -exec attrib +R {} ;

您需要一个find.exe实用程序。我使用了中的一个。

我决定使用变量buffer read only-on-load使el源缓冲区只读

(defun my-make-some-read-only ()
  (if (and buffer-file-name
       (or
        (string-match-p "/emacs/lisp/" buffer-file-name)
        (string-match-p "/EmacsW32/lisp/" buffer-file-name)))
      (setq buffer-read-only t)))
(add-hook 'emacs-lisp-mode-hook 'my-make-some-read-only)
如果上面的代码在dotemacs中,则el文件中的缓冲区设置为只读

c:/Program Files/Emacs/emacs/lisp/emacs-lisp/lisp-mode.el
c:/Program Files/Emacs/EmacsW32/lisp/w32shell.el

我决定使用变量buffer read only-on-load使el源缓冲区只读

(defun my-make-some-read-only ()
  (if (and buffer-file-name
       (or
        (string-match-p "/emacs/lisp/" buffer-file-name)
        (string-match-p "/EmacsW32/lisp/" buffer-file-name)))
      (setq buffer-read-only t)))
(add-hook 'emacs-lisp-mode-hook 'my-make-some-read-only)
如果上面的代码在dotemacs中,则el文件中的缓冲区设置为只读

c:/Program Files/Emacs/emacs/lisp/emacs-lisp/lisp-mode.el
c:/Program Files/Emacs/EmacsW32/lisp/w32shell.el

打破定期按C-x s键的习惯。一旦这样做了,你就不会有这个问题,因为你不会下意识地试图保存随机文件。一旦完成,您就不会有这个问题,因为您不会下意识地试图保存随机文件;在cmd.exe提示符中,将cd放入\emacs\lisp目录,并查找-name*.el-exec attrib+R{};