【问题标题】:Equivalent of abbrev-mode but for functions?等价于 abbrev-mode 但对于函数?
【发布时间】:2012-03-20 19:53:29
【问题描述】:

我是abbrev-mode 的忠实粉丝,我想要一些类似的东西:你开始打字,一旦你输入一些标点符号(或者只是一个空格就足够了),它就会调用一个函数 (当然,如果我在特殊缩写后键入空格,就像 abbrev-mode 所做的那样)

我绝对不想每次点击空格时都执行某些功能...

因此,它不会使用abbrev-mode 扩展缩写,而是运行我选择的功能。

当然需要兼容abbrev-mode,我一直在使用。

我怎样才能得到这种行为?

【问题讨论】:

  • 为什么有人投票赞成关闭我无法理解......问题很明确。这显然会很有帮助(就像 abbrev-mode 很有帮助一样),并且已经有一个很好的答案。

标签: function emacs elisp expansion abbreviation


【解决方案1】:

一种方法是使用pre-abbrev-expand-hook。我自己不使用缩写模式,但听起来好像你可以通过这种方式重新使用缩写模式机制,并简单地定义一些扩展为自己(或什么都没有?)的“缩写”,然后你抓住它们在那个钩子里并采取任何你想做的行动。

expand 库显然是相关的,它提供了expand-expand-hook,这可能是另一种选择?

编辑: 哎呀! pre-abbrev-expand-hook 自 23.1 起已过时

abbrev-expand-functions 是要使用的正确变量:

`expand-abbrev' 的包装钩子。 这个特殊钩子上的函数用一个参数调用: 执行缩写扩展的函数。它应该返回 发生扩展时的缩写符号。

有关代码,请参阅M-x find-function RET expand-abbrev RET,您还需要阅读C-h f with-wrapper-hook RET 以了解如何使用此挂钩。

【讨论】:

  • 啊 +1 听起来不错。我不确定我的 Emacs-fu 是否足够强大,但我喜欢重用 abbrev-mode 机器的想法:)
【解决方案2】:

编辑: 您修改后的问题添加了一些我的回答没有解决的关键细节。 phils 提供了一种解决此问题的方法。另一种是使用yasnippet 。您可以在 sn-p 模板中包含任意 lisp 代码,因此您可以执行以下操作:

# -*- mode: snippet -*-
# name: foobars
# key: fbf
# binding: direct-keybinding
# --
 `(foo-bar-for-the-win)`

您需要确保您的函数没有返回任何内容,否则它将被插入缓冲区。我不使用缩写模式,所以我不知道这是否会引入冲突。 yas/sn-p 需要进行一些试验才能使其运行,但一旦设置好它就非常方便。

原答案: 您可以将空间绑定到您喜欢的任何功能。您可以将所有标点符号键绑定到同一个函数,也可以绑定到不同的函数。

(define-key your-mode-map " " 'your-choice-function)

您可能希望在自定义模式映射中执行此操作,以便在切换模式时恢复正常行为。为除自插入以外的任何内容全局设置空间将无济于事。

【讨论】:

  • 所以我应该绑定到我自己的函数,然后分派到 abbrev-mode 或“my-funabbrev-mode”?我不想将空格绑定到 one 函数,我希望空格根据我在空格之前键入的内容执行函数,就像 abbrev-mode 一样。例如,在 abbrev-mode 中,我可以输入“teh”并将其变为“the”。在我的情况下,我想输入“fbf”并让 Emacs 自动执行函数 foo-bar-forthewin (因为在某个地方我已经将 fbd 绑定到 foo-bar-forthewin。然后我想输入“sof”并让 Emacs 自动运行 some-other-function
  • 事情是,就像 abbrev-mode 一样,我不太可能将函数绑定到我需要在另一种模式下键入的内容。这就是为什么 abbrev-mode 中的空格在 99.999% 的时间里就像空格一样(这就是为什么 abbrev-mode 如此出色的原因)。如果有冲突,我总是可以删除那个特定的函数绑定...
【解决方案3】:

每个缩写都由几个元素组成。主要元素包括名称(例如“fbf”)、扩展名(您喜欢的任何字符串)和钩子(被调用的函数)。在您的情况下,听起来您希望扩展为空字符串,只需将您的 foo-bar-for-the-win 指定为钩子。

【讨论】:

    猜你喜欢
    • 2021-09-25
    • 2011-06-08
    • 2011-11-10
    • 2011-10-13
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多