有没有一种方法可以在不重新启动Emacs的情况下应用对我的.emacs文件中开关的更改?

9

我希望能够在不重新加载Emacs的情况下对我的.emacs文件进行更改。

我找到了三个问题,它们有点回答了我所问的问题(您可以在这里这里这里找到它们),但问题是我刚刚做出的更改是一个开关,正如两个答案的评论所解释的那样(a1a2),那些问题中给出的解决方案(例如M-x reload-file或M-x eval-buffer)不适用于切换。

我想象中有一种方法可以使用命令再次切换变量,但如果有一种方法可以重新加载整个.emacs并重新评估所有切换而无需指定它们,我更喜欢。

无论如何,如果有人告诉我如何切换变量的值,这样如果我只更改了一个切换,我可以用一个命令来完成,而不是为此重新启动Emacs(我是Emacs的新手)。我不知道这些信息有多有用,但我做出的更改是以下内容(我从另一个问题的这个答案中得到的):

(setq skeleton-pair t)  
(setq skeleton-pair-on-word t)  
(global-set-key (kbd "[") 'skeleton-pair-insert-maybe)  
(global-set-key (kbd "(") 'skeleton-pair-insert-maybe)  
(global-set-key (kbd "{") 'skeleton-pair-insert-maybe)   
(global-set-key (kbd "<") 'skeleton-pair-insert-maybe)  
编辑:我在.emacs文件中添加了上述内容,并重新加载了Emacs,以使更改生效。然后我将其全部注释掉并尝试了M-x load-file。这行不通。下面的建议(由PP提供的C-x C-e)在第一次使用它来评估切换时有效,但不是当我想要撤销它时。我希望有一个可以评估注释的东西,如果有这样的东西存在...

谢谢 :)

6个回答

6

您可能想尝试以下几个方法:

M-x load-file (然后在提示时,键入 ~/.emacs enter)。M-x 表示按下元键(通常在 Linux 和 Windows 桌面上为 Esc 键),然后按下普通的字符键 x

或者,当您的 .emacs 文件打开时,将提示放在要执行的函数的右括号后面,然后键入 Ctrl-XCtrl-E。这将执行光标左侧最近一组括号中包含的代码块。

我经常使用最后一种技术来进行复杂的搜索和替换。比如说我正在编辑一个 XML 文件,并且想把关闭标签移到前一行:我会在当前的 XML 缓冲区中键入 (query-replace-regexp "[ \r\n\t]*</" "</"),然后将光标放在右括号之后,键入 Ctrl-XCtrl-E


1
谢谢。我之前尝试过M-x load-file来评估注释掉的内容,但是没有成功。我想检查一下,如果我第一次包含切换,它是否有效,但是我做错了什么,删除了所有自定义 :( 当我整理好我的混乱并回到你这里时,我会检查它是否适用于这种情况。C-x C-e可以在第一次切换时起作用,但是当我尝试注释掉内容时它不起作用。另一个问题是我必须对每行命令都这样做(除非我选择6行并执行它)。 - Vivi
1
啊,我现在明白你在问什么了。没有什么办法可以避免每次更改 .emacs 文件后重新启动 Emacs 以找出其真正效果。设置 .emacs 文件是一项耗时的任务,程序员喜欢这样做,因为他们是程序员。尽管如此,我的 .emacs 文件在过去的10年里没怎么变过。就它而言,现在尝试尽可能多的实验 - 最终你会有一个稳定的东西,而且你会为之感到自豪多年。 - PP.

4

我明白您希望进行开启/关闭骨架对的实验,这与it技术有关。

我倾向于通过以下方式实现:

(setq skeleton-pair t)    ; turns skeleton-pair on
(setq skeleton-pair nil)  ; turns skeleton-pair off

在.emacs文件中,按下C-x C-e,紧挨着特定版本的右括号进行尝试。当然,我必须记得确保.emacs文件只包含我想要的最终设置,以便在下次启动时它可以做正确的事情。

谢谢你。我希望我能接受多个答案,但这是不可能的。尽管如此,我很感激你的帮助 :) - Vivi
@Vivi:关键在于每个切换函数都会改变某个特定的Emacs变量的设置。因此,如果您只使用变量,就不会遇到这类问题。然而,仅仅使用变量并不能解决所有问题:如果您的设置会像将项目添加到Emacs初始化的alists那样做一些事情,那么每次运行您的.emacs文件时,这些列表将变得越来越长。 - Charles Stewart

4

我将以上内容包含在.emacs文件中并重新加载了Emacs,以便更改生效。然后我将所有内容都注释掉并尝试使用M-x load-file。这样不起作用。

这不起作用是因为当您启动Emacs时,设置了一些变量和键。即使使用这些命令注释了.emacs文件,也无法撤消它们。您需要手动覆盖这些设置才能撤消它们。

(setq variable-name nil)

并且

输入 M-x global-unset-key,然后输入您想取消绑定的按键。


只是提供信息:作为Emacs初学者,我也有取消注释并重新加载以撤消操作的想法。有些情况下这确实非常方便,但不幸的是事情并不是这样运作的。 - malana
是的,我明白... 我也知道很多我想做的事情都是不必要和无用的,但这就是我们学习的方式,对吧?通过固执地尝试按照我们自己的方式去做事情,而不接受其他方法。我毫不怀疑,我现在正在尝试做的很多事情最终都会被我改回来或者忘记,但这就是生活 :) - Vivi

4

您可以始终使用 * scratch * 缓冲区来评估表达式。

如果您想设置变量:

(setq skeleton-pair t) ^ J

取消设置:

(setq skeleton-pair nil) ^ J

您必须使用ctrl-J来调用评估;返回(或ctrl-M)不起作用。

顺便说一句,这适用于所有Lisp表达式。 如果您需要快速计算:

(+ 51 33) ^ J 84

或者如果您想找到框架的宽度: (frame-width) ^ J 80

如果您正在修补程序或需要评估非交互式命令或变量,则很有用。


哦,原来那个初始缓冲区还真有用!谢谢,这非常有帮助 :) - Vivi

2

我不确定我是否正确理解了你的问题(有点累),但是你可以尝试标记你所更改的内容(C-spc),然后使用 M-x eval-region 命令。除非我做了一些重大的更改,否则这通常是我需要的操作。


我认为这种方法不能让emacs“注释掉”我的代码块...它会被解释为切换,但不是通过将其变成注释并要求emacs评估该位来取消切换。尽管如此,在其他情况下可能会有用,所以谢谢 :) - Vivi

0
每次评估elisp代码时,它都会进入此emacs会话的全局环境;因此,如果您设置变量值,则即使重新加载. emacs,它仍然存在于环境中。
如果我们可以预先在“沙盒”中加载.emacs(或任何lisp)进行测试,那将是很好的。当我进行大量.emacs自定义时,我通常会打开一个emacs来编辑.emacs,另一个emacs来评估(我可以重新启动以避免破坏环境)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接