ChatGPT解决这个技术问题 Extra ChatGPT

如何让 Vim 对文件名进行正常的(类似 Bash 的)制表符补全?

vim

当我在 Vim 中打开一个新文件并使用制表符完成时,它会完成整个文件名,而不是像 Bash 那样进行部分匹配。有没有一个选项可以让这个文件名选项卡完成更像 Bash?

从技术上讲,我很确定“bash”不会完成任何制表符。这是 readline 做的。
我们正在谈论自定义 ^X^F 功能的行为?

P
Peter Mortensen

我个人使用

set wildmode=longest,list,full
set wildmenu

当您键入第一个选项卡时,它将尽可能完成。第二个标签点击将提供一个列表。第三个和后续选项卡将循环显示完成选项,因此您无需其他键即可完成文件。

bash-like 只是

set wildmode=longest,list 

不过满了就很得心应手了。


我希望这是 vim 中的默认行为。我虽然在看到这篇文章之前无法完成完整的选项卡。
@NehaKaranjkar 我建议维护一个 dotfiles 存档,以便在新环境中轻松部署
有没有办法只有在结果很少时才开始完整? set wildmode=longest,5full,list 之类的东西。大量结果完全是无用的,但很少有非常方便。像“仅当完成适合一行屏幕时才显示完整”之类的东西将是完美的
这在过去(gVim/ubuntu)过去是有效的,但现在不行了(macvim8.x/macOS)。请参阅example。有任何想法吗?
在容忍了 2 个月的原始选项卡完成后,我认为必须有一种方法来简化它。谢谢你。
C
Community

最接近 Bash 完成的行为应该是

set wildmode=longest:full,full

键入几个字符后,按一次 Tab 将给出 wildmenu 中可用的所有匹配项。这与 Michael 的答案不同,后者在命令行下方打开了一个类似 quickfix 的窗口。

然后您可以继续输入其余字符或再次按 Tab 以自动完成第一个匹配项并围绕它圈出。


我想我更喜欢这种方式。
相同的!通过这种方式,如果您想查看完整列表,您仍然可以按
谢谢!这是期望的行为。我显然没有看懂文档,但是在第二次阅读之后,很明显:“用于'wildchar'指定的字符的完成模式......每个部分都指定了每次连续使用'wildchar'时要做什么'。第一部分指定第一次使用 'wildchar' 的行为,第二部分指定第二次使用的行为,等等。 :help 野模式
P
Peter Mortensen

除了建议的 wildmode/wildmenu 之外,Vim 还提供了使用 Ctrl + D 显示所有可能完成的选项。这对于像我一样在 Vim 中搜索不同的自动完成选项时偶然发现这个问题的一些用户可能会有所帮助。


P
Peter Mortensen

如果您不想设置通配菜单,您可以在要打开文件时随时按 Ctrl + L。 Ctrl + L 将完成文件名,如 Bash 完成。


Ctrl-L 不像 bash 自动完成。它不会循环遍历所有可能的选项。
我的 bash 确实 那样做。 <Tab> 尽可能明确地完成当前字符串(如 Vim 中的 CTRL-L),而 <Tab><Tab> 显示可能匹配的列表(如 Vim 中的 CTRL-D)。
P
Peter Mortensen

我假设您在 Vim 中通过 Ctrl + N 使用自动完成功能来搜索当前缓冲区。当你使用这个命令时,你会得到一个解决方案列表;只需重复该命令即可转到列表中的下一项。所有自动完成命令也是如此。当他们填写整个单词时,您可以继续浏览列表,直到找到您想要使用的单词。

这可能是一个更有用的命令:Ctrl + P。唯一的区别是 Ctrl + P 在缓冲区中向后搜索,而 Ctrl + N 向前搜索......实际上,它们都将提供具有相同元素的列表,并且它们可能只是以不同的顺序出现。


A
André Willik Valenti

set wildmode=longest:full 为您提供类似于 Bash 的补全:

单行建议

选项卡仅完成确定的内容

右/Ctrl-n |左/Ctrl-p 选择建议。

https://i.stack.imgur.com/upRoT.gif

从帮助:

If you prefer the <Left> and <Right> keys to move the cursor instead
of selecting a different match, use this:
      :cnoremap <Left> <Space><BS><Left>
      :cnoremap <Right> <Space><BS><Right>

P
Peter Mortensen

尝试使用 :set wildmenu。除此之外,我不确定您到底在尝试什么。

哦,是的,也许试试这个链接:link