在Vim

时间:2017-09-27 14:37:01

标签: vim autocomplete

我经常想完成更多Vim关键字。例如,我想完成一个任意路径名或类似self.logger.debug("...")之类的东西,我已经在我的文本文件中的某处了。

C-n和C-p使用'iskeyword'选项,因此只能完成Vim关键字。

实现以空格分隔的单词完成的最佳方法是什么?

inoremap <C-m> ???

我唯一的想法是更改'iskeyword',使用正常字词完成,然后重置'iskeyword'

3 个答案:

答案 0 :(得分:3)

@Ingo Karkat和@Luc Hermitte都提供了出色的解决方案。但是,如果您想本地执行此操作,那么Vim会提供一些可能对您有所帮助的解决方案。通常,完成使用普通<c-n> / <c-p&gt;但是有一个通过<c-x>访问的完成子模式。

文件名完成

使用<c-x><c-f>开始填写文件名。您可以使用<c-n> / <c-p>,就像通常在完成选项之间移动一样。如果完成在目录中结束(例如/usr/bin/),则只需执行<c-x><c-f>即可开始完成该目录。

整线完成

如果您通常使用同一行,但不值得制作片段或缩写,请输入您希望的行的开头<c-x><c-l&gt;开始完成线路。然后像往常一样使用<c-n> / <c-p>

多字词完成

您可以使用<c-x><c-n> / <c-x><c-p>填写当前字词后面的其他字词。这个很难解释而不仅仅是尝试它。

我们假设你有以下文字:

self.logger.debug("foo")

让我们说你想在其他地方再做一次self.logger.debug

  • 然后输入:sel然后使用<c-p>,就像通常完成self
  • 一样
  • 然后使用<c-x><c-p>完成self.logger(可能需要执行一些<c-p> / <c-n>才能到达.logger
  • 完成self.logger后,再次对<c-x><c-p>部分使用.debugger

注意:这确实使用了iskeyword,因此可能无法完全按照您的要求完成,但应该非常接近。

获取更多帮助

:h ins-completion
:h compl-whole-line
:h compl-current
:h compl-filename
:h 'complete'

答案 1 :(得分:1)

IMO,片段是您处理案例的最佳方式 - 因为您当然不想更改HTMLInputElement选项(它会引发太多不受欢迎的副作用,正如您所说的那样' d需要在之后恢复它,如果可能的话,这不是微不足道的。您可以使用缩写或映射,但随后您将放弃使用片段插件获得的“完成”感觉/功能。

有很多不同的代码段插件。我非常确定这里有很多答案,或者在描述现有插件的vi.SE上。

对于路径名,您有'iskeyword',但实际上它会在每个目录中停止。在这种情况下,您可以覆盖i_CTRL-X_CTRL-f以更改i_CTRL-X_CTRL-f(以及有效/中止完成的键序列),触发完成,然后在验证时恢复&isk和映射/中止完成。完成结束时的恢复是一些片段插件的作用。这就是我在mu-template中使用core functions来完成的工作。 (解释这是如何工作的on vi.SE

答案 2 :(得分:1)

我编写了一个由我的CompleteHelper plugin提供支持的插件:

WORDComplete plugin找到WORD的匹配项,这些WORD以游标前面的非空白字符开头,并在下一个空格处结束。默认情况下,它在<C-x><C-w>的插入模式下触发。与内置的完成一样,它认为可以配置源缓冲区。