Mei*_*eir 6 shell bash autocomplete
我需要添加什么~/.bashrc
,以便例如,如果有一个名为 的文件name_separated_by_under_score
,我可以按n- s- b- u-s然后 [TAB] 和外壳将自动完成文件名?(我记得看到这个选项)
听起来像是 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
不可全局变量。
归档时间: |
|
查看次数: |
659 次 |
最近记录: |