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

αғs*_*нιη 5 bash autocomplete

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

有没有办法禁用这种行为(不创建另一个文件或隐藏文件)?

ls <Tab>filename <Tab>filename <Tab>filename
Run Code Online (Sandbox Code Playgroud)

fra*_*p21 3

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

\n\n

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

\n\n
$ complete -p ls\ncomplete -F _longopt ls\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
$ complete -o nospace -F _longopt ls\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n\n

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

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

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

\n\n

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

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

/usr/share/bash-completion/bash-completion如果您想修改此处未列出的其他命令的完成,只需在文件或中查找它们/usr/share/bash-completion/completions

\n