用Lua扩展谷歌拼音输入法
谷歌拼音输入法最后一次更新是2013年,最近2年毫无动静,这个产品应该已经停了,不过这并不影响对它的使用,我一直喜欢它的简洁和稳定。
说不上来什么原因,忽然想起了摆弄摆弄谷歌拼音输入法的扩展特性(我经常会有这种不明原因地忽然想折腾点什么的状况)。于是搜索到官方文档——“谷歌拼音输入法-扩展API开发指南”,粗略阅读了一番。考虑到因为某些不可抗拒的力量,这份文档不会很稳定的存在,所以自己整理一下,权当笔记。
扩展其实很简单,利用API,往谷歌拼音里注册自己写的函数,然后就可以在打字的时候调用了。扩展是基于 Lua 这门脚本语言的(话说 Lua 确实是全球各种扩展的常客),扩展包就是一份 Lua 脚本文件,然后可以通过输入法的属性窗口进行添加扩展操作。总共分为三种途径:命令扩展、整合扩展、转换器扩展。不管是哪一种,其输出都是以候选项的形式呈现。
所谓命令扩展:在谷歌拼音中,有一种 i 扩展模式,即首字母输入 i 后,可以得到一些内置的特别功能输出,比如输入 rq 可以输出当前日期,输入 sj 可以输出当前时间,还可以掷个骰子,画个 Google 主页等等(注:这种字符画必须在“等宽字体”下才看得出效果)。这种特性就叫命令扩展,输入字母 i 相当于切换到了谷歌拼音的命令模式,我们可以添加自己的命令,实现自己的需求。有一点需要注意的是——命令扩展的触发关键字,只支持2个字符,意思是说,你只能规定一个包含2个字符的字符串作为触发事件,当你进入谷歌拼音 i 模式时,输入你所设定的2个字符,则可自动调用你写的函数。
所谓整合扩展:就是以用户输入的字符或者是谷歌拼音显示出来的候选字词来进行匹配,触发被注册的函数。比如说我们写了一个函数,返回字符串“hello, world”,将这个函数注册成一个整合扩展,并设置触发的关键字为“hello”。那么,当我们用谷歌拼音输入“hello”这5个字母时,输入法的候选项首页最后一项将是我们的函数返回值“hello, world”。这种方式和命令扩展的区别是:不需要输入 i 切换模式,直接按照正常的输入方式打字即可调用自定义函数。
所谓转换器扩展:就是针对候选项做变换,比如把出现的候选项字词,每一项前后加上“*”号用来装饰一种效果等。其工作原理就是把当前页的每一项候选项作为参数,传递给我们写的函数,然后经过处理再返回并替代原候选。
这三种扩展途径的具体使用说明附在文末。
接下来需要说一下返回值。
之前说了,不管哪种方法,最终都是以候选项的形式返回输出。但这个候选项返回可以不止一个,比如函数返回的是一个列表,那么出现在输入法界面上的就会是多个候选项,等于我们自己给自己制造候选。还有一种情况,我们通常得到的候选项都是一个字、一个词、一句话,但其实我们还可以得到一段多行文本,只需要在自定义函数中返回一段带换行符的字符串即可。
了解了谷歌拼音输入法的扩展特性之后,我随即写了一个扩展包,里头包含了一些我临时想到的功能。
由多行文本输出(在谷歌拼音里叫<字符画>),我想到了这个可以用来做自己的代码片断(snippet)。把自己喜欢的,常用的代码片断做到自己使用的输入法里,这样,不管在哪,不管切换到了什么文本编辑器或者IDE里,只要输入法是谷歌拼音,用上自己的扩展包,你就有了统一的代码片断功能了。
比如,我写了一个函数,返回一段HTML标记,如下所示:
--插入一段HTML基本标记 function html_snippet() output = [[ <!DOCTYPE html> <html> <head> <title>Untitled</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <link rel="stylesheet" type="text/css" href=""> <script type="text/javascript" src=""></script> </head> <body> </body> </html>]] return output end
然后将这个函数注册到命令模式中
ime.register_command('hl', 'html_snippet', 'HTML snippet')
这样,当在谷歌拼音输入法中,输入 i 进入命令模式中之后,可以在候选项里看到一个名为“HTML snippet”的候选项,如图所示:
键入预设的关联字符“hl”,然后点击空格,屏幕上会立刻输出一段连格式都排好了的HTML标记。
同时,我将这个函数继续用整合扩展的方式进行注册,代码如下:
ime.register_trigger('html_snippet', 'HTML snippet', {'html'}, '')
之后,除了通过 i 命令模式实现快速插入这段HTML标记的效果外,直接在输入法中键入“html”字符,即可在首页最后一个选项得到所需要的输出。
键入对应的序号9,记事本中也会打出一段和上图一样的HTML标记文本。
有了这样的扩展,你就算是在记事本里也可以玩插入代码片断功能了。
因为谷歌拼音是基于Lua这门语言来扩展,自然也包含了一些可以调用的Lua内置函数、模块等,比如数学函数。
以下这段代码就是往谷歌拼音输入法里添加数学计算功能的代码:
-- 求平方 function square(x) return y * y end -- 求平方根 function sqrt(x) return math.sqrt(y) end -- 注册 求平方 ime.register_command('sq', 'square', '求平方', 'none', '输入一个数,得到其平方') -- 注册 求平方根 ime.register_command('sr', 'sqrt', '求平方根', 'none', '输入一个正数,得到其平方根')
需要注意的是,这种带数字参数的函数,其参数是通过键入数字字符传递的,又因为输入法默认会把数字字符作为选择候选项的一种操作,所以,在注册这种扩展时,需要告诉输入法关闭数字选择功能,也就是上面注册代码中,函数的第4个参数设置为'none'。
求完平方和根,顺手写了一个求阶乘的扩展:
-- 求阶乘 function factorial(argument) then ) else return x end end -- 注册 求阶乘 ime.register_command('fa', 'factorial', '求阶乘', 'none', '输入一个正整数,得到阶乘结果')
阶乘计算示例:
还可以把输入法扩展为网站书签(虽然这么做的意义……)
代码如下:
-- 网站书签 _BOOKMARK_TABLE = [[ b cn.bing.com ba www.baidu.com c www.cnblogs.com/ g www.google.com l localhost/,localhost:8080/ m mail.sina.com.cn,mail.163.com,mail.sohu.com,mail.qq.com p www.python.org t www.taobao.com,www.tmall.co tw twitter.com w wikipedia.org y search.yahoo.com ]] _BOOKMARK = ime.parse_mapping(_BOOKMARK_TABLE, "\n", " ", ",") function bookmark(input) return _BOOKMARK[input] end -- 注册 网站书签 ime.register_command('bm', 'bookmark', '网站书签')
这样,当输入“i”进入命令模式,然后键入“bm”,调用网站书签函数之后,我们就可以通过键入自定义的快捷键,得到网站地址,如图所示:
以上就是利用 Lua 对谷歌拼音输入法进行扩展的一个简介。其实谷歌拼音相当于集成了一个 Lua 的子集运行环境,对它的扩展全凭在该子集下对 Lua 的把玩了。
附:
谷歌拼音输入法注册扩展方法的详细语法介绍(以下内容直接摘自官网文档)
命令扩展的语法:
ime.register_command(command_name, lua_function_name, description, leading, help)
ime是提供给Lua脚本使用的,与输入法内核交互的专用模块。register_command是向谷歌拼音输入法注册新的i扩展模式命令扩展所使用的函数。函数的各参数含义如下:
command_name
2字符长的字符串,必须由两个英文字母(a-z)组成。定义了要注册的命令名字。如果新注册的命令名称和此前已经注册的某个命令重名(判断重名时不区分大小写),则register_command函数调用失败,新命令扩展无法注册到输入法中。
lua_function_name
字符串。给出此命令在i扩展模式中运行时对应的Lua入口函数。这必须是一个已经存在的,接收一个或零个参数的Lua函数。
description
字符串。命令的简短描述。此描述会显示在i扩展模式的命令选择界面中,向用户简要说明某命令的功能。不要使用太长的简短描述,一般不要超过10个字符。
leading [可省略]
字符串。用户选择此命令的候选项目时,可以使用的快捷键,可以是以下三个特定字符串之一:
"digit": 默认值。表示用1, 2, 3, ...这样的数字作为候选项选择键。
"alpha": 表示用a, b, c, ...这样的英文字母序列作为候选项选择键。
"none": 表示不使用候选项选择键。
注:默认情况下,输入法使用1, 2, 3, ...数字键作为候选项选择键。但是,当i扩展模式的某个命令希望接收数字1, 2, 3, ...作为自己的参数时,为避免冲突,就不能使用"digit"方式的候选项选择键了。同理,当命令希望接收包含英文字母的参数时,就不能使用"alpha"作为候选项选择键。
help [可省略]
字符串。比description略长的帮助信息,但一般不要超过50个字。当用户键入了"i"以及特定的命令名后,输入法候选窗口的右上方会显示此文字信息,用于提示用户如何输入后续参数。
整合扩展的语法:
ime.register_trigger(lua_function_name, description, input_trigger_strings, candidate_trigger_strings)
ime是提供给Lua脚本使用的,与输入法内核交互的专用模块。register_trigger是向谷歌拼音输入法注册新的整合扩展所使用的函数。函数的各参数含义如下:
lua_function_name
字符串。给出此扩展运行时对应的Lua入口函数。这必须是一个已经存在的,接收一个参数的Lua函数。
description
字符串。扩展功能的简短描述,向用户简要说明某扩展的功能。不要使用太长的简短描述,一般不要超过10个字符。
input_trigger_strings
一个字符串组成的Lua列表,包含零个或多个特定的由英文字母或通配符*组成的字符串。这里给出的所有字符串在输入法运行时将分别与用户的输入内容匹配,一旦用户的输入和给出的某个特定字符串相同(或使用通配符匹配成功),注册的扩展函数就会被调用,扩展函数返回的候选项结果将会被插入到输入法的候选项列表中。
candidate_trigger_strings
一个字符串组成的Lua列表,包含零个或多个特定的由英文、中文、数字等可显示字符或通配符*组成的字符串。这里给出的所有字符串在输入法运行时将分别与输入法得到的候选项进行匹配,一旦候选项列表第一页中某个候选项和给出的某个特定字符串相同(或使用通配符匹配成功),注册的扩展函数就会被调用,扩展函数返回的候选项结果将会被插入到输入法的候选项列表中。
关于通配符匹配:input_trigger_strings和candidate_trigger_strings中的字符串可以在开头或结尾包含通配符*,表示前缀匹配或后缀匹配。例如:
abc*
表示匹配前缀为abc的任意字符串。例如,字符串abc,abcd,abcde都可以与之成功匹配。
*abc
表示匹配后缀为abc的任意字符串。例如,字符串abc,dabc,deabc都可以与之成功匹配。
使用ime.register_trigger注册整合扩展时,请注意以下几点:
参数input_trigger_strings和candidate_trigger_strings不能同时为空表。
输入法在激活整合扩展函数时,将优先匹配input_trigger_strings,然后再匹配candidate_trigger_strings。匹配candidate_trigger_strings时,会按照输入法得到的候选项顺序依次尝试。对每一次输入,一旦找到了匹配,就只插入该匹配对应的扩展函数返回的候选项结果,不再继续尝试其他匹配。
虽然扩展函数可以返回一个或多个结果,但对于整合扩展来说,目前只有第一个候选项结果会被插入到输入法的候选项列表中。
目前一个整合扩展可以通过input_trigger_strings和candidate_trigger_strings注册的字符串数目是有限制的,一般不要超过200个。
目前整合扩展在匹配candidate_trigger_strings时,只会与候选项列表第一页中的候选项进行匹配。
整合扩展的入口函数一般应接收一个参数。在激活整合扩展函数时,输入法会把激活整合扩展函数的字符串(或者是用户输入的内容,或者是某个特定的候选项)作为唯一的参数传递给入口函数。这样,注册了多个匹配字符串的整合扩展函数就可以在被调用时通过参数知道究竟是哪个字符查激活了自己。当然,在不需要时,入口函数也可以简单地忽略这个参数。
转换器扩展的语法:
ime.register_converter(lua_function_name, description)
ime是提供给Lua脚本使用的,与输入法内核交互的专用模块。register_converter是向谷歌拼音输入法注册新的转换器扩展所使用的函数。函数的各参数含义如下:
lua_function_name
字符串。给出此扩展运行时对应的Lua入口函数。这必须是一个已经存在的,接收一个参数的Lua函数。
description
字符串。扩展功能的简短描述,向用户简要说明某扩展的功能。不要使用太长的简短描述,一般不要超过10个字符。对于转换器扩展,此描述信息会被输入法的用户界面显示给用户,以便选择特定的转换器扩展。
用户开启转换器时,输入法会依次将每个候选项作为参数调用转换器对应的Lua入口函数。也就是说,对于每个候选项,Lua入口函数都被调用一次。
转换器扩展对应的Lua入口函数应当返回且只返回一个结果,即返回对原候选项进行变换后的新候选项。如果不希望变换某个候选项,可以将输入参数的值直接返回。如果没有返回任何结果,或返回的结果数目多于一个,则输入法认为该扩展函数没有对候选项做任何变换。
安装了转换器扩展后,用户可以从输入法的用户界面启动或关闭特定的转换器。
官方文档链接
http://www.google.com/intl/zh-CN/ime/pinyin/api.html
用Lua扩展谷歌拼音输入法的更多相关文章
- 谷歌拼音输入法扩展API开发指南
为了帮助开发者在谷歌拼音输入法的基本输入功能基础上,开发和定义更丰富的扩展输入功能,谷歌拼音输入法提供了以Lua脚本编程语言为基础的输入法扩展API.利用输入法扩展API,开发者可以编写自定义的输入功 ...
- ubuntu 16.04 LTS - 谷歌拼音输入法
https://blog.csdn.net/chengyq116/article/details/78638249 1. installation1.1 汉语语言包 sudo apt-get inst ...
- ubuntu安装谷歌拼音输入法
在这篇教程中,我将告诉你如何在ubuntu系统上安装谷歌拼音输入法.谷歌拼音输入法有基于ibus框架的,也有基于fcitx框架的.我只演示fcitx框架下谷歌拼音输入法的安装,因为ibus框架的谷歌拼 ...
- linux下安装谷歌拼音输入法
linux下安装谷歌拼音输入法 输入以下命令,等待安装完成. sudo apt-get install fcitx 接着输入,完成安装谷歌中文输入法 sudo apt-get install fcit ...
- Ubuntu 18.04 LTS版本 谷歌拼音输入法安装
为何安装? 自带IBUS框架对中文支持不稳定 采用对中文支持稳定的fcitx框架 如何安装? 步骤如下: 卸载自带IBUS框架 命令:sudo remove ibus 安装fcitx框架 ...
- Ubuntu 安装谷歌拼音输入法
Ubuntu14.04内置的拼音输入法有一个bug,使得Live USB全拼无法使用. 安装Google拼音输入法步骤如下: 1. 打开Ubuntu软件中心 (Ubuntu Software Cent ...
- 在ubuntu10.10下安装Google谷歌拼音输入法
安装步骤如下:1.下载文件:sudo wget http://malu.googlecode.com/files/scim-googlepinyin.tar.gz(经测试,这个链接已经失效了,幸好有前 ...
- ubuntu 14 谷歌拼音输入法
帮人倒腾了下,顺便记录下: https://rivercitylabs.org/install-google-pinyin-on-ubuntu-14-04/ sudo apt-get install ...
- [系统软件]Ubuntu 18.04 LTS 安装 搜狗输入法,谷歌拼音
1. 讲什么 本文主要讲述在Ubuntu18.04 LTS版本中安装搜狗输入法.谷歌拼音输入法的过程. 2. 为什么讲 1. Ubuntu电脑自带Ibus输入法+拼音/五笔,但是用了一段时间之后发现经 ...
随机推荐
- Extjs Panel
刚学习Extjs @{ Layout = "~/_SiteLayout.cshtml"; Page.Title = "欢迎访问我的网站!"; } @{ stri ...
- jQuery带控制按钮向上和向下滚动文本列表
效果:http://hovertree.com/texiao/jquery/64/ 效果图如下: 代码如下: <!DOCTYPE html> <html> <head&g ...
- 人工智能 - AI
CNCC 2016 | 人工智能60年浪潮 (原文链接) Intelligence,智能是指生物一般性的精神能力,其三因素理论: 成分智力 Componential Intelligence:思维和对 ...
- CSS之深入探究Position
这些天重新整理以前的代码,想对其进行优化,却出现了很多问题,其中一个就是Position,中间自己停下优化代码的工作,特意停下来深入研究了一下Position.现在来分享一下自己的体会吧! 首先我们从 ...
- CORS(跨源资源共享)实战
声明:本文中的cors为createCORSRequest返回的对象 1. 同一跨域接口 function createCORSRequest(method, url) { var xhr = new ...
- nodejs:连接数据库SqlServer,mssql模块
现在的数据库越来越多,如mgdb,我比较常用的是mysql,但有一天做项目需要连接SqlServer,就去找了个方法.找了很多无非就mssql模块和node-sqlserver模块,但node-sql ...
- UDS(ISO14229-2006) 汉译(No.6 应用层服务)
6.1总览 应用层服务通常被当作诊断服务.应用层服务用于在基于客户端-服务器的系统(Client-Server base System)中执行一些功能,例如针对车载服务器(ECU)的检测.检查.监控和 ...
- MySQL中优化sql语句查询常用的30种方法
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使 ...
- 【算法】PHP实现冒泡排序和快速排序--防遗忘
有没有这样的感觉,排序算法虽然简单,但是没看过一次,一会就又忘了,所以有必要 自己使用实际的代码运行实现,才记忆牢固,为此Mark //需求:将数组中元素,从大到小排列$a = array(11, 2 ...
- centos svn服务器搭建
1.安装svnyum install subversion查看安装目录rpm -ql subversion 查看yum安装subversion的位置 2.创建仓库创建版本库目录mkdir -p /va ...