带下划线的自动补全文件名

带下划线的自动补全文件名

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

答案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 ...

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

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

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

答案2

看一眼fzf。除了是一个出色的独立工具之外,它还支持“模糊”完成与你所描述的类似。

答案3

我真的很推荐鱼壳。 (https://fishshell.com/

它支持模糊匹配和强大的历史搜索/遍历。还包含其他功能。

如果需要,它的事件支持自定义完成功能,尽管内置的模糊搜索效果很好。在这里阅读更多内容:https://fishshell.com/docs/current/index.html#tab-completion

相关内容