使用vim缩写时防止尾随空格
我是vim(windows中的gvim)的新用户,我发现缩写可以节省很多时间——但是如果我能不时停止尾随的空格,它们会更好 我有一些经常使用的目录,因此我在我的_vimrc中添加了一些缩写/路径对:使用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中
: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