3

我想将字符串 'target="_blank"' 分配给缩写 'tgt',因为我经常使用它,而且每次都必须输入很烦人。

上面的字符串可能需要转义等等,所以作为一个更简单的起点,我尝试将“target”分配给“tgt”。尽管打开abbrev-mode并将其定义为全局缩写,但如果我键入“tgt”并点击空格,则什么也没有发生。如果我这样做,M-x list-abbrevs我会得到这个:

(global-abbrev-table)

"target"       1    "tgt"

所以好像被记录了。当我在 tgt 之后点击一个空格时,我本来希望 tgt 被扩展为目标,但这并没有发生。我错过了什么?我是否完全误解了缩写的性质?我查看了Emacs wiki 页面,但与许多 Emacs 页面一样,它提供了许多复杂的解决方案和令人讨厌的基础知识覆盖面。

编辑:令人尴尬的是,这看起来像是错误的缩写文件和反转的分配的组合,因此键入“目标”会产生“tgt”。我现在有 'tgt' 根据需要生成 'target="_blank"'。向大家道歉。

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

4

1 回答 1

4

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

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

等等:如果abbrev-mode打开,输入tgt 现在将扩展为“目标”。

还有其他定义缩写的方法,例如 via M-x define-global-abbrev,因此最好查看文档

删除缩写后的空格的问题是 Emacs 会在缩写展开插入它。所以点击空格基本上会做两件事:触发缩写的扩展,然后运行正常的自插入命令。

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

功能:define-abbrev 表名扩展&可选钩子计数

[...]

如果hook是一个非 nil 符号,其 no-self-insert 属性为非 nil,则 hook 可以显式控制是否插入触发扩展的自插入输入字符。如果在这种情况下钩子返回非零,则禁止插入字符。相比之下,如果 hook 返回 nil,expand-abbrev 也返回 nil,就好像展开并没有真正发生一样。

这意味着如果您将以下几行放入您的“.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如果扩展以两个双引号、两个单引号或一对圆括号、方括号或花括号结束,该函数会将点向左移动一个位置。

于 2012-07-11T02:21:02.230 回答