在Vim中完成空格分隔的单词

在Vim中完成空格分隔的单词,vim,autocomplete,Vim,Autocomplete,我通常只想完成一个Vim关键字。例如,我想完成一个任意路径名或类似于self.logger.debug(“…”),我已经在文本文件中的某个地方完成了 C-n和C-p使用“iskeyword”选项,因此仅填写Vim关键字 实现空格分隔的单词补全的最佳方法是什么 inoremap??? 我唯一的想法是更改'iskeyword',使用正常的单词补全,然后重置'iskeyword'。在我看来,代码片段是处理您的情况的最佳方式——因为您肯定不想更改'iskeyword'选项(它会触发太多不想要的副作用,正

我通常只想完成一个Vim关键字。例如,我想完成一个任意路径名或类似于
self.logger.debug(“…”)
,我已经在文本文件中的某个地方完成了

C-n和C-p使用
“iskeyword”
选项,因此仅填写Vim关键字

实现空格分隔的单词补全的最佳方法是什么

inoremap???


我唯一的想法是更改
'iskeyword'
,使用正常的单词补全,然后重置
'iskeyword'

在我看来,代码片段是处理您的情况的最佳方式——因为您肯定不想更改
'iskeyword'
选项(它会触发太多不想要的副作用,正如你所说,你需要在事后恢复它,如果可能的话,这一点也不微不足道)。你可以使用缩写或映射,但这样你就会失去代码片段插件的“完成”感觉/功能

有很多不同的代码段插件。我很确定这里有很多答案,或者是描述现有插件的答案


对于路径名,您有
i\u CTRL-X\u CTRL-f
,但它确实会在每个目录中停止。在这种情况下,您可以覆盖
i\u CTRL-X\u CTRL-f
来更改
&isk
(以及有效/中止完成的键序列),触发完成,然后在验证/中止完成时还原
&isk
和映射。完成结束时的还原是一些代码段插件所做的。这就是我在mu模板中用来处理完成的操作。(解释如何工作)

依我看,在你的情况下,代码片段是最好的处理方式——因为你肯定不想更改
'iskeyword'
选项(它会触发太多不想要的副作用,正如你所说,你需要在事后恢复它,如果可能的话,这不是一件小事)。你可以使用缩写或映射,但这样你就失去了代码片段插件带来的“完成”感觉/功能

有很多不同的代码段插件。我很确定这里有很多答案,或者是描述现有插件的答案


对于路径名,您有
i\u CTRL-X\u CTRL-f
,但它确实会在每个目录中停止。在这种情况下,您可以覆盖
i\u CTRL-X\u CTRL-f
来更改
&isk
(以及有效/中止完成的键序列),触发完成,然后在验证/中止完成时还原
&isk
和映射。完成结束时的还原是一些代码段插件所做的。这就是我在mu模板中用来处理完成的操作。(解释如何工作)

我已经编写了一个插件,它由my提供支持,可以实现以下功能:


查找以光标前面的非空白字符开头并以下一个空格结尾的单词的匹配项。默认情况下,它是在插入模式下使用
触发的。与内置补全一样,它认为可以配置源缓冲区。

我编写了一个由my提供支持的插件,该插件只执行以下操作:

>
查找以光标前面的非空白字符开头并以下一个空格结尾的单词的匹配项。默认情况下,它是在插入模式下使用
触发的。与内置补全一样,可以配置它所考虑的源缓冲区。

无论@Ingo Karkat还是@Luc Hermitte都提供了出色的解决方案。However如果您希望以本机方式执行此操作,那么Vim提供了一些可能会对您有所帮助的解决方案。通常,完成使用普通的
/
,但是有一个通过
访问的完成子模式

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

全线完工 如果您通常使用同一行,但不值得制作一个代码片段或缩写,请键入您希望的行的开头,然后键入
以开始行的完成。然后像通常一样使用
/

多字补全 您可以使用
/
来完成当前单词后面的另一个单词。如果不尝试,这个单词很难解释

假设您有以下文本:

self.logger.debug("foo")
假设您想在其他地方使用另一个
self.logger.debug

  • 因此,键入:
    sel
    ,然后使用
    来完成您通常完成的
    self
  • 然后使用
    完成到
    self.logger
    (可能需要执行一些
    /
    才能到达
    .logger
  • 完成
    self.logger
    后,再次对
    .debugger
    部分使用
注意:这确实使用了
iskeyword
,因此它可能无法完全按照您的要求完成,但应该非常接近

需要更多帮助
@Ingo Karkat和@Luc Hermitte都提供了很好的解决方案。但是,如果您想在本机上实现这一点,Vim提供了一些可能会对您有所帮助的解决方案。通常,完成使用普通的
/
,但是有一个通过
访问的完成子模式

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

全线完工 如果您通常使用同一行,但不值得编写代码片段或缩写
:h ins-completion
:h compl-whole-line
:h compl-current
:h compl-filename
:h 'complete'