Звучит как агрессивное завершение Emacs в стиле "частичного завершения" -.
Часто завершение указывается для команды -. Здесь мы используем complete -D
завершение по умолчанию (, но без какой-либо -загрузки обработчика завершения по запросу ), требуется bash -4.1 или более поздней версии. Это не будет работать хорошо (или вообще )с пакетом завершения bash -или другим дополнением, определяемым командой -, если оно у вас есть. Как есть, он также не будет завершать команды, только аргументы.
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
расширяет все слова, включая $()
или ``
(. При этом выполняется только тот код, который вы ввели в командную строку, так что это не «опасно» ). compgen -G
расширяет только глобусы, а ~
или ~user
не могут глобусить -.