![使用 vim 命令进行 Bash 自动补全](https://linux22.com/image/40451/%E4%BD%BF%E7%94%A8%20vim%20%E5%91%BD%E4%BB%A4%E8%BF%9B%E8%A1%8C%20Bash%20%E8%87%AA%E5%8A%A8%E8%A1%A5%E5%85%A8.png)
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 complete
或man bash
并查找有关命令的部分complete
(它是 bash 内置命令,因此记录在 bash 联机帮助页中)。
bash
最后一点 -如果您想在每次登录后删除 vim 规则,则上述更改仅影响当前会话,complete -r vim
将~/.bashrc
.
希望有帮助:)
答案2
Bash 默认情况下仅自动完成路径和文件名。然而,该机制是可扩展的,并且可以教导 bash 为不同的程序执行不同的自动完成。例如,git
它可以自动完成子命令名称(克隆、提交)和修订版本,而不仅仅是路径名。有时它很方便,有时很烦人 - 例如当gzip -d
拒绝自动完成没有.gz
扩展名的文件名时。
Bash 完成通常配置在/etc/bash_completion.d
- 你可能会vim
在那里找到一个名为的文件。该文件包含vim
命令行自动完成规则。
现在你有两个选择:
- 要么将文件修复为自动完成路径,正如用户可能期望的那样。
- 删除该文件以禁用特殊
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
然后,重新启动终端会话