我经常想完成更多Vim关键字。例如,我想完成一个任意路径名或类似self.logger.debug("...")
之类的东西,我已经在我的文本文件中的某处了。
C-n和C-p使用'iskeyword'
选项,因此只能完成Vim关键字。
实现以空格分隔的单词完成的最佳方法是什么?
inoremap <C-m> ???
我唯一的想法是更改'iskeyword'
,使用正常字词完成,然后重置'iskeyword'
。
答案 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>
的插入模式下触发。与内置的完成一样,它认为可以配置源缓冲区。