【问题标题】:Complete space-separated words in Vim在 Vim 中完成以空格分隔的单词
【发布时间】:2017-09-29 15:27:13
【问题描述】:

我经常喜欢只完成一个 Vim 关键字。例如,我想完成一个任意路径名或类似 self.logger.debug("...") 之类的内容,我已经在我的文本文件中的某个位置。

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

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

inoremap <C-m> ???

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

【问题讨论】:

  • <C-x><C-f> 完成文件名,<C-x><C-l> 完成行。见:help ins-completion

标签: vim autocomplete


【解决方案1】:

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

文件名完成

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

整行完成

如果您经常使用同一行,但不值得使用 sn-p 或缩写,则输入您希望的行的开头,然后输入 <c-x><c-l> 以开始行完成。然后像往常一样使用<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'

【讨论】:

  • 感谢您的解释。现在我明白了 之间的区别!我已经使用了文件名和行完成,但通常行开始不同,或者我要完成的文件不在路径中......
【解决方案2】:

IMO,sn-ps 是处理您的情况的最佳方式 - 因为您当然不想更改 'iskeyword' 选项(它会触发太多不希望的副作用,正如您所说的那样) d 需要在之后恢复它,如果可能的话,这不是微不足道的)。您可以使用缩写或映射,但您会失去使用 sn-p 插件获得的“完成”感觉/功能。

存在许多不同的 sn-p 插件。我很确定这里有很多关于 SO 或 vi.SE 的答案,它们描述了现有的插件。

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

【讨论】:

  • 谢谢!在这种情况下,我不喜欢 sn-p 插件,因为我目前使用许多不同的语言,也在不同的计算机上工作,我只想要一种快速简单的方法来完成这种工作。
  • 恢复 'iskeyword' 并不困难:让 ikw=&iskeyword |设置 iskeyword=a-z,A-Z |让 &iskeyword=ikw
  • @jakob,恢复&isk 并非易事,因为无论您接受还是拒绝完成,您都必须在完成结束时执行此操作。
【解决方案3】:

我编写了一个由我的CompleteHelper plugin 提供支持的插件,它就是这样做的:

WORDComplete plugin 查找以光标前面的非空白字符开头并以下一个空格结尾的单词的匹配项。默认情况下,它在插入模式下使用<C-x><C-w> 触发。和内置完成一样,它考虑的源缓冲区可以配置。

【讨论】:

  • 注意:vim.org 目前已经关闭,所以我还不能在那里发布。此外,这意味着您将无法在那里下载所需的依赖项;不过是herehere
  • 谢谢,这正是我想要的。我只是还不能让它工作。 仍然被另一个插件映射,我不确定是否一切都安装正确。我喜欢没有依赖的插件。
  • :imap <C-x><C-w> 应该指向<Plug>(WORDComplete)。如果触发它,:messages 中至少应该有错误消息。有了这些,我也许可以提供帮助。
猜你喜欢
  • 2010-12-01
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 2019-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多