Emacs:缩写模式不扩展简单缩写,可能的原因?

时间:2012-07-11 01:59:09

标签: emacs

我想将字符串'target =“_ blank”'分配给缩写'tgt',因为我经常使用它,每次输入都很烦人。

上面的字符串可能需要转义等等,所以作为一个更简单的起点我试图将'target'分配给'tgt'。尽管打开abbrev-mode并将其定义为全局缩写,但如果我输入'tgt'并命中空格,则没有任何反应。如果我M-x list-abbrevs我得到了这个:

(global-abbrev-table)

"target"       1    "tgt"

所以似乎有记录。当我在tgt之后击中一个空格时,我原本期望tgt被扩展到目标,但这不会发生。我错过了什么?我是否完全误解了缩写的性质?我查看了Emacs wiki page,但与许多Emacs页面一样,它提供了许多复杂的解决方案,并且对基础知识进行了令人烦恼的稀疏覆盖。

编辑:令人尴尬的是,这看起来像是错误的缩写文件和被撤销的作业的组合,因此输入'target'会产生'tgt'。我现在'tgt'根据需要生成'target =“_ blank”'。向所有人道歉。

但是,我现在有一个相关的问题。当我点击空格时,这个缩写会扩展,通常我不想在'target =“_ blank”'字符串后面有空格。有没有办法自动删除空间?

1 个答案:

答案 0 :(得分:4)

你必须以相反的方式定义缩写。你这样做会将“目标”扩展为“tgt”。

要做正确的事情,首先输入缓冲区你希望缩写扩展为。在你的情况下,这将是“目标”。然后,在该单词后面的点处,键入 C-x a g 。这将提示您输入要输入“tgt”的缩写。

Etvoilà:如果abbrev-mode已开启,输入 tgt 现在会扩展为“目标”。

还有其他方法来定义缩写,例如通过M-x define-global-abbrev,因此最好查看documentation

删除缩写后的空格的问题是Emacs将在缩放后插入扩展。因此,击中空间基本上会有两件事:触发扩展缩写,然后运行正常的自插入命令。

避免这种情况的一种简单方法是键入 C-x' C-x a e 以显式扩展缩写,而不是打开abbrev-mode。除此之外,这有点烦人。但是,如果我们再次查看文档,我们会发现:

  

功能: define-abbrev 表名扩展和可选挂钩计数

     

[...]

     

如果 hook 是非自身插入属性的非零符号   非零,钩子可以明确控制是否插入   触发扩展的自插入输入字符。如果挂钩   在这种情况下返回非零,这会阻止插入   字符。相比之下,如果hook返回nil,则expand-abbrev也是   返回零,好像没有真正发生扩张。

这意味着如果您将以下行添加到“.emacs”文件中:

(defun my-after-abbrev-expand ()
  (when (looking-back "\"\"\\|''\\|()\\|\\[\\]\\|{}")
    (backward-char 1))
  t)
(put 'my-after-abbrev-expand 'no-self-insert t)

然后你可以像这样定义一个缩写:

(define-abbrev global-abbrev-table "tgt" "target=\"\"" 'my-after-abbrev-expand)

避免插入空格字符。此外,如果扩展以两个双引号,两个单引号或一对圆形,方形或花括号结束,my-after-abbrev-expand函数将点向左移动一个位置。