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

时间:2012-08-08 06:36:04

标签: vim

我是vim的新用户(在Windows中使用gvim),并且发现缩写节省了很多时间 - 但是如果我有时可以停止尾随空格,它们会更好。

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

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

现在,当我输入diR1 <space>时,我得到C:/dirA/dira/dir1/[]|,其中空格由[]表示,光标是|字符。我想摆脱[] ==空白。

这是一个小小的抱怨:但是你似乎能够在Vim中定制其他内容,所以我想我会问 - 当在vim中使用缩写时是否可以避免尾随空格?

在Vim中使用的替代工具是一个很好的答案 - 我的目标是保存重新键入常用的目录结构,但是让光标很方便,因为我几乎总是会添加一些内容,例如{{1} }。

在将myFile.txt添加到结尾之前我退回空间的尾随空格(无疑由于space触发缩写的事实)比不断地输入整个事物更不烦人,但如果我能避免这样做,那将是理想的......

3 个答案:

答案 0 :(得分:14)

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>

您可以将Eatchar函数放在~/.vimrc文件中,然后在缩写中使用如下所示:

iabbr <silent> diR1 C:/dirA/dira/dir1/<c-r>=Eatchar('\m\s\<bar>/')<cr>

这会“吃掉”任何尾随的空格字符或斜线。请注意,我使用的是iabbr而不是abbr,因为实际上很少需要在命令行模式下扩展缩写。您必须是careful with abbreviations in command line mode,因为它们会在意外的位置扩展,例如搜索和输入()命令。

有关详细信息,请参阅:

:h abbreviations
:helpgrep Eatchar
:h :helpgrep

答案 1 :(得分:7)

这是可能的,没有更多的自定义只有abbrev

如您所知,缩写由空格字符触发。该空格是非关键字字符,并在缩写缩放后保留。

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

:ab diR1 C:/dirA/dira/dir1

也就是说,没有尾随路径分隔符,然后你可以输入diR1/,因为斜杠/而缩写为你,并继续输入,追加使用文件名到你的路径。

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

结帐:help abbreviations,可能还有其他一些对您有用的内容,包括总是消费的更复杂的构造,例如触发缩写的空格字符。

答案 2 :(得分:0)

您可以使用映射代替缩写。一旦键入了映射的最后一个字符,它们就会被扩展,因此不会成为尾随空格:

:inoremap diR1 c:/dirA/dira/dir1

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