方法 1

方法 1

我使用的是芬兰键盘布局,它将AltGr+映射Space到不间断空格 (NBSP,U+00A0)。总体而言,我对此很满意,但我发现在使用 bash 命令行时,我经常会不小心在竖线“ |”符号(用芬兰键盘布局用AltGr+表示<)后写 NBSP 而不是正常空格。我猜这是因为我需要AltGr在输入竖线时按住并在按下空格之前释放它。当我释放的时间不对时,AltGr我最终会在命令行上出现看不见的拼写错误和错误消息,例如

 grep: command not found

看起来非常类似于

grep: command not found

这使得这个问题第一次出现时很难被注意到。

我知道我能禁用 NBSP但我更愿意仅在管道字符之后禁用它(使用AltGr+Space来产生常规空格),或者如果这不可能,则始终在 bash 命令行或readline级别上禁用它。有没有简单的方法可以做到这一点而无需修改源代码bashreadline或者我的终端仿真器(gnome-terminal)?

另一个好的解决方案是将 NBSP 配置为在命令行上以某种方式可见,例如,用另一个字符(例如 U+2423 )替换仅用于渲染。

答案1

这可以通过两种不同的方式在层面上实现readline

方法 1

将以下内容放入.inputrc(配置文件中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)
" ":" "

如果 markdown 搞乱了上述内容,则必须将 NBSP 放在冒号左侧的引号中,如注释中所述。这会将输入流中出现的任何 NBSP 映射到常规空格。

方法 2

输入以下内容.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

这个想法是将键序列 {pipe 后跟 NBSP} 映射到 {pipe 后跟空格}。如果您在 250 毫秒内输入序列(可在上面配置),则此方法有效。但是,在超时结束之前,单独输入管道符号不会输出任何内容。如果您输入序列的速度太慢,则不会应用修复。还请注意,超时是全局的,因此如果您打算使用任何其他序列,则必须将超时设置得足够长,以便能够输入最长的序列。(readline 库不够聪明,无法允许输入字符并在字符序列与配置匹配后替换已经可见的字符。)

答案2

有一篇很好的文章讨论了这个问题:

我一直在尝试解决grep错误消息的主要问题,并使用命令将 NBSP 更改为更明显的内容exec。但我还没有完全掌握语法:

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

这个想法是让这个命令在打开~/.bashrc时自动加载gnome-terminal。但正如我所说,它还没有起作用……

相关内容