Comment #8 on issue 211 by
suxp...@gmail.com: “点石成金”模式下的标点输入表现
不一致
http://code.google.com/p/vimim/issues/detail?id=211
支持当正门,不过这个门下没了中英文标点切换功能……那个 vimim.cjk.txt 的好处是
能够用四角号码进行过滤,这种秒杀其它任何拼音输入法的功能当然应当深受广大技术
青年的热爱,所以在我这儿本来的表现就是开着这个后门。——直接 `svn checkout` 出
来的不就是这样么?
关于 `gi` 映射,依然维持原来的观点,这个键还是比较重要的所以我觉得最好换个别
的。`gi` 本来用于跳转到上次编辑处并进入插入模式,要完成同样的功能,我知道的
另外一条路是按 `` `^i `` 三个键,——而这三个键按上去并不方便;跟 `gi` 差不多
方便的一个按键是 `gI`,我所知道的意思是在行首进入插入模式,——模拟这个命令只
需要按下 `0i` 两个键,而且 `4gI` 跟 `04i` 的效果应该是一样的(据我所知)。
请 mxj 兄确认,如果 `gI` 只有这么个简单的可以很轻松的用其他按键序列替代的功
能的话,是不是把现在的 gi mode 进入方式换成 `gI`?
下面考虑中英文标点的问题:
普通输入法一般提供如下特性:在中文模式下可以输入中文标点(默认),或者切换成
纯英文标点输入模式(不转换标点按键;而普通输入法一般还有个关闭中文模式的英文
模式,在这个模式下,默认即输入英文标点(不转换按键),但还有个全角模式,将所
有输入按键转换成全角模式输入。在中文模式下,当然也有个全角模式,但是在上屏中
文字符和(某些)标点的时候不起作用,只有回车上英文时才将其转换成全角模式插
入。
以下是搜狗拼音输入法 6.2 的各种模式测试结果及分析:
----------------------------------------------------
* En normal:
abcABC
`1234567890-=\
~!@#$%^&*()_+|
[]{};':",./<>?
* En full width:
abcABC
`1234567890-=\
~!@#$%^&*()_+|
[]{};':",./<>?
* 中文普通:
abcABC
·1234567890-=、
~!@#¥%……&*()——+|
【】{};’:”,。、《》?
<!-- 注:单双引号自动匹配,下同 -->
* 中文全角中标:
abcABC
·1234567890-=\
~!@#¥%……&×()——+|
【】{};‘:“,。、《》?
* 中文半角英标:
abcABC
`1234567890-=\
~!@#$%^&*()_+|
[]{};':",./<>?
* 中文全角英标:
abcABC
`1234567890-=\
~!@#$%^&*()_+|
[]{};':",./<>?
----------------------------------------------------
从中可以看出,中文半角英标跟英文模式几乎一样(除了中文转换,英文需要
`Enter` 上屏)、中文全角英标跟英文全角模式几乎一样(同样除了中文转换和
`Enter` 上屏)。中文全角中标、中文半角中标、和这个全角英标是对原按键的三种不
同映射方法(虽然中间有重复)。
模仿现有输入法的特点,上述六种模式需要三个开关进行控制:中文转换开关、中英文
标点开关和全半角开关。对应的,考虑如下两个模块:中文转换模块,全半角标点转换
模块。其中第一个模块受中文转换开关控制,第二个模块受到后面两个开关的控制。这
两个模块的显著区别在于,中文转换模块很可能不是一对一所以需要显示候选菜单。
具体到 vimim,`gi`、`<C-^>` 或 `<C-_>` 均打开中文转换开关,由于全角模式用到
的不多自然关闭这个开关(但最好提供一个接口用来转换,默认不做映射处理),再根
据具体情况设置标点转换开关,比如,英文标点模式不做转换,中文连续模式中文标点
下直接转换,点石成金模式下保留目前 `gi` 的默认转换方式:按空格键转换(这个转
换方式很 sexy,但正如前面提到的,这个方式是不持久的,使用一次中文连续模式下
的标点输入再 `<C-L>` 循环到无菜单模式下时,中文标点直接上屏而不需要空格转
换,不过跟上面提到的相比,这个版本下点石成金模式的标点表现是一致的,都需要空
格转换,BTW vimim 彩蛋现在不提示版本信息了?svn 了下才知道当前版本是
11504)。
综合 vimim 当前状态和经典输入法状态,我所期待的使用手册应该大约写成这个样子
(以下开始胡编乱造胡言乱语胡猜乱想胡拉乱扯,其中如果出现任何理解错误请指
出,也欢迎将其补充成准正式版使用手册 :D):
VimIM Usage
===============================================
VimIM 支持如下两大类的中文输入模式:点石成金模式和连续输入模式。
## 点石成金 ##
所谓“石”即 ASCII 字符串,即直接通过键盘输入到 vim 窗口中的字串,可以是拼音
串、五笔码、四角号码等等,可以是标点符号。那么,“金”自然就是转换成的中文字
符、中文标点。点石成金的魔术棒就是键盘上最长的棒棒,——**空格键**。
VimIM 的点石成金有两种表现类型,其主要区别在于如何显示候选词菜单和如何选定候
选词。
### 无菜单模式 ###
在 vim *普通模式* 下进入无菜单点石成金模式的方式是使用 `gI` 命令,此时 vim
标题栏会显示输入法状态和时间,vim 末行显示“**插入 (语言)**”。按 `<ESC>` 将退
出无菜单模式返回 vim 普通模式。
无菜单模式下的合法字符串(“*石*”)包括以下几类:
+ 英文小写字母(不含 uv);
+ 数字;
+ 小写字母和数字的*某种组合*;<!-- ?? FIXME: what kind? -->
+ 单个标点符号
无菜单模式中,候选词列表替代 vim 本身的标题显示在标题栏中。对任何合法字符串
按下空格键进行转换后,第一候选词默认选中,如果是标点符号则直接上屏确认。对于
已经上屏的候选词,可使用回车键进行确认。确认之后候选词列表消失。为了保持连续
输入的速度,VimIM 允许您在候选词上屏之后直接进行后面的输入等操作而无需进行回
车确认。例如(在无菜单模式下,以拼音为例)
zhongwen<SPACE><ENTER>
Vim 窗口中显示“*中文*”,窗口标题变为一个列表,并在回车确认后消失。继续输入
shurufa<SPACE>.<SPACE>
会依次转换成“*输入法*”、“*。*”显示在 vim 窗口中。
如果第一候选词不是需要的结果,则可多次按空格键在列表中寻找,每按一次空格键便
向后(next)移动一位,直到找到正确的候选词,继续后面的输入或离开。由于候选词
列表较长时,采用空格键单步移动的速度会很慢,VimIM 提供了*更加优秀*的方式来快
速找到候选词,——四角号码过滤。例如(仍然在无菜单模式下)
shi<SPACE>08
会显示出“*施*”,继续输入
shi7<SPACE>
会显示出“*氏*”,继续输入
shi<SPACE>8shi<SPACE>41shi<SPACE>50<SPACE>
则可以输入“施氏食狮史”。
除空格外,VimIM 还支持在无菜单模式下使用 `<C-N>` 向后(next)移动和 `<C-P>`
向前(previous)移动来选择候选词。另外快捷键 `<C-E>` 用于取消转换。因此不用
担心因为多按了空格导致错过候选词问题的发生。针对这个问题有如下几种补救方案:
* 使用过滤码:当经过过滤后没有候选剩下的时候 VimIM 会自动重置候选列表;
* 使用 `<C-P>` 向前移动,回到前面错过的候选词;
<!-- TODO: <C-P> 跟 <C-N> 的移动跟空格的移动(中括号)是不一致的 -->
* 使用 `<C-E>` 取消此次转换,再按 `<SPACE>` 重新转换;
<!-- TODO: talk about the num 1 to refresh and others to select -->
如果要直接输入未转换的字符串,可直接使用回车键对当前输入进行确认:
english<ENTER><SPACE>letters.<ENTER><ENTER>
因此,无论是否进行了转换,在无菜单模式下输入换行符需要按*两次*回车键,而输入
空格的步骤为依次输入回车和空格。
<!-- TODO 空格键前面是空格等的时候是否该直接上空格? -->
**Tips**
+ 如果您的 vim 没有映射 `<SHIFT-SPACE>` 和 `<SHIFT-ENTER>`,可以直接使用它们
输入空格或者回车,前面不再需要使用回车键进行确认。
+ 无菜单模式下,VimIM 快捷键 `<C-^>` 用于切换输入法;`<C-_>` 快速切换至中文
连续模式;`<C-L>` 用于在几种中文输入模式间进行切换;
+ i 模式,以 i 开头的数字和字母具有特殊含义;
<!-- TODO -->
**NOTE**
如果启用云输入法进行长句输入时选择第一候选之外的词,由于候选列表
baidu, QQ, Google:
没有全部转换而显示出未转换的拼音串,
使用空格选择后面的候选词时会失败(可以换用 `<C-N>` 选择候选词)。
sogou:
没有全部转换而导致后面的拼音串部分消失。
<!--
Also try toggle: `yiqiezhengchang`, this is a BUG as I know.
TODO -->
因此,使用云输入法时注意候选词的转换结果,一般采用前面完全转换的候选词,如果
需要改可以等确认之后再修改。
无菜单模式使用小结
+ 在 vim normal mode 中,使用 `gI` 命令进入;
+ 所有“金”都需要使用空格键进行转换,不会自动上屏;<!-- TODO -->
+ 在“石”后使用空格键用于进行转换,否则直接上空格;<!-- TODO -->
+ 如果候选元素多于一个,空格键将在它们之间进行循环;
+ 当出现候选词列表时,*数字键*用于进行四角号码过滤,否则等待转换或确认;
+ 回车键用于进行输入串的确认;
<!-- Any more? -->
自己动手试一试
* 她有十个梦,so do I。
<!-- TODO more tests? -->
### 经典点石成金模式 ###
<!-- TODO: A better name, e.g. Sexy Menu, hjkl or whatever -->
在 vim *插入模式* 下进入菜单模式的方式是使用 VimIM 快捷键 `<C-^>`,此时 vim
标题栏显示输入法状态,vim 末行显示“**插入 (语言)**”。直到再次按下 `<C-^>`
后回到 vim 插入模式,或按下 `<ESC>` 回到 vim 普通模式。
菜单模式下的合法字符串(“*石*”)包括以下几类:
+ 英文小写字母(不含 uv);<!-- FIXME? -->
+ 数字;
+ 小写字母和数字的*某种组合*;<!-- ?? FIXME: what kind? -->
+ 单个标点符号;
+ VimIM 特殊处理的符号串 <!-- FIXME -->
菜单模式中,vim 标题栏一直显示输入法状态。对合法字符串(标点除外)按下空格键
进行转换之后,VimIM 将显示候选词菜单。
出现候选词菜单后,按键和功能有如下对应:
- 数字键 1234567890 用于进行四角号码过滤;
- 字母键 qwertyuiop 同样用于四角号码过滤(跟数字键区一一对应);
- jk 用于移动菜单中的高亮选择;
- h 用于转换菜单显示方式(简单、丰富);
- l 用于转换菜单显示长度(10 候选、所有/20 候选);
- s 用于进行繁简转换;
- n 刷新菜单;
- m <!-- ?? TODO -->
- abcdvfgxz 用于快速选择第二到第十候选;
- `<SPACE>` 用于选择第一候选词;
- `<ENTER>` 用于快速英文上屏;
- `/?` 用于在当前文件中(向后、向前)搜索当前候选词;
- `[]` 用于以词定字;
- `;'` 分别用于快速上屏第二、三候选词;
- `-=` 或 `,.` 用于翻页;
- `<C-^>` 用于将当前候选列表插入 vim 中;
- `<C-U>` 用于快速删除当前输入;
- `<ESC>` 用于快速英文上屏并返回 vim 正常模式;<!-- ?? -->
<!-- Any more? -->
**NOTE**
在某些 VimIM 特殊处理的字符串上,上述某些按键的功能发生了变化。
<!--
TODO: examples
-->
菜单模式使用小结
+ 在 vim insert mode 中,使用 `<C-^>` 命令切换;
+ 所有“金”都需要使用空格键进行转换,不会自动上屏;<!-- TODO -->
+ 在“石”后使用空格键用于进行转换,否则直接上空格;
<!-- TODO: BUG, 无法输入空格 -->
+ 如果候选元素多于一个,显示菜单,按键及意义参见前述;
+ 回车键上英文或直接换行;
## 中文连续模式 ##
在 vim 普通模式、插入模式下,使用快捷键 `<C-_>` 切换中文连续模式。此时,vim
标题栏显示输入法状态,如果进入插入模式,末行会显示“插入 (语言)”。此
时,vimim 快捷键 `<C-_>` 可关闭中文连续模式,`<C-L>` 用来切换中文输入模
式,`<C-^>` 用来切换输入法。`<ESC>` 可退出插入模式。在普通模式下,只有
`<C-_>` 用于关闭输入模式。
中文连续模式有两种形式,分别是动态模式和静态模式,这两种模式下的表现有所不
同。
### 中文动态 ###
这是 VimIM 的默认中文连续输入模式,其典型特点是同当前流行的各种输入法一
样,在输入串的同时动态的显示转换后的候选词菜单。因为这样,每次按键都需要
VimIM 进行处理,因而可能会受到连网速度(如果启用云输入)、磁盘 IO 甚至 CPU
主频的影响而显得很卡,这时您可能需要考虑换成中文静态模式了。
<!-- 具体参见某还没有完成的章节 -->
动态模式下的合法字符串(“*石*”)包括以下几类:
+ 英文小写字母(不含 uv);<!-- FIXME? -->
+ 单个标点符号;
+ VimIM 特殊处理的符号串 <!-- ?? -->
动态模式下,vim 标题栏一直显示输入法状态,并随着字符的键入动态的显示候选词菜
单,对中文标点的处理根据是否开启中文标点而直接确定,不需要进一步请求转换。
<!-- TODO: 中英文标点切换 -->
跟菜单模式不同,由于候选菜单大部分时间都在,当它出现后,按键和功能有如下对应
关系:
- 数字键用于选择候选词;
- 小写字母键会继续扩充已有的字符串;<!-- BUG? u and v -->
- 大写字母键使前面的英文串直接上屏并插入对应的大写字母;
- `<SPACE>` 用于选择第一候选词上屏;
- `<ENTER>` 用于直接上英文;
- `<C-^>` 将当前候选词菜单插入 vim 中;
- `[]` 用于以词定字;
- `-=` 用于翻页;
- `;'` 分别用于快速上屏第二、三候选词;
<!-- BUG? 跟直接选 2,3 效果不一致 -->
- `/` 用于在当前文件中向后搜索当前候选词;
- 其他标点符号导致第一候选词上屏并插入对应的标点;
<!-- FIXME: any more? -->
<!--
TODO: examples
-->
中文动态模式使用小结
+ 通过快捷键 `<C-_>` 进行模式切换;
+ 动态显示候选菜单,按键及意义参见前述;
+ 回车上英文,空格上第一候选或上空格;
<!--
BUG: space after english letters SOMETIMES failed to insert space.
-->
### 中文静态 ###
当感觉中文动态模式反应迟缓时,或者依个人爱好,VimIM 可以用经典的静态模式进行
连续中文输入,类似于经典输入法智能 ABC 的表现,除标点外的字符串需按下空格键
之后提交转换申请并显示候选词菜单,标点符号根据是否开启中文标点而直接确定并直
接上屏。
当按下空格请求转换并显示出菜单之后,其余操作和特性跟中文动态模式没有区别,因
此不再一一赘述。
<!-- BUG: 回车上英文之后无法输入空格,尽管可以用 <SHIFT-SPACE> 来完成,但不
够和谐 -->
----------------------------------
好吧,写着写着也不知道该怎么处理全半角了……暂且把全半角的问题放一下(本来想
用 ublahblah 这种类型,可是如果有英文词库显然不行,咦如果用 'blahblah 这种类
型呢?不过毕竟全角英文用到的不多,应该主要考虑全角标点的问题,——虽然也用得不
太多),对于中英文标点的处理方式,我的建议是在点石成金模式下,所有标点都使用
空格转换才能点成金,而不是直接出现。这样的话在这中模式下就不需要处理中英文标
点的问题。在中文连续模式下,必须还应该有个转换中英文标点的功能,跟常见输入法
的 `<Ctrl-.>` 一样。但是看来这个键在 vim 中是没法映射的。所以——要不要考虑再
找个别的东西映射一下,或者再 `重载` 一下现在的这么几个按键(没得可以重载了吧
)?
<!-- vim: set ft=markdown : -->
Attachments:
vimim.md 16.4 KB