Bash:所有子文件夹上的 Tab 文件名补全
Bash: Tab filename completion on all sub-folders
有什么方法可以配置 bash 以便点击 Tab 键展开文件名将搜索所有子文件夹以及当前文件夹?
例如我的文件夹结构
readme.txt
colors/blue.txt
colors/red.txt
people/roger.txt
我希望 less r<tab>
(或者 less **/r<tab>
展开以显示所有以 r
:
开头的展开选项
readme.txt colors/red.txt people/roger.txt
假设如下情况,包括两级子目录:
.
├── colors
│ ├── blue.txt
│ └── red.txt
├── completion.bash
├── people
│ ├── rdir
│ ├── roger.txt
│ └── subdir
│ └── rhino.txt
└── readme.txt
你可以通过这个功能得到你想要的补全:
_comp_less () {
# Store current globstar setting and set globstar if necessary
local glob_flag
if shopt -q globstar; then
glob_flag=0
else
glob_flag=1
shopt -s globstar
fi
# is the word being completed
local cur=
# Loop over all files and directories in the current and all subdirectories
local fname
for fname in **/"$cur"*; do
# Only add files
if [[ -f "$fname" ]]; then
COMPREPLY+=("$fname")
fi
done
# Set globstar back to previous value if necessary
if (( glob_flag == 1 )); then
shopt -u globstar
fi
return 0
}
它检查 globstar
shell 选项并在必要时设置它(如果没有设置为开始则再次取消设置),然后使用 **/"$cur"*
glob获取所有完成当前单词的文件和目录(包括子目录),最后过滤掉目录名。
该函数可以放在您的 .bashrc
中,连同使用它的说明 less
:
complete -F _comp_less less
现在,less r<tab>
完成如下:
$ less r
colors/red.txt people/subdir/rhino.txt
people/roger.txt readme.txt
有什么方法可以配置 bash 以便点击 Tab 键展开文件名将搜索所有子文件夹以及当前文件夹?
例如我的文件夹结构
readme.txt
colors/blue.txt
colors/red.txt
people/roger.txt
我希望 less r<tab>
(或者 less **/r<tab>
展开以显示所有以 r
:
readme.txt colors/red.txt people/roger.txt
假设如下情况,包括两级子目录:
.
├── colors
│ ├── blue.txt
│ └── red.txt
├── completion.bash
├── people
│ ├── rdir
│ ├── roger.txt
│ └── subdir
│ └── rhino.txt
└── readme.txt
你可以通过这个功能得到你想要的补全:
_comp_less () {
# Store current globstar setting and set globstar if necessary
local glob_flag
if shopt -q globstar; then
glob_flag=0
else
glob_flag=1
shopt -s globstar
fi
# is the word being completed
local cur=
# Loop over all files and directories in the current and all subdirectories
local fname
for fname in **/"$cur"*; do
# Only add files
if [[ -f "$fname" ]]; then
COMPREPLY+=("$fname")
fi
done
# Set globstar back to previous value if necessary
if (( glob_flag == 1 )); then
shopt -u globstar
fi
return 0
}
它检查 globstar
shell 选项并在必要时设置它(如果没有设置为开始则再次取消设置),然后使用 **/"$cur"*
glob获取所有完成当前单词的文件和目录(包括子目录),最后过滤掉目录名。
该函数可以放在您的 .bashrc
中,连同使用它的说明 less
:
complete -F _comp_less less
现在,less r<tab>
完成如下:
$ less r
colors/red.txt people/subdir/rhino.txt
people/roger.txt readme.txt