Readline .inputrc é redefinido para os padrões com todas as linhas

5

Estou tentando remapear chaves na linha de comando do bash. Eu tenho um arquivo .inputrc que eu reduzi para:

"\C-w": forward-word

Houve outras configurações, mas reduzi-as para uma por uma questão de clareza.

O que acontece é que em cada nova linha no shell, o C-w é redefinido para sua ligação padrão, unix-word-rubout . Eu posso recarregar o arquivo .inputrc com C-x C-r enquanto edito a linha e C-w assume a ação que eu atribuí a ela, forward-word . Então, na próxima linha do bash, ele é redefinido para unix-word-rubout novamente.

Se eu correr

> bind -P | grep C-w

Eu obtenho

unix-word-rubout can be found on "\C-w".

Mas se eu correr

> bind -P | grep C-w 

e depois recarregar .inputrc com C-x C-r antes de apertar enter, recebo

forward-word can be found on "\C-w", "\ef".

Então eu posso carregar o .inputrc bem e o bash até reconhece isso. Mas recarrega as configurações padrão em cada nova linha.

JLine, o clone do Java Readline não apresenta problemas ao usar meu .inputrc como pretendido.

Estou executando o bash no OS / X Yosemite. Estou executando a versão Homebrew 4.4.12, mas a versão 3.2.57 da Apple (de 2007) funciona exatamente da mesma maneira. Funciona da mesma forma no Terminal.app e iTerm2.

Gostaria que minhas configurações funcionassem em todas as linhas. Como posso fazê-los persistir?

    
por Brian 01.02.2017 / 08:45

1 resposta

5

O problema é que as comunicações em série também possuem algumas chaves definidas.
Use:

$ stty -a
speed 38400 baud; … …
swtch = <undef>; start = ^Q; stop = ^S; … … werase = ^W; …
-parenb …

Lá (dependendo das configurações do seu sistema) você deve ver:

werase = ^W

Esta é a definição stty de word-rubout como a chave ctrl W .

Basta executar:

stty werase undef

Para tornar a chave como undef pelo ssty controler.
Tenha cuidado com as alterações que você escolhe fazer, pois você pode tornar seu terminal inutilizável.

Em seguida, a chave estará livre para ser reatribuída pelo sistema readline do uso do shell bash.

Para fazer a alteração ( stty werase undef ) persistir, você pode colocá-la em /etc/profile para todos shells que usam esse arquivo (quase todos). Em /etc/bash.bashrc para todos os shells bash ou em ~/.bashrc para shells interativos "this user".

    
por 01.02.2017 / 21:57