Preenchimento automático do Bash com curinga

Preenchimento automático do Bash com curinga

Eu gostaria de digitar no terminal como faço no emacs:

emacs 2019-*subject*

Quando eu acerto, Tabrecebo a primeira partida:

2019-08-03-subject.markdown 

O que eu gostaria é que me mostrasse opções como:

2019-08-03-subject.markdown 2019-bla-bla-subject-predicate.markdown etc...

Procurei em todos os lugares online e não posso acreditar que isso não seja um recurso.

muitos semelhanteperguntas feitas.As respostas não funcionam como eu quero (mostradas acima). Outras soluções que tentei:aqui.

PS Eu uso o Ubuntu 16. Essa é uma funcionalidade típica que encontro no emacs quando abro arquivos. Seria muito conveniente.

Responder1

O que acontece depois Tabdepende dos scripts de conclusão.Esta respostame faz acreditar que o comportamento desejado existia para pelo menos um usuário em 2013, mas em 2019 o comportamento no meu Debian 9 é como você descreveu; possivelmente os scripts/comportamento mudaram desde então.

Além disso, o Bash escolhe um script de acordo com o comando digitado (primeira palavra da linha atual). Não é imediatamente óbvio que qualquer alteração possa afetar todas as conclusões para fornecer o que você deseja (acho que a _filedirfunção é um bom começo).


Felizmente você pode obter possíveis expansões sob demanda. De man 1 bash(sob o READLINEcabeçalho):

glob-complete-word( M-g)
A palavra antes do ponto é tratada como um padrão para expansão do nome do caminho, com um asterisco anexado implicitamente. Este padrão é usado para gerar uma lista de nomes de arquivos correspondentes para possíveis conclusões.

glob-expand-word( C-x *)
A palavra antes do ponto é tratada como um padrão para expansão do nome do caminho, e a lista de nomes de arquivos correspondentes é inserida, substituindo a palavra. Se um argumento numérico for fornecido, um asterisco será anexado antes da expansão do nome do caminho.

glob-list-expansions( C-x g)
A lista de expansões que teriam sido geradas por glob-expand-wordé exibida e a linha é redesenhada. Se um argumento numérico for fornecido, um asterisco será anexado antes da expansão do nome do caminho.

M-ge descreva C-x *as C-x gcombinações de teclas padrão. Em um formato mais amigável são:

  • Meta+ g( Alt+ g) para glob-complete-word,
  • Ctrl+ x, (release Ctrl) *for glob-expand-word(nota: *na verdade está Shift+ 8no meu teclado),
  • Ctrl+ x, (liberação Ctrl) gpara glob-list-expansions.

O código a seguir define essas ligações (caso elas estejam faltando por algum motivo):

  • apenas para o shell atual:

    # commands to run in Bash
    bind '"\eg":   glob-complete-word'
    bind '"\C-x*": glob-expand-word'
    bind '"\C-xg": glob-list-expansions'
    
  • ou na sua configuração permanente ( /etc/inputrcou ~/.inputrc):

    # lines to add
    "\eg":   glob-complete-word
    "\C-x*": glob-expand-word
    "\C-xg": glob-list-expansions
    

    (observe que isso afetará apenas novos shells, a menos que vocêrecarregar).


Você estará interessado em glob-complete-wordou glob-list-expansions. Principais diferenças:

  • glob-complete-wordsempre anexa um asterisco, enquanto glob-list-expansionsfaz isso condicionalmente (veja o manual citado).
  • Se houver muitas correspondências, talvez seja necessário acionar glob-complete-wordduas vezes (ou seja, pressionar a combinação de teclas duas vezes) antes de imprimir algo; isso depende show-all-if-ambiguous, compare oresposta já mencionada.
  • Se houver apenas uma correspondência, glob-complete-wordserá realizada uma conclusão de linha real, enquanto glob-list-expansionsainda será exibida apenas a correspondência.

No seu caso específico, digite isto:

emacs 2019-*subject*

então Ctrl+ x, g.

informação relacionada