Завершение zsh для неожиданного "0" в списке уничтожений

Звучит как агрессивное завершение 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не могут глобусить -.

2
28.06.2021, 11:14
0 ответов

Теги

Похожие вопросы