【问题标题】:How do I run a command just after the emacs frame has been rendered?如何在渲染 emacs 框架后运行命令?
【发布时间】:2009-05-17 22:37:59
【问题描述】:

我正在尝试弄清楚如何使用 Emacs 代码浏览器 (ECB),您可以使用它执行的一项操作是设置 ecb-windows-width 来决定 ecb 窗口的宽度。问题是这个顺序:

  1. 屏幕上弹出框架。
  2. ecb-activate 被调用,根据 ecb-windows-width 进行缩放。
  3. default-frame-alist 参数启动,框架调整大小。

问题在于,由于这个顺序,ecb 窗口的宽度是在框架调整大小之前设置的,然后不会被缩放。

所以我想运行 ecb-redraw-layout(或者理想情况下只是 ecb-activate),但它必须在 #3 之后发生。否则,某种 ecb-dynamic-width-scale 选项也会起作用。

不管怎样,ecb-auto-activate 不起作用,所以我不知道这是否能解决它。

【问题讨论】:

  • 听起来是个 bug,你应该给 ecb 的维护者发邮件。

标签: emacs elisp emacs-ecb


【解决方案1】:

看来我找到了解决方法。

  1. 将 ecb-fix-window-size 设置为 true。
  2. 当框架加载时,会调用 ecb-activate 并且 ecb 窗口会根据框架大小按比例缩放。
  3. 然后 default-frame-alist 启动并调整框架大小,但 ecb 窗口具有固定大小且不会缩放。

相当骇人听闻,因为您根据首先出现的默认帧大小设置宽度,而不是您实际使用的大小。但是哦,好吧。

【讨论】:

    【解决方案2】:

    我不熟悉 ECB,但after-make-frame-functions 可能有助于运行您想要的功能(或运行一些您想对 ecb 框架执行特殊操作的钩子函数)。

    after-make-frame-functions 是一个接受 一个 参数(新创建的框架)的函数列表,并在创建框架后运行。这不适用于初始 emacs 框架(在启动时),因为您的 .emacs 是在框架创建之后读取的。

    【讨论】:

    • 是的,我尝试了那个钩子,但它似乎并没有真正调用该函数,没有任何反应。事实上,如果我只是这样做: (add-hook 'after-make-frame-functions '(lambda () (setq xx 1))) 然后尝试在 emacs 启动后评估 xx 事实证明变量没有已设置。
    • 挂钩函数必须采用单帧参数。因此,在我执行以下操作并调用 (make-frame) 之后,变量 xx 确实设置为 1。我还没有在主 emacs 框架上尝试过它(即在启动 emacs 之后):(add-hook ' after-make-frame-functions (lambda (the-frame) (setq xx 1)))
    猜你喜欢
    • 2012-08-27
    • 2011-01-29
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 2011-07-01
    相关资源
    最近更新 更多