Posso configurar o bash / readline para converter automaticamente o NBSP em espaço normal?

10

Estou usando o layout de teclado finlandês que mapeia AltGr+ Spacepara o espaço sem quebra (NBSP, U + 00A0). Estou feliz com isso em geral, mas acho que escrevo acidentalmente NBSP em vez de espaço " |" normal após o símbolo " pipe" (escrito com AltGr+ <com layout de teclado finlandês) enquanto uso a linha de comando do bash. Eu acho que isso é causado pelo fato de que eu preciso segurar AltGrenquanto digito o cano e soltá-lo antes de atingir o espaço. E quando tenho um tempo ruim para o lançamento, AltGracabo com erros de digitação invisíveis na linha de comando e mensagens de erro como

 grep: command not found

que se parece bastante com

grep: command not found

o que dificulta a observação do problema na primeira vez.

Eu sei que posso desabilitar o NBSP, mas eu preferiria desabilitá-lo (tendo AltGr+ Spacepara produzir espaço regular) somente após o caractere de pipe, ou se isso não for possível, sempre na linha de comando ou readlinenível do bash . Existe alguma maneira simples de fazer isso sem modificar o código fonte do bash readlineou o meu emulador de terminal ( gnome-terminal)?

Outra boa solução seria configurar o NBSP para ficar de alguma forma visível na linha de comando, por exemplo, substituído por outro caractere (por exemplo, U + 2423 ) apenas para renderização.

Mikko Rantalainen
fonte
@dessert não há necessidade de uma recompensa, na verdade. Acabei de acertar o problema e escrevi uma pergunta sobre ele. Mais tarde, achei a configuração suficientemente próxima via Pesquisa do Google para descobrir a resposta abaixo. Ainda estou procurando uma resposta para tornar o NBSP visível em vez de desativar o caractere para todos os casos. Eu acho que gostaria de ter o NBSP visível no nível da linha de leitura, para que toda a saída do terminal não seja alterada se eu tiver o NBSP nas cadeias de dados.
Mikko Rantalainen
@MikkoRantalainen você poderia explicar o que ainda está faltando com mais clareza? Desde que você encontrou o caminho para mapear caracteres, por que não é " ":␣suficiente? O que mais você precisa?
terdon
@dessert Eu adoraria ter um recurso onde eu pudesse escrever NBSP na linha de comando e obter, echo a␣bmas a linha de saída resultante estava echo a bcom NBSP real na saída. Como tal, acho que isso deve ser feito no nível da linha de leitura (ou seja, o editor de linha de comando sempre exibe caracteres visíveis, mas o emulador de terminal não pode saber a diferença entre a exibição do editor e a exibição de saída e, portanto, o emulador de terminal não pode fazer a substituição visual da renderização )
Mikko Rantalainen 3/06/19
1
Resolvê-lo no nível da linha de leitura é realmente bom, mas você pode encontrar o mesmo problema ao escrever um shell script no vim / emacs / etc no terminal. Veja bugzilla.gnome.org/show_bug.cgi?id=788673 para uma correção de conceito de prova do gnome-terminal para destacar correspondências de string, incluindo talvez o único caractere NBSP. (Sim, eu sei que você disse que não queria modificar qualquer código-fonte ...)
Egmont
1
Outra abordagem é abordá-lo no nível da fonte, por meio de uma fonte especial em que o glifo do NBSP não está vazio, juntamente com algumas configurações do fontconfig. Isso também funcionaria para editores gráficos, não apenas para o terminal. Outra abordagem é modificar o layout do teclado para emitir espaço regular e usar algum outro método para inserir o NBSP nos raros casos em que isso é o que você precisa.
Egmont

Respostas:

9

Isso pode ser feito no readlinenível de duas maneiras diferentes.

Método 1

Coloque o seguinte em .inputrc(o arquivo de configuração para readline):

# include default system config because ~/.inputrc overrides system config
$include /etc/inputrc
# map NBSP to regular space (left part has NBSP in quotes, right part has space)
" ":" "

Se a marcação desarrumar o acima, você deve colocar o NBSP entre aspas no lado esquerdo dos dois pontos, conforme explicado no comentário. Isso mapeará qualquer ocorrência de NBSP no fluxo de entrada com um espaço regular.

Método 2

Coloque o seguinte em .inputrc:

# include default system config because ~/.inputrc overrides system config
$include /etc/inputrc
# map "pipe + NBSP" to "pipe + regular space" (left part has NBSP in quotes)
"| ":"| "
set keyseq-timeout 250

A idéia é mapear a sequência de teclas {pipe seguido por NBSP} para {pipe seguido pelo espaço}. Isso funciona se você digitar a sequência dentro de 250 ms (configurável acima). No entanto, até que o tempo limite acabe, a digitação do símbolo do pipe por si só não produzirá nada. E se você digitar a sequência muito lentamente, a correção não será aplicada. Observe também que o tempo limite é global; portanto, se você pretende usar outras seqüências, defina o tempo limite o suficiente para poder digitar a seqüência mais longa. (A biblioteca readline não é inteligente o suficiente para permitir a digitação dos caracteres e, posteriormente, substituir caracteres já visíveis após a sequência de caracteres corresponder à configuração.)

Mikko Rantalainen
fonte
0

Há um excelente artigo que lida com esse problema:

Eu tenho tentado abordar a principal preocupação com grepmensagens de erro e alterando o NBSP para algo mais visível usando o execcomando Ainda não tenho a sintaxe para baixo:

exec 2> >(tr $'\xa0' $'\x43' >&2) 

A idéia é ter esse comando ~/.bashrcpara que ele seja carregado automaticamente com a gnome-terminalabertura. Mas como eu disse, ainda não está funcionando ...

WinEunuuchs2Unix
fonte
1
Isso lidaria apenas com as mensagens de erro. Eu preferiria pegar o problema enquanto estiver editando a linha de comando, porque posso estar escrevendo algo como perl -i -npe 's/MARKER/4 KB/'e acidentalmente deslizo um NBSP entre 4e K. Ops, o problema é armazenado em um arquivo, mas não recebo nenhum erro e a linha de comando que escrevi parece perfeita.
Mikko Rantalainen