No Zsh, para reverter o histórico de comandos de pesquisa, o atalho de teclado é Control-R. Por exemplo:
echo foo
echo bar
echo baz
Em seguida, pressione Control-R > Digite ec
> Você verá echo baz
> Pressione Control-R novamente > Você verá echo bar
.
Mas e se, depois de pressionar Control-R várias vezes, você tiver decidido avançar em vez de voltar? Vejo que as pessoas dizem que há Control-S para isso, mas também dizem que Control-S não funciona em muitos terminais por padrão, e parece que não funciona no Terminal padrão do macOS, nem no iTerm2.
O problema com Ctrl-S, no entanto, é que às vezes colide com o controle de fluxo XON/XOFF. - https://stackoverflow.com/a/791800
Talvez minha pergunta seja simplesmente uma duplicata, mas não acredito que não haja um atalho de teclado ou outra maneira de usá-lo pronto para uso, sem ajustes. Alguma ideia?
O tratamento de caracteres
^S
/^Q
que atrapalha o widgetreadline
's (usado pelo bash)forward-search-history
(vinculado a Ctrl+ snoemacs
modo) ouhistory-incremental-search-forward
o widget equivalente do zsh (vinculado a Ctrl+ se Ctrl+ x sno modo emacs) quando suaflowcontrol
opção está habilitada não é feito por terminais.Isso é feito pelo driver de dispositivo tty ou pela disciplina de linha , ou seja, do lado do computador, não do terminal, independentemente do terminal ou emulador de terminal que você esteja usando.
Quando está habilitado (e geralmente é habilitado por padrão), como com
stty ixon
, e com os valores padrão destty start
estty stop
que na maioria dos sistemas são^Q
e^S
respectivamente, quando o driver do dispositivo de terminal recebe um^S
caractere de controle do terminal (o que geralmente acontece quando você digita Ctrl+ s), ele para de enviar qualquer coisa de volta para o terminal, incluindo quaisquer aplicativos que gravem no arquivo do dispositivo de terminal e o eco local do que você digita até que um^Q
caractere seja recebido.Observe que, embora o aplicativo que lê no terminal não receba o
^S
caractere que foi manipulado pelo driver do dispositivo do terminal, ele ainda receberá mais entradas, apenas a saída é que será suspensa.Para desabilitar isso no editor de linha do zsh, você só precisa desativar a
flowcontrol
opção, como em:Então o zsh fará o equivalente
stty -ixon start '' stop ''
enquanto seu editor de linha estiver ativo (em seus prompts) e você pode usar Ctrl+ spara invocar ohistory-incremental-search-forward
widget ou Ctrl+ qpara invocar opush-line
widget.Fora do zle, ao executar outros aplicativos, essas configurações de controle de fluxo do driver de dispositivo terminal permanecerão inalteradas. Se você também quiser desabilitá-los lá (mas cuidado, alguns aplicativos podem desfazer essas configurações), você pode executá-los
stty -ixon start '' stop ''
manualmente, então o recurso será desativado em todos os lugares, não apenas no prompt do zle (pelo menos até que algo o ative novamente)Com
flowcontrol
on, como observado acima, você também pode invocar essehistory-incremental-search-forward
widget com Ctrl+ x sepush-line
também está vinculado a Alt+ qnoemacs
modo (à^[
q
sequência de caracteres que a maioria dos terminais envia em Alt+ qatualmente).