我想将字符串'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”'字符串后面有空格。有没有办法自动删除空间?
答案 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
函数将点向左移动一个位置。