git - problema de atalhos de teclado interativos para esquerda / direita / delete

1

Estou usando o zsh no meu Mac e, após alguns truques de bindkey , consegui colocar left / right / delete / backspace para trabalhar em zsh (e bash). Em git --interactive , isso não funciona corretamente.

Quando tento confirmar coisas no modo interativo, apenas o backspace funciona. Quando pressiono à esquerda, à direita, apague as seqüências de escape ANSI para essas chaves: ^[[D ^[[C ^[[3~ . Quando eu olho para eles na minha lista de teclas, eles parecem estar configurados corretamente:

% bindkey | \grep -F "^[[D" 
"^[[D" backward-char
% bindkey | \grep -F "^[[C"
"^[[C" forward-char
% bindkey | \grep -F "^[[3~"
"^[[3~" delete-char

Isso ocorre tanto quando eu uso o bash quanto quando eu uso o zsh. Isso também acontece quando eu uso o xterm do X11 em vez do Terminal.app. Eu encontrei inúmeros posts sobre esses problemas no próprio zsh (por exemplo, neste fórum , este post ou em SU em si ), mas nenhum deles diz respeito ao git.

Em suma: esquerda / direita / delete keys do funcionam no meu shell, mas não em git --interactive . Como posso consertar isso?

    
por Tim 25.07.2011 / 11:23

1 resposta

1

Primeiro, chaves especiais são manipuladas pelo próprio programa, não pelo dispositivo tty. Quando você pressiona Esquerda , o Terminal.app envia ESC [D para bash , e a interpretação é da biblioteca Readline do bash .

As únicas exceções são as chaves listadas em stty -a - quando o tty está no modo "cozido", ele mesmo interpreta tais pressionamentos de tecla como Backspace. (Bash e Zsh usam o modo "raw", mas mudam temporariamente para "cozido" antes de executar um programa).

Segundo, os shells e git --interactive são completamente programas não relacionados. Quando você executa git , o shell está suspenso. Todos os programas obtêm acesso direto ao dispositivo tty, e cada um usa sua própria biblioteca para interagir com ele - bash usa Readline, zsh usa seu próprio ZLE, git --interactive lê o terminal diretamente. As ligações feitas em zsh só se aplicam quando zsh , não git , está lendo no terminal.

Como eu disse, git --interactive lê diretamente do terminal, o que significa que você não pode usar bindkey de Zsh ou ~/.inputrc de Readline com ele. Você teria que modificar o programa para usar Readline ou uma biblioteca semelhante. (Como o git-add--interactive é um script Perl, você pode reescrever partes dele para usar o Term :: ReadLine, mas eu não espero que ele seja aceito pelo autor.)

    
por 25.07.2011 / 11:52

Tags