相当于缩写模式,但功能?

时间:2012-03-20 19:53:30

标签: function emacs elisp expansion abbreviation

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

我绝对不希望每次击中太空都执行某些功能......

因此,不是使用abbrev-mode扩展缩写,而是运行我选择的函数。

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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

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

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

您可能希望在自定义模式映射中执行此操作,以便在切换模式时可以恢复正常行为。除了自我插入之外,在全球范围内设置空间是没有用的。

答案 1 :(得分:3)

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

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

编辑:哎呀;自{23.1}起,pre-abbrev-expand-hook已过时

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

  

围绕`expand-abbrev'的包装钩。   使用一个参数调用此特殊挂钩上的函数:   执行缩写扩展的函数。它应该回来   如果扩张发生的缩写符号。

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

答案 2 :(得分:2)

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