Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Emacs:abbrev模式未扩展简单abbrev,可能的原因?_Emacs - Fatal编程技术网

Emacs:abbrev模式未扩展简单abbrev,可能的原因?

Emacs:abbrev模式未扩展简单abbrev,可能的原因?,emacs,Emacs,我想将字符串'target=“_blank”'指定给缩写词'tgt',因为我经常使用它,每次都要输入很烦人 上面的字符串可能需要转义等操作,因此作为一个更简单的起点,我尝试将“target”指定给“tgt”。尽管打开了abbrev模式,并将其定义为全局abbrev,但如果我键入'tgt'并点击空格,什么都不会发生。如果我做了M-x列表abbrevs我会得到: (global-abbrev-table) "target" 1 "tgt" 所以它似乎被记录下来了。当我击中tgt

我想将字符串'target=“_blank”'指定给缩写词'tgt',因为我经常使用它,每次都要输入很烦人

上面的字符串可能需要转义等操作,因此作为一个更简单的起点,我尝试将“target”指定给“tgt”。尽管打开了abbrev模式,并将其定义为全局abbrev,但如果我键入'tgt'并点击空格,什么都不会发生。如果我做了
M-x列表abbrevs
我会得到:

(global-abbrev-table)

"target"       1    "tgt"
所以它似乎被记录下来了。当我击中tgt后的一个空格时,我本以为tgt会扩展到目标,但这并没有发生。我错过了什么?我是否完全误解了abbrevs的本质?我已经看过了,但和许多Emacs页面一样,它给出了许多复杂的解决方案,并且对基础知识的覆盖非常少

编辑:令人尴尬的是,这看起来像是错误的abbrev文件和被反转的赋值的组合,所以键入“target”生成了“tgt”。我现在有了“tgt”,可以根据需要生成“target=“_blank””。向大家道歉


不过,我现在有一个相关的问题。当我点击空格时,此缩写会扩展,通常我不希望在“target=“\u blank””字符串后有空格。有没有办法自动删除空格?

您必须以另一种方式定义缩写。您这样做会将“target”扩展为“tgt”

要做正确的事情,首先在缓冲区中键入您希望abbrev扩展到的内容。在你的情况下,这将是“目标”。然后,在单词的正后方输入C-xag。这将提示您输入abbrev,您将为其键入“tgt”

Et voilá:如果启用了
abbrev模式
,输入tgt现在将扩展到“target”

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

删除abbrev后的空格的问题是,Emacs将在abbrev扩展后插入它。所以点击空格基本上有两件事:触发abbrev的扩展,然后运行正常的self-insert命令

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

函数:定义abbrev表名扩展和可选挂钩计数

[……]

如果hook是一个非nil符号,其no self insert属性为 非nil,hook可以显式控制是否插入 自插入触发扩展的输入字符。如果钩 在本例中返回非nil,这将禁止插入 性格相反,如果hook返回nil,则也展开abbrev 返回nil,就好像扩展并没有真正发生一样

这意味着,如果在“.emacs”文件中放入以下行:

然后您可以这样定义一个abbrev:

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

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

谢谢,这正是发生的情况。您对我上面编辑的问题有什么想法,即如何自动删除扩展缩写后的空格?@SlowLearner是,我刚刚添加了如何避免插入空格字符。@SlowLearner当然,您可以创建一个不同的符号,该符号比abbrev扩展后的
禁止空格更短。
。经过测试,似乎工作正常-非常感谢。又一个长期存在的挫折感消失了@SlowLearner实际上,我只是再一次更新了答案,使其更完善:我用一个函数
my after abbrev expand
替换了
inhibit space after abbrev expand
,该函数检查扩展是否以
结尾,如果是,则在两个引号字符之间移动
点。希望这对你更有用。
(define-abbrev global-abbrev-table "tgt" "target=\"\"" 'my-after-abbrev-expand)