14

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

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

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

ETC ...

现在,当我键入时,diR1 <space>我得到C:/dirA/dira/dir1/[]|了空格表示的位置[],光标是|字符。我想摆脱[]== 空格。

这是一个小问题:但是您似乎可以在 Vim 中自定义其他所有内容,所以我想我会问 - 当一个人在 vim 中使用缩写时,是否可以避免尾随空格?

Vim 中使用的替代工具是一个很好的答案 - 我的目标是节省重新键入经常使用的目录结构,但要方便光标,因为我几乎总是在末尾添加一些东西,例如myFile.txt.

我在添加到末尾之前退格的尾随空格(毫无疑问是因为space触发了缩写)myFile.txt比一遍又一遍地输入整个内容更不烦人,但如果我可以避免这样做,那将是理想的.. .

4

3 回答 3

19

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而不是 just abbr,因为实际上很少需要缩写在命令行模式下扩展。您必须小心命令行模式下的缩写,因为它们会在意想不到的地方扩展,例如搜索和 input() 命令。

有关更多信息,请参阅:

:h abbreviations
:helpgrep Eatchar
:h :helpgrep
于 2012-08-08T13:21:13.187 回答
14

这是可能的,除了abbrev.

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

但是还有其他触发扩展的方式,比如其他非关键字字符,包括/. 因此,如果您改为这样定义缩写词:

:ab diR1 C:/dirA/dira/dir1

也就是说,如果没有尾随路径分隔符,那么您可以键入diR1/,由于斜杠 为您扩展缩写/,然后继续键入,将文件名附加到您的路径。

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

看看:help abbreviations,那里可能还有其他对你有用的东西,包括更复杂的结构,例如触发缩写的空格字符。

于 2012-08-08T06:43:10.247 回答
1

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

:inoremap diR1 c:/dirA/dira/dir1

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

于 2014-05-02T05:01:49.923 回答