我可以配置bash / readline自动将NBSP转换为正常空间吗?


10

我正在使用芬兰语键盘布局,该布局将AltGr+ 映射Space到不间断的空间(NBSP,U + 00A0)。总的来说,我对此感到满意,但是我发现在使用bash命令行时,我经常不小心在管道|符号“(用AltGr+ <用芬兰语键盘布局用+ 编写)” 之后写NBSP而不是普通空格。我猜这是由于我需要AltGr在输入管道时按住并在碰到空间之前将其释放而造成的。当我发布的时机不好时,AltGr我会在命令行中看到不正确的错字和错误消息,例如

 grep: command not found

看起来很像

grep: command not found

这使得这个问题很难在第一时间注意到。

我知道我可以禁用NBSP,但是我更喜欢仅在管道字符之后禁用它(具有AltGr+ Space以产生常规空间),或者如果不可能,则始终在bash命令行或readline级别上禁用它。有什么简单的方法可以执行此操作而无需修改 bash的源代码readline或我的终端仿真器(gnome-terminal)?

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


@dessert确实不需要赏金。我刚遇到问题,并写了一个问题。后来我通过Google搜索找到足够接近的配置,以找出以下答案。我仍在寻找使NBSP可见的答案,而不是在所有情况下都禁用该字符。我想我希望在读取行级别具有可见的NBSP,以便如果我在数据字符串中具有NBSP,则不会弄乱所有终端输出。
Mikko Rantalainen

@MikkoRantalainen您能更清楚地说明您仍然缺少什么吗?既然您找到了映射字符的方法,为什么还" ":␣不够?你还需要什么?
terdon

@dessert我很想拥有一个功能,可以在命令行上编写NBSP并获取,echo a␣b但输出结果行echo a b中的输出与真正的NBSP一致。因此,我认为这必须在读取行级别上完成(也就是说,命令行编辑器始终显示可见字符,但是终端仿真器无法知道编辑器显示与输出显示之间的区别,因此终端仿真器无法对呈现进行可视替换。 )。
Mikko Rantalainen

1
在readline级别上解决它确实不错,但是在终端的vim / emacs / etc中编写shell脚本时,您可能会遇到相同的问题。请参阅bugzilla.gnome.org/show_bug.cgi?id=788673,以获取适用于gnome-terminal的有效概念证明补丁,以突出显示字符串匹配项,包括单个NBSP字符。(是的,我知道您说过您不想修改任何源代码……)
egmont,

1
另一种方法是通过特殊的字体(在NBSP的字形不为空的情况下)以及一些fontconfig配置在字体级别上解决它。这也适用于图形编辑器,而不仅仅是终端。还有另一种方法是修改键盘布局以发出规则的空间,并在需要的情况下使用其他方法进入NBSP。
egmont

Answers:


9

这可以在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。

方法二

将以下内容放入.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库不够聪明,无法键入字符,以后在字符序列与配置匹配后替换已经可见的字符。)


0

有一篇很好的文章处理这个问题:

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

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

想法是使用此命令,~/.bashrc以便它在gnome-terminal打开时自动加载。但是正如我所说的,它还没有工作...


1
那只会处理错误消息。我更喜欢在编辑命令行时捕获问题,因为我可能正在编写类似的内容,perl -i -npe 's/MARKER/4 KB/'而我不小心在4和之间插入了NBSP K。糟糕,问题已存储到文件中,但是我没有收到任何错误,我编写的命令行看起来很完美。
Mikko Rantalainen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.