【问题标题】:Bash: Tab filename completion on all sub-foldersBash:所有子文件夹上的选项卡文件名完成
【发布时间】:2016-10-30 21:41:09
【问题描述】:

有什么方法可以配置 bash,以便点击选项卡展开文件名将搜索所有子文件夹以及当前文件夹?

例如我的文件夹结构

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

【问题讨论】:

  • 只针对特定命令,还是始终?
  • 总是。 “x”通常会返回当前文件夹中以 x 开头的所有文件,我希望它也返回下面文件夹中的所有文件。
  • 我不确定这是否可能发生总是,因为它必须覆盖compgen -F 行为。不过,您可能会使用自己的完成功能为特定命令获得类似的东西。
  • 我当然会满足于特定的命令。当前用例正在运行分散在子文件夹中的测试。
  • 在尝试使用修改后的制表符完成来解决它之前:是否有任何东西阻止您使用 shopt -s globstar**/*something* 样式 glob,或 find -execfind | xargs,可能包含在一些便利功能中?

标签: bash command-line tab-completion


【解决方案1】:

假设如下情况,包括两级子目录:

.
├── 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

    # $2 is the word being completed
    local cur=$2

    # 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 2022-11-18
    • 1970-01-01
    相关资源
    最近更新 更多