É possível usar um comportamento diferente de seleção de menu zsh para diferentes comandos?

13

Estou usando o menu selectcomportamento em zsh, que invoca um menu abaixo do cursor onde você pode ver as várias possibilidades. A opção .zshrc que defini para isso é

zstyle ':completion:*' menu select=2

Por padrão, pressionar Returnpara selecionar uma possibilidade neste menu completa apenas a palavra - na verdade, ele não envia o comando. Por exemplo, eu posso obter um menu como este

~ % cd de<TAB>
completing directory:
[Desktop/]  Development/

Pressionar Returnaqui resultará em

~ % cd Desktop/

Preciso pressionar Returnuma segunda vez para realmente enviar o comando.

Posso modificar esse comportamento para que, ao pressionar Returnambos, selecione a conclusão e envie o comando fazendo isso

bindkey -M menuselect '^M' .accept-line

No entanto, há um problema com isso: às vezes eu preciso concluir um arquivo ou diretório sem enviar o comando. Por exemplo, talvez eu precise fazer isso ln -s Desktop Desktop2- com esse bindkeycomportamento, tentar concluir a área de trabalho resultará no ln -s Desktop/envio como comando e, obviamente, não quero isso.

Estou ciente de que apenas pressionar o espaço permitirá que eu continue com o comando, mas agora é um hábito.
Diante disso, existe uma maneira de fazer com que apenas alguns comandos permitam que você pressione Returnuma vez (como cd), mas todos os outros comandos exigem que seja pressionado duas vezes?

vacilar
fonte
Se o .zshrcarquivo não permitir, a resposta será simplesmente não, a menos que você mesmo ajuste o código-fonte para dar suporte ao comportamento baseado em comandos. Mas, então, você ainda tem que definir para que comanda para fazer isso, o que por si só é muito mais tediosa do que apenas pressionando inserir um adicional ...
Tamara Wijsman

Respostas:

3

Se você realmente precisa disso, teoricamente você pode definir uma função que verifique o comando que está executando e concluir ou enviar a linha.

Tente algo como isto (não testado):

commands=(ls cd)
# define widget function
function check-command {
    zle beginning-of-line
    zle forward-word
    RBUFFER=" $RBUFFER"
    if [[ ${commands[(r)$LBUFFER]} == $LBUFFER ]] ; then ; zle accept-line ; else; zle     end-of-line ; fi
}

# create widget from function
zle -N check-command

# bind widget
bindkey -M menuselect '^M' check-command

Fonte: usando o comando personalizado do antigo .inputrc no zsh?

báltico
fonte
0

Tecnicamente, não é possível da maneira que você está perguntando. Não sei se existe outra saída

Aexyn
fonte