Widget personalizado ZSH não está funcionando como eu acho que deveria

2

Estou tentando definir uma função para que eu possa iniciar o Midnight Commander pressionando Alt-, mas a função simplesmente não funciona.

Eu encontrei e modifiquei uma função em outro site e a modifiquei assim:

function _midnight {
    zle kill-whole-line
    zle -U "mc"
    zle accept-line
}
zle -N _midnight
bindkey '\e,' _midnight

E é isso que eu acho que estou dizendo para fazer:

define _midnight as {
erase everything on the line
insert "mc" on the command line
execute as a shell command
}
create _midnight as a custom widget
bind alt-comma to the widget

O que realmente faz é enviar um retorno de carro e depois inserir mc na próxima linha, sem enviá-lo.

O motivo pelo qual estou usando isso, em vez de bindkey -s '\e,' '^Umc^M , é porque eu gostaria de encontrar uma maneira de executar o Midnight Commander sem que nada aparecesse na linha de comando.

    
por Brian Myers 05.11.2014 / 00:38

1 resposta

2

A razão pela qual isso não funciona é porque zle -U "mc" envia "mc" para a pilha de entrada, ele não substitui o buffer de comando atual.

O que seu widget realmente faz é:

  • linha vazia
  • coloque "mc" na pilha de entrada
  • aceite a linha vazia

Após a linha ser aceita, zsh puxa "mc" da pilha de entrada e coloca o buffer atual. É por isso que parece que o widget só imprime "mc" sem fazer mais nada.

O resultado pretendido pode ser alcançado com

function _midnight {
    BUFFER="mc"
    zle accept-line
}

Mas você também pode fazer apenas:

function _midnight {
    mc
    zle reset-prompt
}

A principal diferença é que a primeira solução emula o que você estaria fazendo, por exemplo, digitando o comando e aceitando-o (isso inclui mc sendo gravado no histórico de comandos). Enquanto o segundo apenas inicia mc . zle reset-prompt é opcional, mas mc pode deixar seu cursor em posições ímpares ao sair.

    
por 05.11.2014 / 13:38