autocomplete nomes de arquivos com underscores

6

O que eu preciso adicionar ao meu ~/.bashrc para que, se, por exemplo, houver um arquivo chamado name_separated_by_under_score , eu possa pressionar n - s - b - u - s e depois [TAB] e o shell completará automaticamente o nome do arquivo? (Eu me lembro de ver essa opção)

    
por Meir 13.11.2017 / 15:47

1 resposta

0

Parece que o estilo de conclusão "conclusão parcial" é agressivo do Emacs .

Freqüentemente a conclusão é especificada por comando . Aqui usamos complete -D a conclusão padrão (mas sem nenhum carregamento do manipulador de conclusão sob demanda), o bash-4.1 ou posterior é necessário. Isso não funcionará bem (ou de jeito nenhum) com o pacote de conclusão bash ou outras conclusões definidas por comando, se você tiver alguma dessas. Como é, também não completará comandos, apenas argumentos.

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 ...

O padrão na condicional de kick-in pode limitar a ativação, pode ser alterado para .-.- , ou seja, mínimo de duas partes hifenizadas, ou .+-(.+-)+ permite mais de um caractere inicial (mais como o comportamento do Emacs). Você também pode modificar a expansão pat , a segunda forma alternativa não ativada acima permitiria - ou _ nos nomes correspondentes expandidos.

Se você não quiser nenhum separador em sua entrada (não está claro no seu exemplo se você quer hifens entre os caracteres), um pouco de trabalho extra é necessário, use o terceiro formulário acima. Veja esta resposta em stackoverflow, que explica para que //?/(.)/ e BASH_REMATCH estão sendo usados.

Observe que compgen -W expande todas as palavras, incluindo $() ou '' (isso somente executa o código digitado no prompt de comando, portanto, não é "perigoso"). compgen -G apenas expande globs e ~ ou ~user não são globáveis.

    
por 28.08.2018 / 21:29