Function 等同于abbrev模式,但用于功能?

Function 等同于abbrev模式,但用于功能?,function,emacs,elisp,expansion,abbreviation,Function,Emacs,Elisp,Expansion,Abbreviation,我是abbrev模式的超级粉丝,我想做一点类似的事情:你开始打字,一旦你输入了一些点字(或者仅仅一个空格就足够了),它就会调用一个函数(当然,如果我在一个特殊的缩写后键入空格,就像abbrev模式一样) 我绝对不想每次点击空格都执行一些函数 因此,它将运行我选择的函数,而不是使用abbrev模式扩展缩写 当然,它需要与我一直使用的abbrev模式兼容 如何获得此行为?编辑: 你修改后的问题增加了一些我的答案没有提到的关键细节。phils提供了一种解决此问题的方法。另一个是使用。您可以在代码段模板

我是abbrev模式的超级粉丝,我想做一点类似的事情:你开始打字,一旦你输入了一些点字(或者仅仅一个空格就足够了),它就会调用一个函数(当然,如果我在一个特殊的缩写后键入空格,就像abbrev模式一样)

我绝对不想每次点击空格都执行一些函数

因此,它将运行我选择的函数,而不是使用
abbrev模式
扩展缩写

当然,它需要与我一直使用的
abbrev模式
兼容

如何获得此行为?

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

# -*- mode: snippet -*-
# name: foobars
# key: fbf
# binding: direct-keybinding
# --
 `(foo-bar-for-the-win)`
您需要确保您的函数没有返回任何内容,否则它将被插入缓冲区。我不使用abbrev模式,所以我不知道这是否会引起冲突。yas/snippet需要一些实验才能运行,但一旦设置好,它就非常方便了

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

(define-key your-mode-map " " 'your-choice-function)
您可能希望在自定义模式映射中执行此操作,以便在切换模式时返回正常行为。将空间全局设置为除“自插入”之外的任何内容都没有帮助。

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

# -*- mode: snippet -*-
# name: foobars
# key: fbf
# binding: direct-keybinding
# --
 `(foo-bar-for-the-win)`
您需要确保您的函数没有返回任何内容,否则它将被插入缓冲区。我不使用abbrev模式,所以我不知道这是否会引起冲突。yas/snippet需要一些实验才能运行,但一旦设置好,它就非常方便了

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

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

您可能希望在自定义模式映射中执行此操作,以便在切换模式时返回正常行为。将空间全局设置为除自插入之外的任何内容都是没有帮助的。

一种方法是使用
pre abbrev expand hook
。我自己不使用abbrev模式,但听起来好像你可以用这种方式重复使用abbrev模式,简单地定义一些扩展到自身(或者什么都没有?)的“缩写”,然后你抓住它们并采取你想要的任何行动

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

编辑:哇<代码>预览版扩展挂钩自23.1版起已过时

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

环绕“expand abbrev”的包装钩。 使用一个参数调用此特殊挂钩上的函数: 执行abbrev扩展的函数。它应该会回来 如果发生扩展,则为abbrev符号


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

一种方法可以是使用
pre abbrev expand hook
。我自己不使用abbrev模式,但听起来好像你可以用这种方式重复使用abbrev模式,简单地定义一些扩展到自身(或者什么都没有?)的“缩写”,然后你抓住它们并采取你想要的任何行动

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

编辑:哇<代码>预览版扩展挂钩自23.1版起已过时

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

环绕“expand abbrev”的包装钩。 使用一个参数调用此特殊挂钩上的函数: 执行abbrev扩展的函数。它应该会回来 如果发生扩展,则为abbrev符号


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

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

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

因此我应该绑定到自己的函数,然后分派到abbrev模式或“my funabbrev模式”?我不想将空间绑定到一个函数,我想让空间根据我在空格前键入的内容来执行函数,就像abbrev模式一样。例如,在abbrev模式下,我可以输入“teh”并使其成为“the”。在我的例子中,我想输入,比如说,“fbf”,让Emacs自动执行foo-bar-forthewin函数(因为在某个地方我会将fbd绑定到foo-bar-forthewin,然后我想输入“sof”让Emacs自动运行一些其他的函数。事情是,就像abbrev模式一样,我不太可能将一个函数绑定到我需要在另一个mod中键入的东西上