Expandir sinal menor que quando usar multios e cinta expandir

2

Com o zsh multios set ( setopt multios ) é possível fazer coisas como:

< in1 < in2 > out

e:

< in > out1 > out2

que é muito conveniente.

Eu quero combinar este recurso com a expansão de chaves ( setopt braceexpand ), então quando eu digo:

<in{1,2}^I

( ^I é uma guia literal e invoca o sistema de conclusão), eu quero expandir para:

<in1 <in2 

mas em vez disso eu obtenho:

<in1 in2

Existe uma maneira fácil de modificar esse comportamento?

    
por Thor 17.12.2012 / 09:06

2 respostas

1

Esta é a configuração do completer que estou usando:

zstyle ':completion:*' completer _complete _list _expand _oldlist _ignored _match _correct _approximate _prefix

A configuração substituta é o padrão, ou seja, 1.

Vendo a resposta e as indicações de Chris na direção certa, percebi que isso deve ter algo a ver com minha configuração.

Eu comecei a bisbilhotar com a ordem do completer e a configuração substituta, nenhuma das quais mudou o comportamento. Comparando as configurações, usando o arquivo de configuração mínimo fornecido por Chris, com o meu próprio, reduzi o problema ao meu arquivo bindkey e, a partir daí, até bindkey -v . Isso tem o efeito colateral de definir ^I para expand-or-complete , o que, por algum motivo, os botchs desejam a expansão.

Como desejo continuar usando os mapas de teclado viins e vicmd , a solução para mim foi alterar o comportamento das guias para complete-word :

bindkey -M viins "\CI" complete-word
bindkey -M vicmd "\CI" complete-word

tl; dr

Se você estiver usando viins ou viicmd como mapa de teclado, lembre-se de alterar ^I para complete-word :

bindkey -M viins "\CI" complete-word
bindkey -M vicmd "\CI" complete-word
    
por 28.02.2013 / 09:31
3

Seu comportamento desejado funcionou automaticamente com minhas configurações de conclusão existentes (que foram geradas por meio de compinstall algumas vezes), então eu demorei um pouco para restringir as configurações específicas responsáveis.

A funcionalidade principal é fornecida pelo _expand "completer". Você pode incluí-lo assim:

zstyle ':completion:*' completer _expand

Se você também estiver usando o _completer completer, _expand precisará ser listado primeiro. Por exemplo, aqui está minha configuração real do completer:

zstyle ':completion:*' completer _expand _complete _ignored _match _approximate _prefix

Em seguida, para ativar a expansão de chaves, você precisa ter substitute ativado. Isso é ativado por padrão, mas você pode ser explícito sobre isso assim:

zstyle ':completion:*' substitute 1

Se você não deseja que isso seja ativado em todos os lugares, é possível desativá-lo globalmente e ativá-lo apenas para _expand da seguinte forma:

zstyle ':completion:*' substitute 0
zstyle ':completion:*:expand:*' substitute 1

Eu testei isso com zsh versões 4.3.11 e 5.0.2 iniciando um novo shell com zsh -df e obtendo um arquivo contendo o seguinte:

zstyle ':completion:*' completer _expand
zstyle ':completion:*' substitute 0
zstyle ':completion:*:expand:*' substitute 1
autoload -Uz compinit
compinit

(As opções multios e no_ingore_brace (para as quais brace_expand tem alias) são os padrões, então não precisei explicitamente alterá-las.)

Em seguida, digitei cat <in{1,2} e pressionei Tab. Você precisará pressionar Tab várias vezes: uma vez para cada variante expandida e mais uma vez para acessar a entrada “todas as expansões” (um total de três vezes para o exemplo acima); Eu não encontrei uma maneira de fazer essa entrada em particular vir em primeiro lugar.

    
por 28.02.2013 / 08:09