通常,当我传递一个文件名(这是当前目录中唯一可以通过 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
您会发现相同的规则适用于一大堆不同的命令(例如cp
、mv
、rm
...),因此如果您通过添加 来修改它-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
。