【问题标题】:How can I reload .emacs after changing it?更改后如何重新加载 .emacs?
【发布时间】:2010-04-05 19:36:07
【问题描述】:

如何在不重新启动 Emacs 的情况下让 Emacs 重新加载我在 .emacs 中更新的所有定义?

【问题讨论】:

  • 我知道 emacs 通常被认为是一个操作系统,但是...s/reboot/restart/?
  • 我不是开发人员,所以很多对开发人员立即有意义的答案对我来说意义不大
  • @MJB Stack Overflow 的目的是成为即使是最基本的问题的知识库。这个问题完全符合 Stack Overflow 的目的。请看stackoverflow.com/faq
  • 哈哈现在五年后,建议的“谷歌搜索优先”在这里领先!不错

标签: emacs


【解决方案1】:

您可以使用命令加载文件(M-x load-file,然后按两次回车接受默认文件名,即当前正在编辑的文件)。

您也可以将点移动到任何 sexp 的末尾,然后按 C-xC-e 来执行该 sexp。如果您只是更改一两行,通常不需要重新加载整个文件。

【讨论】:

  • 请记住,这可能并不总是完全按照您的想法进行。如果您有内容被翻转的变量(即将布尔值设置为相反),那么行为将与加载文件不同。
  • 任何副作用都可能破坏预期的行为:加载文件等
  • 当我这样做时,我收到消息:load-with-code-conversion: Symbol's value as variable is void: n
  • 除了将点移动到defundefvar 之后,您还可以将其留在声明正文中并输入C-M-x。非常方便。
  • M-x load-file 然后~/.emacs 代替默认值。
【解决方案2】:

很奇怪,很方便

M-x eval-buffer

这里没有提到。

如果您的.emacs 是幂等的,它会立即评估缓冲区中的所有代码,这是最快的方法。

【讨论】:

  • 谁说.emacs 是(或必须是)幂等的?
  • @mike:不是我。 “鉴于 a, b 为真”对我来说意味着“如果 a,b 为真”,但我明白你的意思。为了更清楚起见,我将其更改为 if。
  • @mike:.emacs 何时不具有幂等性?
  • 我会认为这是第一个建议。
  • 我不会说这是好的风格,但它可能会发生。例如,如果函数已经定义(从第一次启动开始),您可以选择不重新定义它。在评估您的 init 文件时,您可能看不到其定义的变化。
【解决方案3】:

您通常可以重新评估更改后的区域。标记您已更改的 ~/.emacs 区域,然后使用M-x eval-region RET。这通常比重新评估整个文件更安全,因为很容易编写一个 .emacs 文件,该文件在加载两次后就无法正常工作。

【讨论】:

  • 有趣。我没有考虑过非幂等的 .emacs 文件的想法。开始使用 ELisp 时需要注意的事项
  • 我猜很难找到一个 幂等的 .emacs 文件,至少在两次执行导致与一次执行完全相同的状态的强烈意义上。至少,附加到各种列表是很常见的,通常以在第二次执行时不会抑制重复条目的方式。
  • 另一个想法:使用我上面建议的方法,您拥有的 emacs 状态可能不是您的 .emacs 实际所做的。即,由于您还没有从头开始执行整个 .emacs 文件,因此您实际上不知道它会按照您的意愿行事。
  • 这么说,不可以用幂等的方式写.emacs吗?全局状态很糟糕。
【解决方案4】:

如果您在当前活动的缓冲区中打开了 .emacs 文件:

M-x 评估缓冲区

【讨论】:

  • 这里需要注意的一点是,这样做可能不会让您处于与重新启动方法相同的状态。 (人为的例子:如果你的 .emacs 中有“切换”效果)。
【解决方案5】:
M-x load-file
~/.emacs

【讨论】:

  • 这样做我了解到,在我的 Windows 7 安装中,.emacs.d 文件夹位于 %appdata% 文件夹中,而不是用户主文件夹中。
【解决方案6】:

解决方案

M-: (load user-init-file)


注释

  • 你在Eval:提示符下输入(包括括号)
  • user-init-file是一个变量,默认保存~/.emacs的值(指向配置文件路径)
  • (load)(load-file) 的较短、较旧且非交互式版本;它不是一个 emacs 命令(需要输入 M-x),而只是一个 elisp 函数

结论

M-: > M-x

【讨论】:

  • 是 M-: > Ctrl Alt x?根据您的逻辑,我想象 M-:
【解决方案7】:

其他人已经按照说明回答了您的问题,但我发现我通常想要执行我刚刚写的行。为此,lisp 中的 CtrlAltx 可以正常工作。

【讨论】:

  • 另见eval-lastsexpC-x C-e
  • 使用C-M-x,您不必“在 lisp 的尽头”——您可能在想C-x C-e 吗? C-M-x 的好处在于,即使 point 位于函数/变量声明的中间,您也可以调用它。
  • 大概是在我只用 C-x C-e 的时候养成了去 lisp 结尾的习惯。谢谢你的收获!
【解决方案8】:

下面的应该做...

M-x load-file

【讨论】:

    【解决方案9】:

    我建议您最初不要这样做。相反,启动一个新的 emacs 会话并测试您所做的任何更改以查看它们是否正常工作。这样做的原因是为了避免让您处于无法加载的 .emacs 文件无法加载或无法干净加载的状态。如果您在原始会话中进行所有编辑,并在新会话中进行所有测试,那么您将始终有可靠的东西来注释掉有问题的代码。

    当您最终对所做的更改感到满意时,请继续使用其他答案之一重新加载。我个人的偏好是 eval 只是您添加/更改的部分,为此只需突出显示添加/更改代码的区域并调用 M-x eval-region。正如 luapyad 指出的那样,这样做可以最大限度地减少评估的代码,最大限度地减少任何无意的副作用。

    【讨论】:

      【解决方案10】:

      键盘快捷键:

      (defun reload-init-file ()
        (interactive)
        (load-file user-init-file))
      
      (global-set-key (kbd "C-c C-l") 'reload-init-file)    ; Reload .emacs file
      

      【讨论】:

        【解决方案11】:
        C-x C-e ;; current line
        M-x eval-region ;; region
        M-x eval-buffer ;; whole buffer
        M-x load-file ~/.emacs.d/init.el
        

        【讨论】:

          【解决方案12】:

          在你的初始化文件中定义它并通过 M-x reload-user-init-file

          调用
          (defun reload-user-init-file()
            (interactive)
            (load-file user-init-file))
          

          【讨论】:

          • 这实际上是我的首选答案:获取存在的东西,并使其可以通过 M-x 访问(而不是 M-: 和额外的输入)。 M-x 确实是访问有用命令的正常方式,这些命令并不常见,不值得拥有自己的键绑定。
          • 最佳答案,因为如果您的配置位于 ~/.config/emacs/ 而不是 ~/.emacs.d/ 中,它也可以工作
          【解决方案13】:

          我目前使用的是 Ubuntu 15.04;我喜欢为此定义一个键。
          [M-insert] 在我的键盘上转换为 alt-insert。
          把它放在你的 .emacs 文件中:

          (global-set-key [M-insert] '(lambda() (interactive) (load-file "~/.emacs")))
          

          【讨论】:

            【解决方案14】:

            除了 M-x eval-bufferM-x load-file 等命令,您还可以从命令行重新启动新的 emacs:

            emacs -q --load "init.el"
            

            使用示例stackoverflow.com/questions/44959535/company-backends-in-gnu-emacs/

            【讨论】:

            • 问题询问如何在不重新启动 Emacs 的情况下执行此操作。启动新副本,而 technically 回答问题,似乎不符合问题的精神。 ?
            【解决方案15】:

            虽然M-x eval-buffer 可以工作,但您可能会遇到切换开关和其他类似问题的问题。更好的方法可能是“标记”或突出显示 .emacs 中的新内容(如果您只是在搞乱,甚至是暂存缓冲区)然后M-x eval-region。希望这会有所帮助。

            【讨论】:

              【解决方案16】:

              这是一种快速测试配置的快捷方式。您也可以在特定 lisp 的末尾使用C-x C-e 来单独执行某些功能。

              C-x C-e 运行命令 eval-last-sexp(在 global-map 中找到),它 是一个交互式编译的 Lisp 函数。

              它绑定到 C-x C-e。

              (eval-last-sexp EVAL-LAST-SEXP-ARG-INTERNAL)

              在点之前评估sexp;在回声区打印值。 交互式地,使用前缀参数,将输出打印到当前缓冲区。

              通常,此函数会根据值截断长输出 变量“eval-expression-print-length”和 “评估表达式打印级别”。前缀参数为零, 但是,没有这样的截断。这样的前缀参数也 导致整数以几种其他格式打印(八进制, 十六进制和字符)。

              如果“eval-expression-debug-on-error”是非零,这是默认值, 此命令安排所有错误进入调试器。

              【讨论】:

                【解决方案17】:

                你可以像这样为 emacs 设置键绑定

                ;; reload emacs configuration
                (defun reload-init-file ()
                  (interactive)
                  (load-file "~/.emacs"))
                
                (global-set-key (kbd "C-c r") 'reload-init-file) 
                

                希望这会有所帮助!

                【讨论】:

                  【解决方案18】:

                  如果你碰巧在 Emacs 中打开了一个 shell,你也可以这样做:

                  . ~/.emacs
                  

                  可以节省一些击键。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2016-01-24
                    • 1970-01-01
                    • 2014-03-05
                    • 1970-01-01
                    • 2012-03-21
                    • 1970-01-01
                    • 2015-01-14
                    相关资源
                    最近更新 更多