¿Puedo configurar bash / readline para convertir automáticamente NBSP a espacio normal?

10

Estoy usando la distribución del teclado finlandés que asigna AltGr+ Spaceal espacio sin interrupciones (NBSP, U + 00A0). Estoy contento con esto en general, pero encuentro que a menudo escribo accidentalmente NBSP en lugar del espacio normal después del |símbolo " " (escrito con AltGr+ <con diseño de teclado finlandés) mientras uso la línea de comando bash. Supongo que esto se debe al hecho de que necesito sostenerlo AltGrmientras escribo la tubería y liberarla antes de tocar el espacio. Y cuando tengo un mal momento para el lanzamiento AltGr, termino con un error tipográfico invisible en la línea de comando y mensajes de error como

 grep: command not found

que se parece bastante a

grep: command not found

lo que hace que este problema sea un poco difícil de notar la primera vez.

Sé que puedo deshabilitar NBSP pero preferiría deshabilitarlo (tener AltGr+ Spacepara producir espacio regular) solo después del carácter de canalización, o si eso no es posible, siempre en la línea o readlinenivel de comando bash . ¿Hay alguna manera simple de hacer esto sin modificar el código fuente de bash readlineo mi emulador de terminal ( gnome-terminal)?

Otra buena solución sería configurar NBSP para que sea visible de alguna manera en la línea de comando, por ejemplo, reemplazado con otro carácter (digamos U + 2423 ) para renderizar solamente.

Mikko Rantalainen
fuente
@dessert no necesita una recompensa, de verdad. Acabo de golpear el problema y escribí una pregunta al respecto. Más tarde, encontré una configuración lo suficientemente cercana a través de la Búsqueda de Google para encontrar la respuesta a continuación. Todavía estoy buscando una respuesta para hacer NBSP visible en lugar de deshabilitar el personaje para todos los casos. Creo que me gustaría tener NBSP visible en el nivel de línea de lectura para que toda la salida del terminal no se estropee si tengo NBSP en cadenas de datos.
Mikko Rantalainen
@MikkoRantalainen, ¿podrías explicar lo que todavía te falta más claramente? Ya que encontraste la manera de mapear personajes, ¿por qué no es " ":␣suficiente? Que más necesitas?
terdon
@dessert Me encantaría tener una función en la que pudiera escribir NBSP en la línea de comando y obtener, echo a␣bpero la línea de salida resultante estaba echo a bcon NBSP real en la salida. Como tal, creo que debe hacerse en el nivel de línea de lectura (es decir, el editor de línea de comandos siempre muestra caracteres visibles, pero el emulador de terminal no puede saber la diferencia entre la visualización del editor y la pantalla de salida y, por lo tanto, el emulador de terminal no puede hacer el reemplazo visual de la representación )
Mikko Rantalainen
1
Resolverlo en el nivel de línea de lectura es realmente bueno, pero puede encontrar el mismo problema al escribir un script de shell en vim / emacs / etc en la terminal. Consulte bugzilla.gnome.org/show_bug.cgi?id=788673 para obtener un parche de prueba de concepto para gnome-terminal para resaltar coincidencias de cadenas, incluido quizás el único carácter NBSP. (Sí, sé que dijiste que no querías modificar ningún código fuente ...)
egmont
1
Otro enfoque es abordarlo en el nivel de fuente, a través de una fuente especial donde el glifo de NBSP no está vacío, junto con alguna configuración de configuración de fuente. Esto también funcionaría para editores gráficos, no solo para el terminal. Otro enfoque es modificar la distribución del teclado para emitir espacio regular, y usar algún otro método para ingresar a NBSP en el raro caso de que eso sea lo que necesita.
egmont

Respuestas:

9

Esto se puede hacer en el readlinenivel de dos maneras diferentes.

Método 1

Ponga lo siguiente en .inputrc(el archivo de configuración 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)
" ":" "

Si Markdown arruina lo anterior, debe poner NBSP entre comillas en el lado izquierdo del colon como se explica en el comentario. Esto asignará cualquier ocurrencia de NBSP en la secuencia de entrada con un espacio regular.

Método 2

Ponga lo siguiente en .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

La idea es mapear la secuencia de teclas {tubería seguida de NBSP} a {tubería seguida de espacio}. Esto funciona si escribe la secuencia dentro de 250 ms (configurable arriba). Sin embargo, hasta que se agote el tiempo de espera, escribir solo el símbolo de tubería no generará nada. Y si escribe la secuencia demasiado lenta, la corrección no se aplicará. También tenga en cuenta que el tiempo de espera es global, por lo que si tiene la intención de usar cualquier otra secuencia, debe establecer el tiempo de espera el tiempo suficiente para poder escribir la secuencia más larga. (La biblioteca readline no es lo suficientemente inteligente como para permitir escribir los caracteres y luego reemplazar los caracteres ya visibles después de que la secuencia de caracteres coincida con la configuración).

Mikko Rantalainen
fuente
0

Hay un excelente artículo que trata este problema:

He estado tratando de abordar la preocupación principal con grepmensajes de error y cambiando NBSP a algo más visible usando el execcomando. Sin embargo, todavía no tengo la sintaxis abajo:

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

La idea es tener este comando ~/.bashrcpara que se cargue automáticamente con la gnome-terminalapertura. Pero como dije aún no funciona ...

WinEunuuchs2Unix
fuente
1
Eso solo se ocuparía de los mensajes de error. Preferiría detectar el problema mientras estoy editando la línea de comando porque podría estar escribiendo algo así perl -i -npe 's/MARKER/4 KB/'y accidentalmente deslizo un NBSP entre el 4y K. Vaya, el problema se almacena en un archivo pero no recibo ningún error y la línea de comando que escribí se ve perfecta.
Mikko Rantalainen