Procurando a solução ALT + LeftArrowKey no zsh

128

Recentemente, mudei do bash para o zsh, mas sinto falta do meu Alt+ LeftArrowKeye Alt+ RightArrowKeypara ir e voltar uma palavra de cada vez.

Agora, se eu pressionar Alt+ LeftArrowKey, volto algumas letras e fico presa. Eu não irei mais para trás e ele não voltará ao final da linha com Alt+ RightArrowKeycomo eu esperaria. Eu não posso nem usar as setas do teclado para ir até o fim da linha, apenas até o penúltimo. Não é possível inserir novos caracteres na linha ou excluir de fato.

Como obtenho meu atalho de volta?

Estou no Mac OS X usando o Terminal, se isso for importante.

Mads Ohm Larsen
fonte

Respostas:

241

Execute cate pressione as teclas para ver os códigos que o seu atalho envia.
(Pressione Ctrl+ Cpara matar o catquando terminar.)
Para mim, (ubuntu, konsole, xterm), pressione Alt+ envia ^[[1;3D, para que eu coloque no meu .zshrc

bindkey "^[[1;3C" forward-word
bindkey "^[[1;3D" backward-word

(Na verdade, eu prefiro usar a Ctrlseta + para mover palavra por palavra, como em uma caixa de texto normal no windows ou linux gui.)

Pergunta relacionada: Corrija as configurações das teclas (Início / Final / Inserir / Excluir) no .zshrc ao executar o Zsh no Terminator Terminal Emulator

lolesque
fonte
14
Você é meu salvador! No meu Mac "Alt + <-" deu "^ [b" e -> deu "^ [f", então eu adicionei estes. Funciona como um encanto. As setas Ctrl + estão reservadas para alternar entre áreas de trabalho no Mac.
Mads Ohm Larsen
Uma observação é que para ctrl + <- cat estava relatando ^[[Dpara mim enquanto ctrl + v estava relatando ^[OD. A sugestão de Ctrl + v funcionou, mas a de gato não. Além disso, ctrl + v relatava a mesma coisa para alt + <- e alt + ->. Consegui adicionar esses dois examinando a saída do gato e substituindo qualquer "[[" por "O")
Mike S
10
minha saída em cat é ^[^[[Cpara palavra direta e ^[^[[Dpara trás, mas a atualização para essas no .zshrc não funcionou por algum motivo.
Yunti 19/05
2
@Yunti - Colocar bindkey "^[^[[D" backward-worde bindkey "^[^[[C" forward-wordem ~ / .zprofile funcionou para mim!
Fernando Espinosa
Homem! Salvou a minha vida! obrigado por compartilhar!
Joao Henrique
186

Para quem usa o iTerm, independentemente do shell

Todas as soluções oferecidas aqui adotam uma abordagem inversa na minha opinião. Você está basicamente dizendo ao seu shell para ouvir alguma sequência esc ou outra ligação de chave que você definiu no seu terminal, criando problemas de compatibilidade ao alternar shells (se você fizer o SSH em outro shell, mude de BASH para ZSH, etc. e você perde alguns, se não todos, os atalhos de teclado).

A maioria dos shells possui um conjunto de seqüências padrão pré-vinculadas. Além disso, embora não sejam 100% consistentes, estão próximos o suficiente. Portanto, a maneira mais fácil que eu encontrei de criar a combinação de teclas para uma ação específica no shell é dizer ao seu aplicativo de terminal que se vincule às combinações de teclas padrão que são consistentes entre os shells.

Eu escrevi uma solução compressiva para fazer com que o seu terminal responda o mais próximo possível dos atalhos de teclado nativos do Mac aqui

Abra as preferências do iTerm + ,e navegue até a Profilesguia (a Keysguia pode ser usada, mas a adição de teclas ao seu perfil permite salvar o seu perfil e sincronizá-lo com vários computadores) e keyssubguia e digite o seguinte:

Mover o cursor uma palavra para a esquerda

+ Enviar códigos hexadecimais:0x1b 0x62

Mover o cursor uma palavra para a direita

+ Enviar códigos hexadecimais:0x1b 0x66

E isso deve fornecer o comportamento desejado não apenas no ZSH, mas também se você fizer o SSH em um servidor executando BASH, irb / pry, nó etc.

Travis
fonte
1
Eu estava tendo problemas com a solução aceita porque o zsh estava funcionando bem, mas não o irb e outros consoles. Apagar configurações anteriores (no perfil do iTerm, conforme sugerido) funciona como um encanto!
Llekn 28/05
1
solução bindkey faria um erro irritante soar no Mac. Este deve ser o caminho certo para fazê-lo.
Weishi Zeng
@ Lev Provavelmente porque seu shell não está mapeado para a configuração padrão. Executar, bindkey | grep forward-wordvocê deve ver "^[f" forward-wordretornado, mas se não, você tem 2 opções. mapear para um dos outros retornados ou adicionar "^[f" forward-wordao seu .zshrc.
Travis
Observarei que essa "^[f"parece ser a ligação mais consistentemente usada para forward-worduso em shells e a única definida por padrão na minha versão do bash.
Travis
De alguma forma, funcionou com o botão de comando para mim, em vez de opção. Obrigado cara. :)
Vaibhav Jain
72

Adicionar o seguinte ao ~ / .zshrc funcionou para mim no OSX Mountain Lion.

bindkey -e
bindkey '[C' forward-word
bindkey '[D' backward-word
Rob Sawyer
fonte
4
Esta solução aciona uma "campainha" no iTerm 2 a cada uso, portanto, pular entre palavras pode ser realmente irritante.
Matthew Morek
1
alguém descobrir como impedir que isso aconteça ^ @MatthewMorek
Daniel Kobe
18
'\ e \ e' impede a campainha. Minha configuração no El Capitan com o iTerm 2 no modo de compatibilidade de terminal é bindkey "\e\e[D" backward-word bindkey "\e\e[C" forward-word
Johannes Gontrum 28/08
Obrigado, isso resolveu o problema no macOs Sierra. Não recebo nenhum sino no Terminal ou no iTerm2.
Raspo
Como você o define para passar do final das palavras e não do começo ou delas?
perfil completo de Mafro
22

No MacOS High Siera 10.13.6 ou Mojave 10.14.2 e usando o iTerm2 com ZSH Para passar das palavras, devo colocar assim:

bindkey "\e\e[D" backward-word
bindkey "\e\e[C" forward-word

Outras soluções não funcionam

Vetalll
fonte
1
Esta é a única solução que funcionou para mim também. Obrigado! Mac OS Mojave
jamescampbell
Também funciona no OS Catalina!
Reed Richards
7

Embora não responda estritamente à sua pergunta, a ligação padrão para forward-worde backward-wordsão alt-fresp. alt-b.

Isso funciona em qualquer lugar, não requer que você saia da linha inicial e possui uma boa propriedade mnemônica (f = para frente, b = para trás), além de ser consistente com ctrl-fe ctrl-bsendo forward-charactere backward-character.

Rasgue suas teclas de seta!

0x89
fonte
4
não funciona para mim no zsh / iterm2, imprime ƒ e ∫ (cb cf funciona).
Davorin
2

Para fazê-lo funcionar, usei esta resposta , porém tive que trocar os códigos (esquerda <-> direita)

← + ← Enviar códigos hexadecimais: 0x1b 0x66
⌥ + → Enviar códigos hexadecimais: 0x1b 0x62

e adicione o seguinte ao meu ~/.zshrc

bindkey -e
bindkey "^[b" forward-word
bindkey '^[f' backward-word
iRonin
fonte
1

No Mavericks (10.9.4), o código é 1; 5 ... então, para ligar alt com setas, tenho meu .zshrc usando este:

bindkey "^[[1;5C" forward-word
bindkey "^[[1;5D" backward-word

Você pode usar CTRL + V e, em seguida, o comando que deseja usar

em Yosemite, use a solução de Rob

ZeoS
fonte
1
bindkey "[C" forward-word bindkey "[D" backward-word
Farkie
0

No zsh, você pode usar o bindkeycomando para ver os atalhos do teclado.

Use bindkeypara explorar as opções disponíveis sem combinações de teclas personalizadas.

Ou seja, ^[b mover uma palavra para trás e ^[favançar uma palavra.

MCI
fonte