Desfazer expansão da guia?

4

No bash, pressionar a tecla Tab invoca o recurso conclusão programável e (a) expande para um caminho ou comando exclusivo que corresponde ao que é digitado ou (b) uma lista de opções possíveis.

É possível desfazer a expansão inteira feita pressionando a tecla Tab ?

Exemplo:

  1. Meu comando atual é ls application/views/ .
  2. Existem duas expansões possíveis nesse comando: helpers/ e scripts/ .
  3. Eu digito h e Guia , que se expande para helpers/ .
  4. Eu percebo que significava o outro scripts .
  5. Agora preciso excluir toda a expansão "helpers /".

Eu costumo apenas retroceder sobre o caminho inteiro ( helpers/ neste caso), porque eu acho impressionante a readline desfazer Control + _ tedioso. O que eu gostaria é de uma única sequência de teclas que exclua a correspondência completa da expansão, independentemente de quaisquer caracteres que eu tenha digitado inicialmente e de quaisquer espaços ou barras adicionados ao final.

Lista de sequências de teclas sugeridas por comentários ou minha própria leitura da referência do GNU . Nenhum desses atinge o objetivo :

  • Meta + b - Move de volta para o anterior / ou , mas não apaga.
  • Meta + Del - Apaga um caractere, não a palavra inteira.
  • Meta + Backspace - Move de volta um caractere sem deletar.
  • Controle + W - Exclui o caminho inteiro, não apenas a expansão. Então, no meu exemplo, depois de pressionar Tab , o bash expande isso para ls application/views/helpers , então quando pressiono Controle + W , o bash apaga application/views/helpers .

Se for relevante, estou usando o modo de edição vi em uma caixa do Gentoo Linux. Eu verifiquei minha configuração e não fiz nenhum remapeamento de caracteres.

    
por bishop 11.11.2015 / 15:44

1 resposta

8

Você está digitando as teclas, mas não as ligações da linha de leitura , isso pode explicar as diferenças no comportamento observado (tente bind -p ).

A única maneira que posso pensar para fazer exatamente o que você pede é usar uma função de conclusão personalizada que salva o estado do buffer e uma ligação de chave separada que invoca uma função de shell complementar para restaurá-lo .

Além da excelente sugestão do @Mark Plotnick para usar menu-complete , outras opções readline / bash são:

  • shell-backward-kill-word remove uma "palavra shell" que, no caso de um arquivo ou caminho expandido, será o nome completo do arquivo ou caminho
  • backward-kill-word remove uma "palavra readline", que, no caso de um arquivo ou caminho, será um componente de nome de arquivo ou diretório, incluindo o% arrastado/
  • undo , que desfaz cada mudança atomicamente, mas isso quase certamente requer várias tentativas para remover completamente uma expansão completa, isso é quase certamente a função que você ligou para ctrl - _ (bash padrão)
  • set-mark e kill-region são recursos readline menos usados, set-mark marca a posição atual do cursor e kill-region exclui da marca para o cursor. Isso requer que você invoque set-mark (padrão meta - espaço ) para que você possa usar mais tarde kill-region para excluir de volta (sem ligação padrão)
  • possible-completions (ligado a meta - = ) que lista as completações sem modificando o buffer de comando

Você também pode escrever sua própria função para modificar o buffer de entrada e vinculá-lo a uma função (aqui um que fiz anteriormente ) mas não vejo como isso seria muito melhor que backward-kill-word neste caso.

Você pode testar as ligações dinamicamente sem usar .inputrc usando o comando bind do bash, por exemplo:

bind "\C-o: backward-kill-word"
bind "\C-o: shell-backward-kill-word"

backward-kill-word é o melhor ajuste, a ligação padrão é meta ctrl - h . set-mark / kill-region seria melhor, mas não consigo pensar em uma maneira simples de automatizar o uso disso.

    
por 11.11.2015 / 19:54