忽略单个相同文件名的自动完成

忽略单个相同文件名的自动完成

通常,当我传递一个文件名(这是当前目录中唯一可以通过 Tab 自动完成的文件)到它之前的命令,然后按多个 Tab(错误地)时,相同的文件名会完成多次,我应该删除或取消并重新开始。

有什么方法可以禁用此行为(无需创建另一个文件或隐藏文件)?

ls <Tab>filename <Tab>filename <Tab>filename

答案1

一种解决方案是使用该nospace选项complete 内置

首先,您需要知道如何定义完成ls

$ complete -p ls
complete -F _longopt ls

然后你通过添加来修改它-o nospace

$ complete -o nospace -F _longopt ls

因此,即使Tab ↹多次点击,也不会匹配,也不会在命令行中添加任何参数。

副作用:如果要向 中添加另一个参数,则需要手动在行尾添加一个空格ls

为了避免这种副作用,您可以修改_longopt函数以防止它两次匹配相同的参数(这可能并不简单)。

如何将其应用于其他命令并使其永久化

在匹配后添加尾随空格是默认行为。我不知道-o nospace在使用 指定完成规则时除了使用之外是否还有其他方法complete

此外,请记住,完成规则是在某处指定的,即使对于内置命令也是如此(在我的笔记本电脑上的此文件夹中:)/usr/share/bash-completion。如果您查看该文件,/usr/share/bash-completion/bash-completion您会发现完成的定义位置ls

complete -F _longopt a2ps awk base64 bash bc bison cat chroot colordiff cp \
  csplit cut date df diff dir du enscript env expand fmt fold gperf \
  grep grub head irb ld ldd less ln ls m4 md5sum mkdir mkfifo mknod \
  mv netstat nl nm objcopy objdump od paste pr ptx readelf rm rmdir \
  sed seq sha{,1,224,256,384,512}sum shar sort split strip sum tac tail tee \
  texindex touch tr uname unexpand uniq units vdir wc who

您会发现相同的规则适用于一大堆不同的命令(例如cpmvrm...),因此如果您通过添加 来修改它-o nospace,则更改将影响ls所有其他命令。

如果您不习惯修改全局设置(您需要 root 权限),您可以将它们写入~/.bash_completion(创建此文件,如果不存在),如下所示

complete -F _longopt -o nospace a2ps awk base64 bash bc bison cat chroot colordiff cp \
  csplit cut date df diff dir du enscript env expand fmt fold gperf \
  grep grub head irb ld ldd less ln ls m4 md5sum mkdir mkfifo mknod \
  mv netstat nl nm objcopy objdump od paste pr ptx readelf rm rmdir \
  sed seq sha{,1,224,256,384,512}sum shar sort split strip sum tac tail tee \
  texindex touch tr uname unexpand uniq units vdir wc who

/usr/share/bash-completion/bash-completion如果您希望修改此处未列出的其他命令的补全,只需在文件或文件夹中查找它们即可/usr/share/bash-completion/completions

相关内容