带下划线的自动完成文件名

Mei*_*eir 6 shell bash autocomplete

我需要添加什么~/.bashrc,以便例如,如果有一个名为 的文件name_separated_by_under_score,我可以按n- s- b- u-s然后 [TAB] 和外壳将自动完成文件名?(我记得看到这个选项)

mr.*_*tic 1

听起来像是 Emacs 激进的“部分完成”完成风格

通常为每个命令指定完成。这里我们使用complete -D默认完成(但不加载任何按需完成处理程序),需要 bash-4.1 或更高版本。这对于 bash-completion 包或其他按命令定义的完成(如果您有其中任何一个)来说不能很好地工作(或根本不能工作)。事实上,它也不会完成命令,只会完成参数。

function _bc_magicmatch() {
  local cur=${COMP_WORDS[COMP_CWORD]} # the current token ($2 iff bash>=4.3)
  local pat prefix

  ## kick-in condition
  [[ $cur =~ ^(.*/)?([^/]+) ]] && {    # match (path/)(name)

    prefix=${BASH_REMATCH[1]}
    pat=${BASH_REMATCH[2]}
    prefix=$(compgen -W "$prefix")     # expand specials, like ~

    ## first form: "-" in input for "_" in expanded names
    pat="${pat//-/*_}*"  # sprinkle "*" in to allow expansion

    ## second form: "-" in input matches [_-] in expanded names
    #pat="${pat//-/*[_-]}*"  # sprinkle "*" in to allow expansion

    ## third form: for no "-" at all in input
    #[[ $pat =~ ${pat//?/(.)} ]]  # split into character array
    #IFS="*" pat="${BASH_REMATCH[*]:1}*" # add IFS separator, skipping index 0

    readarray -t COMPREPLY  < <(compgen -G "${prefix:+$prefix}$pat")
    return
  }
  COMPREPLY=() # revert to completion defaults
}

# bind completion function
complete -D -o bashdefault -o default -o nospace -F _bc_magicmatch
## or selectively, for a subset of commands (works with bash<4.1)
# complete -o bashdefault -o default -o nospace -F _bc_magicmatch cmd1 cmd2 ...
Run Code Online (Sandbox Code Playgroud)

启动条件中的模式可以限制激活,可以将其更改为.-.- 最少两个连字符部分,或.+-(.+-)+允许多个主角(更像 Emacs 行为)。您还可以修改pat扩展,上面未启用的替代第二种形式将允许-_在扩展匹配名称中。

如果您在输入中根本不需要任何分隔符(从您的示例中不清楚您是否希望在字符之间使用连字符),则需要做一些额外的工作,请使用上面的第三种形式。请参阅stackoverflow 上的这个答案//?/(.)/,其中解释了和 的BASH_REMATCH用途。

请注意,它compgen -W会展开所有单词,包括$()or ``(这只执行您在命令提示符中键入的代码,因此它不是“危险的”)。compgen -G只扩展全局变量,并且~~user不可全局变量。