使用 vim 命令进行 Bash 自动补全

使用 vim 命令进行 Bash 自动补全

vim在 bash 中,当发出路径深度超过两个目录的命令时,路径自动完成功能最近停止工作(对于其他命令,例如ls和,它继续按预期工作cd)。

例如,如果我键入ls .config/btsync/bt然后按 TAB,它会扩展为ls .config/btsync/btsync.conf.

如果我输入vim .config/bt然后按 TAB,它会扩展为vim .config/btsync/.

但是,如果我输入vim .config/btsync/bt然后按 TAB,什么也不会发生(我希望它扩展为vim .config/btsync/btsync.conf,如上ls例所示。

以我自己的用户身份运行和以 su 身份运行时,我遇到同样的问题。

我读这个帖子其中提到了旧版本的 bash-completion 的问题,但我正在运行 2.1-5。

更新:经过一些额外的测试,我发现根本问题是 bash 将仅有的完整的目录名,而不是文件名。

更新:事实证明这bash-completion是总体原因。请参阅我对已接受答案的第二条评论。

任何有关此行为的潜在原因的建议将不胜感激!

答案1

我为您做了更多研究,这就是我的发现 - 自动完成的关键是bash命令complete。您可以打印使用规则vim

complete -p vim

同样,您可以通过以下方式删除这些特定规则:

complete -r vim

此命令将其重置为默认值 - 通常的路径和文件名完成,没有任何额外的逻辑。这可能就是你想要的。

有关更多信息,请查看help completeman bash并查找有关命令的部分complete(它是 bash 内置命令,因此记录在 bash 联机帮助页中)。

bash最后一点 -如果您想在每次登录后删除 vim 规则,则上述更改仅影响当前会话,complete -r vim~/.bashrc.

希望有帮助:)

答案2

Bash 默认情况下仅自动完成路径和文件名。然而,该机制是可扩展的,并且可以教导 bash 为不同的程序执行不同的自动完成。例如,git它可以自动完成子命令名称(克隆、提交)和修订版本,而不仅仅是路径名。有时它很方便,有时很烦人 - 例如当gzip -d拒绝自动完成没有.gz扩展名的文件名时。

Bash 完成通常配置在/etc/bash_completion.d- 你可能会vim在那里找到一个名为的文件。该文件包含vim命令行自动完成规则。

现在你有两个选择:

  1. 要么将文件修复为自动完成路径,正如用户可能期望的那样。
  2. 删除该文件以禁用特殊vim规则并仅执行默认路径自动完成。

当然,还要提交一份错误报告来概述问题,以便在未来的版本中得到修复:)

答案3

也许你可以重新安装 bash-completion : apt-get install --reinstall bash-completion

看看文件 /etc/bash.bashrc : nano /etc/bash.bashrc

并验证以下行是否已完全取消注释:

if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi

然后,重新启动终端会话

相关内容