zsh: conclusão separada para nomes de comandos e nomes de arquivos

5

Eu não quero concluir a tabulação do nome do arquivo para priorizar o início do nome do arquivo. Por exemplo, dado os nomes de arquivos red_blue.txt e blue_red.txt, eu não quero que a aba do vim red priorize o red_blue.txt

Isso pode ser feito usando:

zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z} l:|=* r:|=*'

No entanto, esse comportamento também será aplicado à conclusão de tabulação dos nomes de comando, o que eu não quero. Por exemplo, se você digitar nit tab procurando o comando "nitrogen", ele também corresponderá a comandos como mkinitcpio, xinit, compinit e vários outros.

Para comandos, gostaria que o preenchimento fosse usado:

zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'

Como posso fazer com que a conclusão da tab zsh trate nomes de arquivos e nomes de arquivos de maneira diferente?

    
por BrokeBack 23.07.2017 / 08:02

1 resposta

1

De um modo geral, você precisa refinar a zstyle chamada . que não se aplica a todas as conclusões, mas apenas ao preenchimento do arquivo. Para uma conclusão comum, a sintaxe do especificador de contexto é :completion:WIDGET:COMPLETER:COMMAND:ARGUMENT:TAG .

  • WIDGET é definido apenas por alguns widgets especiais, deixe-o genérico ( * ).
  • COMPLETER é complete para conclusão normal e pode ter outros valores para tarefas como autocorreção.
  • COMMAND é tipicamente o nome do comando cujos argumentos estão sendo concluídos. Mais precisamente, é a palavra depois de compdef . Alguns comandos complexos mudam ao concluir subcomandos. Para lugares especiais na sintaxe do shell, é um nome de contexto entre traços , como -parameter após um $ ou -command- para a primeira palavra em um comando.
  • ARGUMENT é tipicamente algo como argument-3 para o terceiro argumento de não-opção ou option--foo-1 para o argumento da opção --foo .
  • TAG é usado internamente por alguma função de conclusão, mas nem sempre é uma das tags convencionais nomes .

Em zstyle declarations , declarações mais específicas têm precedência sobre menos específicos.

  • Uma declaração com mais dois pontos ( : ) é mais específica que uma com menos dois pontos.
  • Com um número igual de colunas, uma declaração é pelo menos tão específica quanto outra se cada parte delimitada por dois pontos for pelo menos tão específica quanto a parte correspondente na outra. Para cada parte:
    • * é mais específico que qualquer outra coisa.
    • Qualquer coisa com curingas é mais específico que uma string simples sem curingas.

Assim, em geral, para criar uma exceção para os nomes de comandos, basta adicionar outra declaração zstyle que é especificamente sobre comandos.

No entanto, há uma diferença: matcher-list é aplicado globalmente, não no contexto da conclusão. No seu caso, desde que você queira apenas um único recurso, use matcher em vez disso.

zstyle ':completion:*' matcher 'm:{a-zA-Z}={A-Za-z} l:|=* r:|=*'
zstyle ':completion:*:*:-command-:*' matcher 'm:{a-zA-Z}={A-Za-z}'
    
por 18.03.2018 / 23:19