автодополнение имен файлов с символами подчеркивания

Esto no se puede hacer directamente con el nombre de archivo estándar.Sin embargo, puede probar la extensión por separado:

Suponiendo que desea probar un nombre de archivo en una variable:

case ${filename##*.} in
    *[!0-9]*) echo 'This is not the filename you are looking for' ;;
    *[0-9]*)  echo 'This is the file!'
esac

Esto primero elimina todo, desde el comienzo del nombre del archivo hasta el último punto, dejando solo el bit de extensión. Luego intenta hacer coincidir esta cadena (posiblemente vacía )con el patrón global *[!0-9]*, lo que tendrá éxito si la cadena contiene un dígito que no sea -. La segunda prueba es solo para asegurarnos de que realmente tenemos un dígito y no solo una cadena vacía en la extensión.

En su código de Python, primero podría generar una lista completa de todos los archivos, tomar esos nombres de archivo y eliminar el bit antes de la extensión, y luego probar la extensión con *[!0-9]*, si realmente necesita usar globbing.

Sin embargo, tengo la sensación de que hay formas más eficientes de hacer esto en Python.

6
30.04.2018, 01:31
3 ответа

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

1
27.01.2020, 20:30

Взгляните наfzf. Помимо того, что это отличный самостоятельный инструмент, он поддерживает "нечеткие" завершения , подобные тому, что вы описываете.

0
11.05.2020, 05:48

Я очень рекомендую рыбную скорлупу.(https://fishshell.com/)

Он поддерживает нечеткое сопоставление и отличный поиск/обход истории. Упакован с другими функциями, а также.

Это событие поддерживает пользовательские функции завершения, если это необходимо, хотя встроенный нечеткий поиск работает отлично. Подробнее здесь:https://fishshell.com/docs/current/index.html#tab-completion

0
28.12.2020, 14:33

Теги

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