【问题标题】:Emacs: eval-after-load code always being executedEmacs:eval-after-load 代码总是被执行
【发布时间】:2014-12-05 05:31:56
【问题描述】:

我的 .emacs 文件 (emacs 23.4.1) 包含 python 和 latex 相关代码。两者都有 eval-after-load(我希望在 emacs 启动时只执行一次的代码)和钩子。其中一个相关的部分是:

(setq py-install-directory "~/.emacs.d/python-mode.el-6.1.3")
(add-to-list 'load-path py-install-directory)
(require 'python-mode)

(defun my-eval-after-load-python()
  (setq initial-frame-alist '((top . 48) (left . 45) (width . 142) (height . 57)))
  (split-window-horizontally (floor (* 0.49 (window-width)))))

(eval-after-load "python-mode" '(my-eval-after-load-python))

所有钩子都可以正常工作,但 my-eval-after-load-python 不能,这会导致每次 emacs 为每个扩展名(例如:emacs file.py、emacs file. tex、emacs 文件)。我尝试将其更改为:

(eval-after-load "python-mode" 
  '(progn  
     (setq initial-frame-alist '((top . 48) (left . 45) (width . 142) (height . 57)))
     (split-window-horizontally (floor (* 0.49 (window-width))))

,但它仍然不起作用。这里可能有一个初学者错误,但我找不到它。如何在第一次打开 python 脚本(emacs file.py)而不是每次打开新的缓冲区 file2.py 时拆分窗口?

【问题讨论】:

  • 去掉上面所有与问题无关的代码——所有的乳胶材料和大部分的python材料。 emacs -Q开始,只需提供一个简单的、缩小的、最少的代码和一个完整的方法来重现问题。
  • 我的疯狂猜测:您不想在加载 python 包之后但在加载第一个 python 文件之后从my-eval-after-load-python 运行这些东西。因此,您应该将my-eval-after-load-python 挂钩到python-mode-hook。也许,你应该根据你是否已经调用它(通过设置一个标志并测试它)有条件地评估它。
  • 我不希望每次打开带有不同 .py 文件的缓冲区时都调整窗口大小。您的第二个解决方案很好,但似乎自动加载是我正在寻找的。​​span>

标签: python emacs elisp eval-after-load


【解决方案1】:

听起来有些东西导致(load "python-mode") 发生“每次 emacs 为每个扩展启动”(我不确定您的实际意思是什么)。

您的代码也很奇怪,因为您使用require 强制加载python-mode,然后随后为同一个库评估eval-after-load,即使您知道它肯定已经加载。这仍然有效,但很奇怪。人们倾向于使用eval-after-load避免预先加载某些东西(让自动加载按需处理它,但此时仍然运行自定义代码)。

编辑:哦,您的意思是当您启动 Emacs 时它会评估您的eval-after-load 代码吗?那是因为你告诉它——你加载了 python 模式,然后告诉 Emacs 如果/当 python 模式被加载时,将屏幕一分为二。

【讨论】:

  • 太完美了!你理解正确,这很愚蠢。使用autoload 而不是require 可以节省我的代码,谢谢。
【解决方案2】:

也许引入一些布尔值

(defvar my-action-done nil)

将它们放在非零以下操作和

(除非我的动作完成 做...

【讨论】:

    【解决方案3】:

    你一开始就做(require 'python-mode),所以python-mode总是在你到达(eval-after-load "python-mode" ...)部分之前被加载。我认为您的my-eval-after-load-python 并不是要在加载 python-mode 时加载,而是在entered 时加载。所以你要使用

    (add-hook 'python-mode-hook #'my-eval-after-load-python)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 2016-07-30
      • 2011-11-20
      • 2021-05-02
      相关资源
      最近更新 更多