使用vim命令自动执行Bash


13

在bash中,当发出vim比路径深两个目录的命令时,路径的自动补全最近已停止工作(它按预期与其他命令(如lscd)一起正常工作。

例如,如果我键入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是总体原因。请参阅我对已接受答案的第二条评论。

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


发布您的.bashrc
吉尔(Gilles)'所以

.bashrc根据需要链接到我发布的内容。
TheRogueWolf 2014年

既然发现了原因,就删除与.bashrc,.aliases和.function的链接与该问题无关。
TheRogueWolf 2014年

Debian 9上的同一问题,某些安装但不是全部:$
Philippe Gachoud

Answers:


10

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

complete -p vim

同样,您可以使用以下命令删除这些特定规则:

complete -r vim

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

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

最后一点-上述变化只影响当前bash会话,如果你想每次登录放后删除vim的规则complete -r vim,以你的~/.bashrc

希望有帮助:)


做到了。非常感谢。complete -p vim返回的命令complete -F _filedir_xspec vim已被complete -r vim命令删除,从而解决了该问题。我将对complete命令和-p开关返回的信息进行一些阅读。对于这种行为为什么会改变的原因有些疑惑,因此也会对此进行调查。
TheRogueWolf 2014年

3
毕竟,似乎bash的完成才是罪魁祸首。该_filedir_xspec函数/usr/share/bash-completion/bash_completion仅完成目录。我已经卸载了bash-completioncomplete -r vim从我的机器上删除了该行,.bashrc然后重新启动,vim现在的行为与预期的一样。
TheRogueWolf 2014年

3

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

Bash补全通常在以下位置配置/etc/bash_completion.d-您可能会vim在其中找到一个文件。该文件包含vim命令行的自动完成规则。

现在,您有两个选择:

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

并且当然要提交一份概述该问题的错误报告,以便在以后的版本中予以解决:)


非常感谢您的出色解释:)我已经查看了/etc/bash_completion.d,只有一个hg文件存在(用于Mercurial)。很奇怪。
TheRogueWolf 2014年

1
然后它必须在其他地方。尝试/usr/share/bash-completion/或列表中的所有从文件vim包或bashbash-completion包(不知道是怎么回事呼吁ArchLinux的)。它会在某个地方。
MLu 2014年

1
bash-completion软件包显示清单文件/usr/share/bash-completion/completions确实包含许多程序的规则,但不包含vim。列出随vim软件包一起安装的文件不会显示任何与完成相关的文件,使用搜索整个系统find / -name vim也不会显示与完成相关的文件。
TheRogueWolf 2014年

2

也许您可以重新安装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

然后,重新启动您的终端会话


我尝试删除bash-completion,测试vim行为,然后重新安装bash-completion和测试,但是在两种情况下我仍然遇到相同的问题。您列出的行不在中/etc/bash.bashrc。但是,此行是[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
TheRogueWolf 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.