我需要添加什么,~/.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
答案3
我真的很推荐鱼壳。 (https://fishshell.com/)
它支持模糊匹配和强大的历史搜索/遍历。还包含其他功能。
如果需要,它的事件支持自定义完成功能,尽管内置的模糊搜索效果很好。在这里阅读更多内容:https://fishshell.com/docs/current/index.html#tab-completion