比尔盖子 博客

布局与输入法独立的可能性 a.k.a 我为什么在勉强使用 Fcitx

输入源管理的统一

前两年 GNOME 开始将 iBus 集成为其的一部分,为用户提供更为一致的输入体验,引发了众多非议,包括强迫用户使用如此之烂的 iBus “输入法”(显然是把 iBus 框架和 ibus-pinyin 引擎混为一谈的),阻止用户换用其它输入框架等等。

实际上,系统只通过唯一的框架来配置输入源(键盘和输入法)是非常有必要的。键盘布局是桌面环境管理的,而输入法却是独立的,那么听谁的?产生布局冲突问题。作为一个非 Qwerty 布局用户,经常遇到的问题是需要对 DE 和输入法都设置布局 —— 两个布局是独立的(这还算是好的情况);只对其中一个设置布局 —— 因为两者互相修改全局布局,导致只配置一个就 好,还时常遇到一切换输入法或开关输入引擎,布局就会被重设;或者布局被解码两次,负负得正等于布局没变化的问题。

尽管我所理想的输入体验是,时刻在键盘布局之间切换,而输入引擎(输入法)的工作不受其影响。然而连成功更换一个布局都如此之难,这也算是奢望了。如果布局和输入法彻底统一,那么以上那些如此烦人的问题都将不复存在。

键盘与键盘布局

“键盘”是泛指带有按键的输入设备,但大多数情况下,它是指遵照 ANSI 或 IEC-9995 规定的规格制造的输入设备。 在 IEC-9995 中,只对键盘按键的分布和样式做了强制规定,并没有强制规定拉丁字母如何在按键上分配。因此, 一个最简的 IEC-9995 键盘是一个无刻键盘(或至少字母区是无刻的),可以采用任何(至少是字母区)排列,即”键盘布局“。

键盘的每一个物理按键被触发后,会向电脑发送一个”按键扫描码“,是物理按键本身的唯一标识符。操作系统接收到以后可能会先做第一步映射,把扫描码映射成按键,比如把 19 映射到 ALPHA_1_4(名字可以随便取,但不幸的是,一般这个按键本身会用 Qwerty 的名字,比如 R);然后再把按键翻译成字符,例如 ALPHA_1_4 翻译成 R 或者 P,对于不同的键盘布局,可采用不同的映射表,这也是设置键盘布局的标准方法。

然而,由于这种映射并不总是能够被正确完美的实现,在一些情况下,更换键盘布局会采用其它的方式,例如,直接拦截并修改原始的键盘扫描码,这样其它程序依然认为它们在使用 Qwerty 布局而完全不用修改,这种方法甚至经常被固化在键盘本身,可以在任何操作系统下实现布局切换; 或者拦截字母,把字母按照表格进行修改,例如,字母 R 时就把它改成 P。

输入法 = 算法 or 键盘 + 算法?

对于惯用基于拉丁字母编码体系输入方法(包括但不限于某些中文和日文输入法)的用户来说,一个输入法要做的仅仅是把捕获的字符输入进行运算,得出运算结果显示在屏幕上,而不必理会字符和原始键盘按键的对应关系。这是正确的,无论我 是通过 Qwerty 键盘的 2 行 2 个输入 “s” 还是通过 Dvorak 键盘的同位置输入 “o”,输入法都捕获获得经过布局解析后的最终结果,而不能与键盘布局相关。

然而,这在其它输入方案里不适用,任何不基于拉丁字母的输入方案都对键盘上的每个物理按键赋予的其它的解释,也就是说,它同时是一个键盘布局和一个算法。例如在大千式注音输入方案中,键盘 1 行 1 个的按键用于输入“ㄆ”。

因此可见,对这个问题的正确处理方法,理应是让输入法本身获取拉丁字母输入法捕获键盘上原始按键扫描码,按照它们自己的理解进行翻译,而基于拉丁字母方案的输入法可以默认按照 Qwerty 解释,也能额外配置布局。加入自动遵照系统全局布局的特性就更好(但这里就引出了矛盾,见后文)。

然而,由于 Qwerty 布局被视作”键盘“而不是”键盘“的一种布局,因此输入法并不是按照如此方式,而假设系统发送过来的字母一定是通过 Qwerty 输入的,把字母当作按键扫描码来使用(即上一段的第二种方式),输入法反而依附在了 Qwerty 布局之上,而不是自己解析布局,对于非 Qwerty 布局就产生了混乱。

实际可行性

在大多数输入法框架中,键盘布局和某种输入法是不做区分,这在逻辑上也是正确的,毕竟布局和输入法都是输入方案,无论是 OS X,Windows 还是 iBus 或是 Fcitx 都对其这样处理。这样一来,任何输入法和键盘布局的确可以按照之前我所说完美方案工作。

但通常基于拉丁字母的输入法永远声称自己使用 Qwerty 布局,不提供任何额外的布局设置,这的确是一个可以改进的地方,目前,我只发现 Fcitx 可以这样做。而 Windows IME 只能通过 Hack 键盘扫描码来来更换布局,非常不便。

走到了这一步,依然没有实现我“一键切换布局,无论有没有输入法,布局就都变了”了需求。我在前文提到,这可以通过“自动遵照 系统全局布局”来解决,但这就引出了矛盾 —— 所有输入方法一律平等,如何遵守不存在的“全局布局”。为了做到这一点,我们就需要把键盘布局和输入法分离开,这就破坏了输入源平等的统一原则。而且,但更何况键盘不仅仅可以输入拉丁字母,还可以输入其它字母,比如斯拉夫字母,输入这些基本字母时不(一定)需要输入法的参与,这就让前面“键盘布局规定的是英文字母排列”的假设失效,因此,我们实际上是要设立一个“拉丁字母全局布局”的选项,我的天啊,这都什么玩意儿啊!

我的现状

因为 iBus 和 Windows IME 都一样无法满足我的需求,因此我也只好放弃了,虽然它们本身其实都不算坏。由于 Fcitx 有不错的特性:可以对输入法单独设置布局,而且还能让它们“遵守第一个输入布局”。因此我这个“一切换布局,无论有无输入法,都会改变布局”的需求算是实现了,但“一键切换布局”的特性就无法实现了,切换布局时,需要用一个新布局替换原有的第一布局“,因此算是”勉强“使用。不过这已经很不错了,Fcitx 也是个不错的框架,改天写个插件大概我的最终需求也能实现啦。

Categories: IT生活

利用公共邮件列表进行邮件洪水攻击 » « PGP 邮件自动加密方案

4 Comments

  1. 这也是我不用 Dvorak 的原因之一。输入法解决方案一定是个问题……

  2. 支持 去我那看看吧 欢迎回访

  3. 自旧电脑坏掉以后,我就再也没有折腾LINUX了。

    • Thanks for including Leyte and Malapascua! I haven’t been to both LOL but these destinations are slowly getting recognized for diving. I just hope that it wo&27nu#8l1d;t be as touristy as Palawan in the future.

发表评论

Your email address will not be published.

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax

Copyright © 2018 比尔盖子 博客

Theme by Anders NorenUp ↑