使用vim缩写时防止尾随空格

使用vim缩写时防止尾随空格,vim,Vim,我是vim(windows中的gvim)的新用户,我发现缩写可以节省很多时间——但是如果我能不时停止尾随的空格,它们会更好 我有一些经常使用的目录,因此我在我的_vimrc中添加了一些缩写/路径对: :ab diR1 C:/dirA/dira/dir1/ :ab diR2 C:/dirA/dirb/dir2/ 等等 现在,当我键入diR1时,我得到C:/dirA/dirA/diR1/[].,其中空格由[].表示,光标是.字符。我想去掉[]==空白 这是一个小问题:然而,您似乎能够定制Vim中

我是vim(windows中的gvim)的新用户,我发现缩写可以节省很多时间——但是如果我能不时停止尾随的空格,它们会更好

我有一些经常使用的目录,因此我在我的_vimrc中添加了一些缩写/路径对:

:ab diR1 C:/dirA/dira/dir1/
:ab diR2 C:/dirA/dirb/dir2/ 
等等

现在,当我键入
diR1
时,我得到
C:/dirA/dirA/diR1/[].
,其中空格由
[].
表示,光标是
.
字符。我想去掉
[]
==空白

这是一个小问题:然而,您似乎能够定制Vim中的所有其他内容,所以我想问一下——当在Vim中使用缩写时,是否可以避免尾随空格

Vim中使用的另一个工具是一个很好的答案-我的目标是保存重新键入的常用目录结构,但要方便地使用光标,因为我几乎总是在末尾添加一些内容,例如
myFile.txt


在将
myFile.txt
添加到末尾之前,我将空格向后退了退,后面的空白(无疑是因为
空格触发了缩写)比一遍又一遍地键入整件事要不那么烦人,但如果我能避免这样做,那就太理想了

这是可能的,没有更多的定制,而不仅仅是
abbrev

如您所知,缩写是由空格字符触发的。空格是非关键字字符,在缩写扩展后保留

但是还有其他方法触发扩展,例如其他非关键字字符,包括
/
。因此,如果您将缩写定义为:

:ab diR1 C:/dirA/dira/dir1
也就是说,如果没有尾随路径分隔符,则可以键入
diR1/
,将缩写扩展为斜杠
/
,然后继续键入,并将文件名附加到路径

或者,您可以使用
Ctrl-]
强制缩写扩展。也就是说,键入缩写:
diR1
,后面没有空格或其他非关键字字符,然后键入
Ctrl-]
。缩写将被展开,您将保持插入模式,并且可以将文件名附加到展开的路径中


查看
:帮助缩略语
,这里可能还有一些对您有用的内容,包括用于始终使用的更复杂的构造,例如触发缩略语的空格字符。

pb2q答案正是您当前场景中想要的答案,但没有完全回答标题中提出的问题。vim帮助文件中解决了这个问题。请参见
:helpgrep Eatchar
。它给出的例子如下:

You can even do more complicated things.  For example, to consume the space
typed after an abbreviation: >
   func Eatchar(pat)
      let c = nr2char(getchar(0))
      return (c =~ a:pat) ? '' : c
   endfunc
   iabbr <silent> if if ()<Left><C-R>=Eatchar('\s')<CR>
这将“吃掉”任何尾随的空白字符或斜杠。请注意,我使用了
iabbr
,而不仅仅是
abbr
,因为实际上很少希望缩写在命令行模式下展开。您必须知道,它们将在搜索和input()命令等意外位置展开

有关更多信息,请参阅:

:h abbreviations
:helpgrep Eatchar
:h :helpgrep

您可以使用映射,而不是缩写。一旦键入映射的最后一个字符,它们就会展开,因此不会有尾随空格:

:inoremap diR1 c:/dirA/dira/dir1

这种方法的缺点是,在映射可以展开时键入的字母在映射完成之前不会显示。这需要一些习惯。

太好了。我调整了缩写,现在用
/
触发它。我确信,对于其他缩写,我有时也会使用
Ctrl-]
方法。我一定错过了这些文件。非常感谢。谢谢,这很有帮助。我(我认为)可以理解为
('\m\s\\\\\/')
位。我对vim regex还没有信心。你能解释一下吗?Vim的正则表达式具有不同级别的
“魔力”
\m
将对当前正则表达式使用
magic
\\\
允许正则表达式进行分支,因此可以使用空格(
\s
)或斜杠(
/
)。Vim很有趣,因为许多正则表达式组件需要用反斜杠转义。如果您想要一个更像Perl的正则表达式,可以使用
\v\s |/
\v
意味着非常神奇,需要逃逸的东西更少。请注意,我在上面的帖子中有一个regex错误。它应该是
\m\s\|/
。此外,对于此映射,
|
字符将被错误解释,需要更改为
。我已经更正了我的帖子。目前,当我用
=Eatchar('\m\s | \/')
输入它时,我得到了以下错误:
在对C:\vim\abrevs.txt进行定价时检测到错误:第3行:E35:没有以前的正则表达式
(我在我的\u vimrc中获取了我的abbrev文件)。通过反复试验,我发现删除
之后的所有内容都是有效的——因此,在这一点上,我有
:iabbr diR1 C:/dirA/dirA/diR1/
,并且我没有得到结尾处的空白。问题是
|
被解释为vim的运算符,用于分隔两个不同的命令。这意味着
需要作为密钥转义,因此它应该是
而不是
。整个命令现在将是:
iabbr diR1 C:/dirA/dirA/diR1/=Eatchar('\m\s\/')
请注意,
=Eatchar('\s')
部分必须是最后一个,因此如果要重新定位光标,请首先执行,即
iabbr pr print(“”)2hi=Eatchar('\m\s')
,而不是
iabbr pr print(“”)=Eatchar('\m\s')2hi
:inoremap diR1 c:/dirA/dira/dir1