dingsir的个人博客分享 http://blog.sciencenet.cn/u/dingsir

博文

柚子输入法改进记录 更新

已有 469 次阅读 2024-3-9 19:20 |个人分类:软件杂谈|系统分类:科研笔记

---update on 2024.3.9

   柚子输入法主要的文件有四个,一个AutohotkeyU32.ahk, 这个是输入法实现的编码,也不长;  第2个是wubi86.ahk,这是一个五笔码表,采用的是编码=词组 词组这样的格式,本质上是一个txt文本,但采用了ahk这个后缀而已. 比较简单. 第3个是一个色块文件cn1.png,用于标识输入法的状态. 第4个是启动ahk的程序 AutohotkeyU32.exe. 其中最重要的是第1,2这两个文件. 第一个实现编码转换为词组的算法, 第二个提供了词组的编码.

1.替换原来的Wubi86,删除部分不用的词语。

   这个主要是由于原来的词表太于陈旧,词汇量跟不上现在的需要. 我一直用黄狗输入法,因此利用黄狗的导出词库的功能, 用Excel作了一些处理之后,转换成了目前柚子输入法所使用的码表格式,就可以使用了.

   这里面我增加了一些纯粹为自己方面而定义的词组,如

   希腊字母: alfa, beta,delt, gama, omeg,pai, 等

   带圈数字 cone, ctwo, cthr, cfor,

   上下标字符 yixb(1下标) erxb(2下标), sanx(3下标), yisb, ersb, sans(1,2,3的上标)等

   见附件 wubi86.ahk,注意这个码表是按编码的字母顺序编排的

2.清理AutohotkeyU32.ahk,调整部分快捷键,如反斜框对应顿号、(使用Unicode码表示,不能用中文顿号表示).  2023-08-22

   使用中发现有些符号在输入法启用时不能输入,查了下发现中文符号如顿号,在输入法不能直接用Send 、来实现(会乱码), 查询了一下Send的用法,可以使用\::SendInput {U+3001} 解决(行首的反斜杠, 对应键盘上敲击反斜杠). 这也为简单输入特定的Unicode提供了一种好的方法,只需要替换上面的3001为待输入字符的Unicode编码即可(不过非常新的Unicode字符, 可能字体不一定能够支持).

3.部分词语的顺序调整或剔除,增加一些本人常用的词语

   如果是新的字符或中文词组,在码表中修改即可.如果有特殊要求,比如要实现类似命令直通车的功能, 不能简单的在Wubi86.ahk这个文件中修改,而要在AutohotkeyU32.ahk这个脚本中修改,下面介绍. 另外,还有一些化学物质的缩写,单位的缩写,也可以在码表中修改.

只需要注意,有些符号不能出现在常量定义的右边时,这类符合就不能放在wubi86.ahk这个码表中,但可以放在AutohotkeyU32.ahk这个脚本中处理.

4.增加语句适配不同分辨率下色块的定位位置

   在AutohotkeyU32.ahk中增加了几句编码,如下,最后一行是调整了色块的位置. 为什么有三个屏幕宽度是因为我平常用了三种不同的显示分辨率,一个是笔记本电脑(small),二个是不同的桌面显示屏.

分辨率设置.png

   顺便说下,我把cn1.png也做了一点修改,以适应不同背景下的显示.

5.调整双引号的转换,将原有的单引号调成双引号.

+"::SendInput {“}{”}{left}

   就是这一句的作用,{left}表示输入了前两个符号之后,再按一下左箭头.这样光标就回到了两个双引号中间.这一点比黄狗输入法(或多多输入法生成器)中规定的自定义方式要简单和直观一些,没有印象的可以查看我之前的博文介绍(用<37>代表向左的箭头)

6.增加自定义特殊词汇的能力,比如date输出当前日期.time输出当前时间)

   这一处涉及的也是AutohotkeyU32.ahk, 这一部分的代码主要是修改了srf_tooltip标签处的代码.

自定义编码.png

虽然Ahk v1变量定义比较自由,但还是有些字串不能作为变量内容,这种情况可以通过代码中硬编码来规定,比如某些罕用的Unicode,或者含有特殊字符如逗号/引号/特殊符号等的字串.

   先用FormatTime格式化字串并输出给变量DateStr, 再将DateStr变量的内容发送到当前容器. Time编码也是类似的,只不过格式化的字串格式不一样.

   以上内容为了简洁起见, 使用了Switch关键词,但这个语法在1.1.34版之后才添加,因此需要autohotkeyU32.exe要升级到最新版本才行(最后的公开版是1.1.37)

7.将反应较慢的Send更新为SendInput,避免偶尔出现的"一次编码两次输出词汇"的Bug.

   查帮助发现SendInput说是比Send更稳定一些,因此原脚本中的Send都改成了SendInput, 确实原来偶尔出现的一次编码会出现两次词组的现象消失了.

8.经过研究,如果用autohotkey v2版来改写这个输入法不可行.

   这个主要是2.0版的autohotkey做了一些调整了,取消了原来 abcd=XXYY这种格式的指令,而柚子输入法的编码→词组的转换正是基于这种命令格式的,即你输入的编码在柚子输入法中即是一个个常量,它把这个名称的常量转换成常量的内容发送到当前窗口,即完成输入. 现在取消了这种指令, #Include的文件也要按照ahk的语法来写,就没有那么优雅了.同时还出现了很多五笔编码与ahk的保留词冲突的问题, 要避开非常麻烦.因此以2.0为平台来实现就很困难了.

9.发现这个输入法可以指定z键为编码字符,因此可以以z开头定义一些特殊的词汇.

如zvec=乙烯基碳酸乙烯酯, 或者是一些数据的定义,如输入z+姓名缩写,输出这个人的邮箱等信息.

因为这个程序没有实现编码自动造词,因此词组应该用什么编码,完全可以自己设定,z也可以作为编码.

9. 在github下载源码后,用vs2022重新编译了一个x64 release,也可以用.

可执行文件为AutohotkeyU64.exe, 相应的脚本 AutohotkeyU32.ahk要将32修改成64. 其它地方不用变.

原来想看看源码解决打得快时出现的故障,但看了源码之后搞不定,64位版本上也还是有.

打得太快时出现的问题.png

10. 将部分经常用到的信息作为词汇输入到码表中, 编码以Z+拼音首字母实现. 并将部分不能分享的词组单独拧到一个码表中使用.

在AutohotkeyU32.ahk中加一行#include命令引用之即可以使用.注意码表要用UTF-8带签名的方式编码(与wubi86.ahk相同)

最后附一篇他人整理的柚子输入法编写的教程.

20h.md

以及 我修改之后的版本(去除了priwords.ahk这个私人词库).

youziIME(2024-3-9).7z



https://wap.sciencenet.cn/blog-1213210-1424678.html

上一篇:给8F32机芯的精工表 SBQK085 换电池
收藏 IP: 112.85.136.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-27 16:57

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部