我使用的是芬兰键盘布局,它将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
。但正如我所说,它还没有起作用……