bash-completion
加载时,unrar x
按 Tab 键转到目录中的 RAR 存档后完成。
但对于具有新命名约定的多部分档案,例如
文件名.part01.rar
文件名.part02.rar
文件名.part03.rar
它看不到以 结尾的第一个存档之间有任何区别.part1.rar
,.part01.rar
或者.part001.rar
与所有其他部分(例如.part02.rar
从未直接打开的部分)之间没有任何区别,它完成了它们全部。
是否可以配置 bash-completion 以便仅第一部分多部分 RAR 存档已完成?这意味着文件以 □ 为大于 1 并带有前导零的数字(例如 2 或 02 或 002)结束.rar
,但不得以以下位置结束?.part□.rar
以下内容对我有用。我不知道这是否100%正确:
# unrar(1) completion -*- shell-script -*-
_unrar()
{
local cur prev words cword cmp_opts=1 i
_init_completion || return
# Check if all of the middle part are options.
# If not, we break at the last-option idx, and won't complete opts.
for ((i=1; i<${#words[@]}-1; i++)); do
# not using the whole list for checking -- too verbose
if [[ ${words[i]} != -* || ${words[i]} == '--' ]]; then
cmp_opts=0
break
fi
done
if [[ $cur == -* ]] && ((cmp_opts)); then # options
COMPREPLY=( $( compgen -W '-ad -ap -av- -c- -cfg- -cl -cu -dh -ep -f
-idp -ierr -inul -kb -o+ -o- -ow -p -p- -r -ta -tb -tn -to -u -v
-ver -vp -x -x@ -y' -- "$cur" ) )
elif ((cword == 1)); then # command
COMPREPLY=( $( compgen -W 'e l lb lt p t v vb vt x' -- "$cur" ) )
elif ((cword == i+1)); then # archive
_filedir '[rR][aA][rR]'
# If there is a second, third, ... ninth part
for i in "${COMPREPLY[@]}"; do
if [[ $i == *.part*(0)[2-9].[rR][aA][rR] ]]; then
# Only look for the first, since it's the only useful one
COMPREPLY=()
_filedir 'part*(0)1.[rR][aA][rR]'
break
fi
done
else # files.../path...
_filedir
fi
} &&
complete -F _unrar unrar
# ex: ts=4 sw=4 et filetype=sh
答案1
看着https://github.com/scop/bash-completion/pull/12/files了解如何完成此过滤。
基本上,您需要COMPREPLY[]
以某种方式进行后处理以消除错误完成。您也可以添加一个包装器:
_mycomp_unrar(){
local i
_unrar "${[@]}" # use the old one
# now copy the for i in "${COMPREPLY[]}" stuff
} &&
complete -p rar # remove old completion
complete -F _mycomp_unrar # use your good new one
或者您可以发送拉取请求(如上所示)并看看会发生什么。
添加了提交https://github.com/Arthur2e5/bash-completion-1/commit/a586ede修复零件存在导致正常文件无法显示的问题。 (整个 glob 是..不可读的。)
现在您也需要复制该if ((cmp_parts))
部分。另外,cmp_parts
本地化。