Emacs:始终执行eval-after-load代码

时间:2014-12-05 05:31:57

标签: python emacs elisp eval-after-load

我的.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时都会拆分窗口?

3 个答案:

答案 0 :(得分:2)

听起来有些事情导致(load "python-mode")发生“每次emacs都会为每个分机启动”(我不确定你的意思是什么)。

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

编辑:哦,你的意思是,当你开始 Emacs时,它会评估你的eval-after-load代码吗?那是因为你告诉它 - 你加载了python模式,然后告诉Emacs如果/当加载python模式时,将屏幕分成两部分。

答案 1 :(得分:0)

可能会引入一些布尔值

(defvar my-action-done nil)

在行动和

之后将它们设为非零

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

答案 2 :(得分:0)

你在开头做(require 'python-mode),所以在你到达(eval-after-load "python-mode" ...)部分之前总是加载python-mode。我认为你的my-eval-after-load-python并不意味着在python-mode 加载时加载,但是当python-mode 输入时。所以你想使用

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