【问题标题】:Make hook local in emacs在 emacs 中制作本地钩子
【发布时间】:2014-03-05 00:55:11
【问题描述】:

如何使这个钩子本地化:

(add-hook 'text-mode-hook(lambda ()
  (set-frame-width (selected-frame) 80) ))

我希望它只影响当前缓冲区,而不影响其他模式下的新缓冲区。

编辑:找到了一种更好的方法来缩小我喜欢的框架:

(add-hook 'window-configuration-change-hook
          (lambda ()
            (set-window-margins (car (get-buffer-window-list (current-buffer) nil t)) 24 24)))

这当然本身就是一个钩子,但问题仍然是一样的:

当我更改为文本模式时,如何将边距设置为 24 24,并在我切换模式时将它们更改回来。

【问题讨论】:

    标签: hook local emacs24


    【解决方案1】:

    很高兴找到了解决方案!作为记录,我将添加一个钩子可以在 Emacs 中 buffer-local。这可能不是最初的问题was after,因为缓冲区局部变量适用于特定缓冲区 - 而不是特定模式或帧。

    无论如何,Hooks 上的 Emacs 手册指出:

    如果挂钩变量是缓冲区局部变量,则将使用缓冲区局部变量而不是全局变量。但是,如果缓冲区局部变量包含元素t,则全局挂钩变量也会运行。

    可以通过向add-hook 添加第四个非零参数来使挂钩成为缓冲区本地,如下所示:

    (add-hook 'text-mode-hook #'the-function-to-add nil t)
    

    另见:Buffer-local after-save-hook?

    【讨论】:

      【解决方案2】:

      根据定义,钩子不是本地的。它们的设计使得每当以文本模式(在这种情况下)创建新缓冲区时,它们都会运行它们的钩子。

      在你的情况下,这意味着每当你创建一个新的文本文件时,你的框架都会被调整大小。

      如果您只想执行一次,您可以轻松创建执行此操作的命令。

      (defun my-set-frame-width ()
        (interactive)
        (set-frame-width (selected-frame) 80))
      

      您可以使用 M-x my-set-frame-width RET 调用它。

      【讨论】:

      • 本地可能不是正确的术语。我的意思是:我希望在切换到文本模式时更改框架,然后在更改为非文本模式时更改回默认值。使用上面的代码,当我更改为另一种模式时,框架保持 80 个字符宽。同时我发现更改边距更好,我希望它在文本模式下生效,并在切换到其他模式时让边距变回零。
      猜你喜欢
      • 1970-01-01
      • 2014-09-18
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多