Issue 211 in vimim: “点石成金”模式下的标点输入表现不一致

40 views
Skip to first unread message

vi...@googlecode.com

unread,
Nov 14, 2011, 8:26:59 AM11/14/11
to vi...@googlegroups.com
Status: New
Owner: ----
Labels: Type-Defect Priority-Medium

New issue 211 by suxp...@gmail.com: “点石成金”模式下的标点输入表现不一致
http://code.google.com/p/vimim/issues/detail?id=211

What steps will reproduce the problem?
1. 打开 vim,gi 进入中文无菜单模式或者 i Ctrl-^ 进入点石成金模式,输入标点
`.',此时显示为 `.',按下空格键,半角英文句点变身为中文句号 `。';
2. Ctrl-_ 进入中文输入模式 / Ctrl-l 切换成中文输入模式,此时输入 `.'将自动变
成 `。';
3. Ctrl-l 切换或者 Esc gi 或者 Ctrl-^ 再次回到点石成金模式,按下键盘 `.',此
时不需要按空格键转换而是直接输入 `。'。

What is the expected output? What do you see instead?
统一模式下表现持久一致,这似乎应该是任何“用户友好”软件的处理方式,VimIM 似乎
在这方面还有点问题 :)

What version of the product are you using? On what operating system?
vimim
 
日期:2011年11月14日 星期一
电脑:win32 0.091251 seconds
版本:gvim.exe=703 vimim.vim=11466
编码:cp936 ucs-bom,utf-8,gb18030
环境:Chinese (Simplified)_People's Republic of China.936
词库:标准字库:E:/Install/Vim/vimfiles/bundle/vimim/plugin/vimim.cjk.txt
词库:英文词库:E:/Install/Vim/vimfiles/bundle/vimim/plugin/vimim.txt
词库:云词库:QQ云 搜狗云 百度云 谷歌云 
联网:HTTP executable: E:/Install/Vim/vimfiles/bundle/vimim/plugin/libvimim
输入:VimIM 点石成金  谷歌云  四角号码 英文 
选项:vimimrc
:let g:vimim_punctuation = 3
:let g:vimim_toggle = 'qq,sogou,baidu,google'
" :let g:vimim_cloud = 'google,sogou,baidu,qq'
" :let g:vimim_map = ''
" :let g:vimim_mode = 'dynamic'
" :let g:vimim_mycloud = 0
" :let g:vimim_plugin = 'E:/Install/Vim/vimfiles/bundle/vimim/plugin'
" :let g:vimim_shuangpin = 0


Please provide any additional information below.
由于长期在用 Vim-LaTeX,而当时的 VimIM 与这个炫酷无比的插件有些冲突,于是又
一个很久没有在用 VimIM,新版看来变化不小,追踪了下邮件列表并升级后测试,确实
多了好多功能,很惊艳,当然问题还是有的。

以下是若干我的所见与意见,有些疑问可能算不上 Issue 所以就都放在这儿了,其中
标 `*' 的为个人感觉比较重要的问题。
1. gi 本身是 Vim 的“快速回到上次编辑点”按键,直接将这个映射为中文模式是否
有点“强*民意”的嫌疑?
*2. 某个上次版本中,Ctrl-^ 用来切换中英文(全半角)标点,似乎新版中没了这
个功能?
*3. gi 进入的“无菜单中文模式”,以及 Ctrl-_ 进入的中文输入模式中,都可以通
过 Ctrl-^ 来切换输入法,那么 Ctrl-^ 进入的“点石成金”模式中,如何切换输入法?
4. 由于 plugin 目录下都是直接从 svn 仓库 check 到的,于是有
vimim.cjk.txt 跟 vimim.txt 俩词库(当然还有那个庞大无比,个人感觉不该出现在
svn 仓库中的二进制数据库文件),从点石成金模式的表现上看,比如 you 会变成
`你' 而不是 `又',繁简能够部分切换来看,这两个词库是在使用中的。照着 vimim
最新页面有关词库的说法,建立 vimim.pinyin.cp936.txt(嗯嗯,又是万恶的
GBK)并添加词条,从 vimim 彩蛋中能够看到词库被启用,然而实际输入中,里面的词
条无法出现,求解释。
5. 当年曾经需要 touch 一个 vimim.sogou.txt 之类的文件,刚更新之后,由于有
这么个文件反而什么也出不来,似乎现在不需要了?
*6. 在有 vimim.pinyin.*.txt 时,似乎点石成金之类的会默认启用 pinyin 那个标
签,没有时好像默认启用的是谷歌云?这个似乎不是按照输入法切换顺序的设置来选取
默认值的?
7. 在 TeX 文件中,由于启用 Vim-LaTeX 时,原来版本的 VimIM 一旦激
活,Vim-LaTeX 中的 {} 等等映射均不起作用(这也是我一直没有在 TeX 中用 VimIM
的重要原因),新版中这些键似乎已经恢复了,不过,在 gi 模式中,很多 ` 引导的
快捷按键(`6 `8 等等)都无法使用(尽管退出 gi 之后会恢复),这似乎不太好吧……
*8. 纵观 VimIM 目前版本的各个模式,算来似乎应该有四种(gi 无菜单模
式;Ctrl-^ 点石成金模式;Ctrl-_ 中文输入模式。最后一种又分静态跟动态两种)。
分别试了下里面的空格和回车,后面两种的空格跟回车没有什么异常,是什么就是什
么,gi 无菜单模式下也还好,每次先回车一下再空格或回车,虽然难过也还是可以输
入的,可是可是,Ctrl-^ 下面的空格要如何输入啊亲!!
9. 还是 Vim-LaTeX,依然是有各种各样的诡异问题,而且很多重现方式也不清
楚,是否跟 VimIM 相关也不是很清楚,具体内容因为 Vim-LaTeX 如此之庞大,在以后
的使用中再慢慢发现吧。其他是否还有问题,前面写了这么多,有点忘了……囧rz 想起
来再发吧。

vi...@googlecode.com

unread,
Nov 14, 2011, 9:07:44 AM11/14/11
to vi...@googlegroups.com

Comment #1 on issue 211 by suxp...@gmail.com: “点石成金”模式下的标点输入表现
不一致
http://code.google.com/p/vimim/issues/detail?id=211

嗯嗯,刚想起来这个事,关于 Ctrl-l,Vim 本身的那个定义是有用的,然而 VimIM 给
重新定义了,于是,Vim easy 就木有机会 :w 了……

vi...@googlecode.com

unread,
Nov 26, 2011, 12:32:44 PM11/26/11
to vi...@googlegroups.com

Comment #2 on issue 211 by maxiangjiang: “点石成金”模式下的标点输入表现不一

http://code.google.com/p/vimim/issues/detail?id=211

怎么漏点如此重要的issue? 找时间慢慢研究。
关于CTRL-L, 应该没有被绑架(重新定义)呀。我们现在用的是magic lmap.
至于Vim easy, 还真的有人用?


vi...@googlecode.com

unread,
Nov 26, 2011, 12:36:44 PM11/26/11
to vi...@googlegroups.com

Comment #3 on issue 211 by maxiangjiang: “点石成金”模式下的标点输入表现不一

http://code.google.com/p/vimim/issues/detail?id=211

>> 1. gi 本身是 Vim 的“快速回到上次编辑点”按键,直接将这个映射
>> 为中文模式是否 有点“强*民意”的嫌疑?

感觉把VimIM当做中宣部啦。虽说是缺省,可以关闭呀。

:let g:vimim_map='no-gi' " 关闭 gi 无菜单窗


vi...@googlecode.com

unread,
Nov 26, 2011, 12:43:46 PM11/26/11
to vi...@googlegroups.com

Comment #4 on issue 211 by maxiangjiang: “点石成金”模式下的标点输入表现不一

http://code.google.com/p/vimim/issues/detail?id=211

>> *2. 某个上次版本中,Ctrl-^ 用来切换中英文(全半角)标点,似乎新
>> 版中没了这个功能?

问了几遍,没有回答,我只得自作主张。

| 内部热键 |  <C-L> | Vim插入模式 | 开关窗口 || 切换标点 |

CTRL-L 不会与用户定义的imap CTRL-L 相克。

Ctrl-L 用来切换中英文(全半角)标点
Ctrl-^ 用来切换输入法...

以上定义是有红头文件的(Vim Help).
以前政治水平有限,政治觉悟不高,犯了瞎定义错误。
现在亡羊补牢,为时未晚。


Message has been deleted

vi...@googlecode.com

unread,
Nov 29, 2011, 6:14:21 AM11/29/11
to vi...@googlegroups.com

Comment #5 on issue 211 by suxp...@gmail.com: “点石成金”模式下的标点输入表现
不一致
http://code.google.com/p/vimim/issues/detail?id=211

或许是我写的太多?里面的好多疑问似乎都没有解答的说……

vi...@googlecode.com

unread,
Nov 29, 2011, 6:23:25 AM11/29/11
to vi...@googlegroups.com

Comment #6 on issue 211 by suxp...@gmail.com: “点石成金”模式下的标点输入表现
不一致
http://code.google.com/p/vimim/issues/detail?id=211

BTW Ctrl-l 那个,当时测试不够全面,具体表现是这样的:在出现某种中文输入模式
之后,Ctrl-l 只在中文输入模式中来回切换,而不管 normalmode 什么事。因此这时
候 vim-easy 就出不来末行模式,所以我以为就没机会 :w 了。后来发现,只要退出中
文输入模式,在正常 vim 插入模式中,vim-easy 的 Ctrl-l 是可以找回末行的,这样
看来,这个问题不大,可以忽略了。(其实这种处理也是比较合适的,相当于多了一道
门 :P)

但是 4 楼提到的 Ctrl-L 切换全半角标点……是这样的吗?为什么我看到的依然是切换
中文输入模式?3 楼提到可以关闭 gi 模式,关闭之后想进入无菜单模式就只能通过
Ctrl-l 循环进去了对么?这样倒也可以。

期待上述所有问题的解答~~

vi...@googlecode.com

unread,
Nov 29, 2011, 7:37:08 AM11/29/11
to vi...@googlegroups.com

Comment #7 on issue 211 by maxiangjiang: “点石成金”模式下的标点输入表现不一

http://code.google.com/p/vimim/issues/detail?id=211

不是说过吗,天朝温柔富贵,抽不出时间搞学问。

>> 或许是我写的太多?

事实是,写的不是太多,而是太少。
要找时间慢慢研究,否则,不国情,不和谐。


>> 但是 4 楼提到的 Ctrl-L 切换全半角标点……

CTRL-L 被overload了:

CTRL-L :(点石成金)开关菜单窗口
CTRL-L :(中文模式)切换中英文标点

感觉用vimim.cjk.txt的人不多,所以我开了个后门:后门当然先给自己开。
如果插有vimim.cjk.txt, 有些不同的cool功能。
我自己插有vimim.cjk.txt, 所以我可以CTRL-L去任何一个模式:
(1) gi
(2) 点石成金
(3) 中文静态
(4) 中文动态
如果都想走后门,我们就把后门当正门,如何?




vi...@googlecode.com

unread,
Jul 14, 2012, 8:50:02 AM7/14/12
to vi...@googlegroups.com

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

vi...@googlecode.com

unread,
Jul 18, 2012, 12:40:50 AM7/18/12
to vi...@googlegroups.com

Comment #9 on issue 211 by maxiangjiang: “点石成金”模式下的标点输入表现不一

http://code.google.com/p/vimim/issues/detail?id=211

When inside Chinese mode, my tip is 打英文:建议在vimrc中设置 :set
pastetoggle=<C-H> 
That is the best use of Vim insert mode.

Let me try to use your VimIM handlebook as "official" one. (need to format
to rst)
http://vimim.googlecode.com/svn/vimim/vimim.html

vi...@googlecode.com

unread,
Aug 11, 2012, 4:10:03 AM8/11/12
to vi...@googlegroups.com

Comment #10 on issue 211 by suxp...@gmail.com: “点石成金”模式下的标点输入表
现不一致
http://code.google.com/p/vimim/issues/detail?id=211

由于中文模式下没有那么多帅气的功能,而且目前 VimIM 依然有些(上面提到或没提
到的)小问题存在,——于是我一激动进到 VimIM 里面改了几个映射:
1. gi 键还算常用,前面说的 gI 也不是没用的而且按着不算方便,于是找了个似乎暂
时没用的 gn 来进入无菜单模式(goto non-window-mode XD),照猫画虎:
" nnoremap <silent> gn a<C-R>=g:vimim_gi()<CR>
2. 仍然为了用着方便,又画了一个 gc 从普通模式直接进入点石成金(goto
Chinese-one-key):
" nnoremap <silent> gc a<C-R>=g:vimim_onekey()<CR>
3. 以及,普通模式下那个 <C-_> 似乎有 bug,改成了(或者把 i 改成 a):
" nnoremap <silent> <C-_> :call g:vimim_chinese()<CR>
4. 又及,选择模式下也把 gi 释放出来(虽然似乎没必要,选择模式下 gi 表现不是
太好玩),用 gc:
" xmap <silent> gc <C-^>

于是再也不怕 Esc 啦~~

BTW, 无窗口模式在 Linux 终端中的表现不知道是因为版本问题还是什么,无法修改终
端模拟器标题,另是不是 fcitx 注册快捷键 Shift-space 的原因,前面提到的用来插
入空格的 alternative 方式,用 Shift-Space 失效(Fcitx 已经关闭的情况下)。环
境 Kubuntu 12.04 LTS (最后一个官方支持版本的 kubuntu)


vi...@googlecode.com

unread,
Aug 13, 2012, 9:45:59 AM8/13/12
to vi...@googlegroups.com

Comment #11 on issue 211 by suxp...@gmail.com: “点石成金”模式下的标点输入表
现不一致
http://code.google.com/p/vimim/issues/detail?id=211

试用了下 Vim 的调试功能,试着修改了 VimIM 的部分代码,——似乎有解决掉几个
bug 哎~~ :D

这个 patch 应该能(至少)部分的解决空格和回车的问题,至少我用上去感觉表现还
算自然,但是否引入了其他 bug 还不得而知,需要更多的测试和发现。另外上面提到
的键映射也在里面了。

另关于无菜单模式下的标点问题,似乎标点都被 lmap 过了?所以这个是其中某些标点
不需要空格就可以直接上屏的原因?那是不是也同时是 C-L 循环回到无菜单模式之
后,逗号句号直接上屏的原因?

Attachments:
space-enter.patch 3.3 KB

vi...@googlecode.com

unread,
Aug 13, 2012, 11:48:23 PM8/13/12
to vi...@googlegroups.com

Comment #12 on issue 211 by suxp...@gmail.com: “点石成金”模式下的标点输入表
现不一致
http://code.google.com/p/vimim/issues/detail?id=211

上面的 patch 尽管解决了部分 space-enter 的问题,但仍有问题没有解决。在试图解
决这个问题的时候(英文标点后的 enter 用于确认不进行转换而不是直接回车)发现
在这个代码逻辑下似乎很困难很困难,或者也是因为我没有能理解 VimIM 的逻辑结
构,于是试图重写部分代码,结果遭遇神奇的问题,新的 g:vimim_enter 函数返回值
跟原来的相比是合适的,但无法键入换行,尽管函数返回的是 "\<CR>"

努力理解中~~

vi...@googlecode.com

unread,
Aug 14, 2012, 9:50:38 AM8/14/12
to vi...@googlegroups.com

Comment #13 on issue 211 by suxp...@gmail.com: “点石成金”模式下的标点输入表
现不一致
http://code.google.com/p/vimim/issues/detail?id=211

终于还是没弄懂 VimIM 目前的逻辑结构……

为了解决那个问题,按照我的逻辑准备重写部分代码,结果改过去之后发现很多东西都
没了。毕竟我还处于乱改的状态。

我所想到的逻辑结构为(不考虑动态模式,只考虑空格转换的方式,或者就是 onekey
的那种?)
对于 space
1. 如果出现菜单,空格使第一候选上屏;
2. 其他情况,如果左边是“石头”,转换之,并显示菜单或者改标题;
3. 再其他,如果是无菜单模式并且在选词阶段,下一候选;
4. 再再其他,上空格。
对于 enter
1. 如果出现菜单,回车取消转换并确认英文输入;
2. 如果左边是“石头”,确认直接输入不转换;
3. 其他,上回车。

为了实现“确认英文输入”和“左边是石头”,某个函数应该记录当前确认的位置跟光标左
侧字符用来检测状态(花了半天时间终于理顺了这个函数)。按照这种逻辑结构,重写
了 space 跟 enter 的函数,并添加了可取代 vimim_left 的函数。尽管这部分的逻辑
非常清晰,不过对其他部分不甚了解的情况下,这个改动使得 vimim 的其他功能发生
变化,——但 space 跟 enter 的表现已经基本符合我的预期了(呃,无菜单模式下空格
选下一候选的那个没了……不知道相关功能的逻辑结构,但 space 对应函数的框架这个
样子应该是没有问题)。

下面是部分代码。因为改动稍乱,不上 patch 了。前面的 patch 没能解决所有问题而
且结构不清晰,可以扔掉。
========== 有点混乱的分割线 ==========
function! g:vimim_space()
let key = " "
if pumvisible()
let key = '\<C-R>=g:vimim()\<CR>'
if s:mode.onekey && s:hit_and_run
let key = s:vimim_stop()
endif
let cursor = s:mode.static ? '\<C-P>\<C-N>' : ''
let key = cursor . '\<C-Y>' . key
elseif s:vimim_stone()
let key = s:vimim_onekey_action() " TODO: I don't know what it
should be
elseif s:mode.windowless && s:gi_dynamic " TODO: this condition is NOT
correct
let key = '' " gi m space (the 1st choice)
let s:gi_dynamic_on = 1 " gi m ; (the 2nd choice)
call s:vimim_set_title(g:vimim) " gi m ' (the 3rd choice)
else
let key = " "
endif
call s:vimim_reset_after_insert()
sil!exe 'sil!return "' . key . '"'
endfunction

function! g:vimim_enter()
let s:omni = 0
let key = ""
let left_status = s:vimim_stone()
if pumvisible()
let key = "\<C-E>"
let s:stone_start_col = col('.') " remember the position
elseif left_status " is stone
let s:stone_start_col = col('.')
let s:seamless_positions = getpos(".") " compatible to the old
code, remove if restructure finished.
else
let key = "\<CR>"
let s:stone_start_col = 0 " reset position. <BS> et
al. should do this too.
endif
sil!call s:vimim_set_title(g:vimim)
sil!exe 'sil!return "' . key . '"'
endfunction

"""" 下面是重新实现的检查石头的函数 """"
function! s:vimim_stone()
let has_stone = 0
let not_eol = 0
let thisline = getline('.')
let cursor_pos = col('.') - 1
if empty(thisline) || cursor_pos == 0
let left_char = "" " Nothing found
else
if strlen(thisline) > cursor_pos
let not_eol = 1 " there are something else after the cursor
endif
let fake_stones = thisline[s:stone_start_col : cursor_pos-not_eol]
let length = strchars(fake_stones)
let left_char = fake_stones[byteidx(fake_stones, length-1):
byteidx(fake_stones, length)]
endif
if empty(left_char)
let has_stone = 0
elseif left_char =~# s:valid_keyboard
let has_stone = 1 " big stone
elseif has_key(s:all_evils, left_char)
let has_stone = 2 " small stone
endif
return has_stone
endfunction


vi...@googlecode.com

unread,
Aug 14, 2012, 9:59:43 AM8/14/12
to vi...@googlegroups.com

Comment #14 on issue 211 by suxp...@gmail.com: “点石成金”模式下的标点输入表
现不一致
http://code.google.com/p/vimim/issues/detail?id=211

呃……糊涂了。
enter 也需要检查是否是无窗口模式并且转换没有确认所以,也应该有四个分支,跟
space 的分支一致。现在的主要问题就是分支中如何处理。能力有限,求指导~~

vi...@googlecode.com

unread,
Aug 15, 2012, 7:38:43 AM8/15/12
to vi...@googlegroups.com

Comment #15 on issue 211 by suxp...@gmail.com: “点石成金”模式下的标点输入表
现不一致
http://code.google.com/p/vimim/issues/detail?id=211

下述 patch 应该能相对彻底的解决 space 和 enter 的问题。对于 backspace 跟
esc 的有可能还有问题(当然 enter 之类的也不是最终版本,比如可以添加“上次确认
地点,上上次确认”等,对了,用栈)。

关于本 issue 起始的标点符号等问题,没在这个 patch 的考虑范围。应用这个
patch 之后,回车和空格的表现已经相当符合我的预想,至少我所测试的小范围内是
的。

但同时,除了前面提到的“一切正常”拼音转换的 bug,又发现了“一切都在预料之中”、
“一切均在预料之中”的 bug。

代码的逻辑结构我自然还没有弄懂,只看了关于 enter space 的一小部分。为了解决
我的问题,添加的那个 vimim_stone 函数又改写成了更具有牛力的函数,——返回“石头
”的大小。我感觉如果应用这种逻辑,其中的很多代码可以进行缩减,达到 vimim 行数
下降但功能不减的效果,而且清晰的逻辑结构更利于调试,也不容易出现 bug。

Attachments:
space-enter.patch 6.5 KB

vi...@googlecode.com

unread,
Jun 22, 2013, 10:03:27 AM6/22/13
to vi...@googlegroups.com

Comment #16 on issue 211 by suxp...@gmail.com: “点石成金”模式下的标点输入表
现不一致
http://code.google.com/p/vimim/issues/detail?id=211

前两天给 issue 234 改 Google 云接口的时候,顺便想着把返回的匹配长度用
上,——我原来一直以为 yiqiezhengchang 的那个 bug 是因为自己补充拼音的时候弄错
了。结果改了之后发现仍然存在,于是花掉若干时间去寻找问题的根源,费劲千辛万苦
之后终于被我找到了,——yiqiezhengchang 的问题是函数 s:vimim_popupmenu_list 中
对每个 chinese 做了如下操作:
let chinese .= empty(tail) || tail == "'" ? '' : tail
那这个 tail 是什么意思呢?回头找,发现是通过 s:keyboard split 出来的东西……更
多具体的细节还没有跟进,为了更快的确认问题的根源,请问,这个 tail 或者
s:keyboard 的作用是干嘛?在什么地方对其进行了赋值或者更改?当转换
``yiqiezhengchang'' 的时候,s:keyboard 的值为(如此神奇的)"yi8183
zhengchang",于是在每一项后面都添加了 zhengchang 从而就不正常了……

BTW,为什么要在每个项最后添加一个 tail?

--
You received this message because this project is configured to send all
issue notifications to this address.
You may adjust your notification preferences at:
https://code.google.com/hosting/settings
Reply all
Reply to author
Forward
0 new messages