<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
><channel><title>Rest Valley &#187; ibus</title> <atom:link href="http://lihdd.net/tag/ibus/feed/" rel="self" type="application/rss+xml" /><link>http://lihdd.net</link> <description>The scratchpad of quark</description> <lastBuildDate>Sat, 09 Oct 2010 13:56:19 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=</generator> <item><title>关于 ibus-sogoupycc 的扩展</title><link>http://lihdd.net/ibus-sogoupycc-extensions/</link> <comments>http://lihdd.net/ibus-sogoupycc-extensions/#comments</comments> <pubDate>Thu, 18 Mar 2010 12:06:19 +0000</pubDate> <dc:creator>quark</dc:creator> <category><![CDATA[Config]]></category> <category><![CDATA[Script]]></category> <category><![CDATA[extension]]></category> <category><![CDATA[ibus]]></category> <category><![CDATA[ibus-sogoupycc]]></category> <category><![CDATA[lua]]></category><guid
isPermaLink="false">http://lihdd.net/?p=340</guid> <description><![CDATA[本来想把一些示例放在项目的 wiki 页上的，但是我还想说一些其他的闲话，而且目前扩展虽然有一些实用性了，却缺乏执行保护，可以把输入法弄得不稳定，所以这些内容就放到这里好了。如果你只想看看如何使用输入法的扩展，请向下找到 表情后从那里开始看。 似乎扩展是很流行的样子，各种浏览器，foobar2000，谷歌拼音，WPS，都可以用扩展。 其中，有的软件成功了，令人爱不释手，比如像 Firefox，foobar2000。有的软件却没有因为扩展成功，比如谷歌拼音。或者说扩展没有给人带来好感，比如 IE 浏览器。 我觉得作为一个支持扩展的软件，最重要的就是扩展要比较有用，可以做一些事情，这一点上谷歌拼音做得就不好，由于扩展而变得比较成功的软件在这方面做得都比较好。其次，扩展要容易开发，再往后，出于安全的考虑，扩展的能力要受到约束。这两点 IE 相比 Firefox 就弱了一些，不过 Firefox 的扩展写起来还是挺麻烦的，比如其中的多国语言化就非常麻烦，对于不同的地方要使用不同的方法，总共有三种。而由于 Firefox 的灵活性，出现了 Mozilla Jetpack 和 GreaseMonkey 等，都可以让扩展写起来方便一些。 在很长的一段时间内，我觉得编写软件，技术含量是最重要的， 一个更好的算法可以带来更快的速度，或者更好的结果，当然用户体验就会好。但是现在看法有些改变，因为目前，很多东西不是需要从头做起的，除非出于学习、版权目的，或者是原先的项目代码烂到不能看而没法维护，没有必要重新实现别人已经实现的东西。大部分软件应该在乎实用性，在不违反版权的情况下，尽量使用已有的东西。 从一开始，我觉得 ibus-sogoupycc 这样一个输入法的技术含量肯定不如 sunpinyin，Linux 下的输入法用 sunpinyin 就不错了，一度怀疑是否要有将 ibus-sogoupycc 写下去的必要。但是现在，我觉得是有必要的，因为在中国大部分有网络的地方，这样一个输入法用起来是更舒服的，至少对我自己来说。 出于同样的实用性的考虑，我提供了输入法扩展能力。本来我想提供一个完全兼容谷歌拼音的接口，但是后来觉得谷歌拼音的扩展接口设计得并不好，和目前输入法的无需选词流畅输入有冲突，没有遵循的必要。 开头提到的这个表情在这里： ，不难找吧。 扩展的设置应该放在用户配置文件中，目前添加一个扩展的方法是： ime.register_command&#40;key, modifiers, caption, script&#41; 这里，key 和 modifiers 都是数字类型，后两者是字符串类型。 修改用户配置文件后一般要重新启动输入法才能生效，可以右击任务栏上的 ibus 图标，选择重新启动。 Hello world 下面的代码注册了一个用 Alt + H [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://lihdd.net/wp-content/uploads/2010/03/extensions.png" alt="" title="extensions" width="100" height="125" class="alignright size-full wp-image-344" />本来想把一些示例放在项目的 wiki 页上的，但是我还想说一些其他的闲话，而且目前扩展虽然有一些实用性了，却缺乏执行保护，可以把输入法弄得不稳定，所以这些内容就放到这里好了。如果你只想看看如何使用输入法的扩展，请向下找到 <img
src='http://lihdd.net/wp-includes/images/smilies/wink.png' alt='^_.' class='wp-smiley' /> 表情后从那里开始看。</p><p>似乎扩展是很流行的样子，各种浏览器，foobar2000，谷歌拼音，WPS，都可以用扩展。</p><p>其中，有的软件成功了，令人爱不释手，比如像 Firefox，foobar2000。有的软件却没有因为扩展成功，比如谷歌拼音。或者说扩展没有给人带来好感，比如 IE 浏览器。<span
id="more-340"></span></p><p>我觉得作为一个支持扩展的软件，最重要的就是扩展要比较有用，可以做一些事情，这一点上谷歌拼音做得就不好，由于扩展而变得比较成功的软件在这方面做得都比较好。其次，扩展要容易开发，再往后，出于安全的考虑，扩展的能力要受到约束。这两点 IE 相比 Firefox 就弱了一些，不过 Firefox 的扩展写起来还是挺麻烦的，比如其中的多国语言化就非常麻烦，对于不同的地方要使用不同的方法，总共有三种。而由于 Firefox 的灵活性，出现了 <a
href="https://jetpack.mozillalabs.com/">Mozilla Jetpack</a> 和 <a
href="https://addons.mozilla.org/firefox/addon/748">GreaseMonkey</a> 等，都可以让扩展写起来方便一些。</p><p>在很长的一段时间内，我觉得编写软件，技术含量是最重要的， 一个更好的算法可以带来更快的速度，或者更好的结果，当然用户体验就会好。但是现在看法有些改变，因为目前，很多东西不是需要从头做起的，除非出于学习、版权目的，或者是原先的项目代码烂到不能看而没法维护，没有必要重新实现别人已经实现的东西。大部分软件应该在乎实用性，在不违反版权的情况下，尽量使用已有的东西。</p><p>从一开始，我觉得 ibus-sogoupycc 这样一个输入法的技术含量肯定不如 <a
href="http://code.google.com/p/sunpinyin/">sunpinyin</a>，Linux 下的输入法用 sunpinyin 就不错了，一度怀疑是否要有将 ibus-sogoupycc 写下去的必要。但是现在，我觉得是有必要的，因为在中国大部分有网络的地方，这样一个输入法用起来是更舒服的，至少对我自己来说。<br
/><div
id="attachment_347" class="wp-caption aligncenter" style="width: 266px"><img
src="http://lihdd.net/wp-content/uploads/2010/03/ibus-sogoupycc-0.2.0_demo.gif" alt="" title="ibus-sogoupycc-0.2.0_demo" width="256" height="179" class="size-full wp-image-347" /><p
class="wp-caption-text">使用信号很弱的无线网，输入起来感觉也不错</p></div></p><p>出于同样的实用性的考虑，我提供了输入法扩展能力。本来我想提供一个完全兼容谷歌拼音的接口，但是后来觉得谷歌拼音的扩展接口设计得并不好，和目前输入法的无需选词流畅输入有冲突，没有遵循的必要。</p><p><em>开头提到的这个表情在这里： <img
src='http://lihdd.net/wp-includes/images/smilies/wink.png' alt='^_.' class='wp-smiley' /> ，不难找吧。</em></p><p>扩展的设置应该放在用户配置文件中，目前添加一个扩展的方法是：</p><div
class="wp_syntax"><div
class="code"><pre class="lua" style="font-family:monospace;">ime.register_command<span style="color: #66cc66;">&#40;</span>key, modifiers, caption, script<span style="color: #66cc66;">&#41;</span></pre></div></div><p>这里，key 和 modifiers 都是数字类型，后两者是字符串类型。</p><p>修改用户配置文件后一般要重新启动输入法才能生效，可以右击任务栏上的 ibus 图标，选择重新启动。</p><p><strong>Hello world</strong><br
/> 下面的代码注册了一个用 Alt + H 可以激活的扩展，只要输入法被激活，无论处于中英文状态，都可以用这个热键运行这个扩展。</p><div
class="wp_syntax"><div
class="code"><pre class="lua" style="font-family:monospace;">ime.register_command<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;h&quot;</span><span style="color: #66cc66;">&#41;</span>:byte<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, key.MOD1_MASK, <span style="color: #ff0000;">&quot;hello&quot;</span>, <span style="color: #ff0000;">&quot;ime.notify('hello world')&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div><p>重新启动 ibus 之后，按下方形的扩展按钮(ibus-1.2.0.20090927 版本下，方形按钮会消失，这是 ibus 的已知问题，此时通过热键仍然可以运行扩展)，可以看到一个标题为 hello 的菜单项，单击它，就可以运行扩展。<br
/><div
id="attachment_343" class="wp-caption aligncenter" style="width: 197px"><img
src="http://lihdd.net/wp-content/uploads/2010/03/ime_extension_menu.png" alt="" title="ime_extension_menu" width="187" height="301" class="size-full wp-image-343" /><p
class="wp-caption-text">输入法扩展菜单</p></div><br
/> 这里，第一个参数是按键，<code>("h"):byte()</code> 表示 h 的 ASCII 码，<code>"ime.notify('hello world')"</code> 是一段字符串表示的 lua 代码，它利用输入法提供的 <code>ime.notify</code> 方法显示了一些内容。</p><p><strong>插入系统时间</strong></p><div
class="wp_syntax"><div
class="code"><pre class="lua" style="font-family:monospace;">ime.register_command<span style="color: #66cc66;">&#40;</span>key.Shift_R, <span style="color: #cc66cc;">0</span>, <span style="color: #ff0000;">&quot;插入系统时间&quot;</span>, <span style="color: #ff0000;">&quot;ime.commit(os.date())&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div><p>这里的 <code>ime.commit</code> 也是输入法提供的方法，用来直接向客户端程序输入文字，<code>os.date</code> 是 Lua 标准库函数。这段代码注册了一个用 右Shift 激活的插入系统时间的功能。</p><p>Lua 的标准库函数在扩展中都是可以用的，比如可以用 <code>os.execute('mousepad &#038;')</code> 在后台运行一个 mousepad。</p><p><strong>执行 Lua 代码</strong></p><div
class="wp_syntax"><div
class="code"><pre class="lua" style="font-family:monospace;">ime.register_command<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'L'</span><span style="color: #66cc66;">&#41;</span>:byte<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, key.SHIFT_MASK + key.MOD1_MASK ,
  <span style="color: #ff0000;">&quot;执行 Lua 代码&quot;</span>, <span style="color: #ff0000;">&quot;ime.execute('ime.notify('..ime.get_selection()..')')&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div><p>这段代码注册了一个用 Shift + Alt + L 热键，把选中内容当做 Lua 脚本执行，并用桌面提示显示结果的扩展，这里因为有了 Shift 辅助键，所以要取大写字母 L 的 ASCII 码。其中使用方法 <code>ime.get_selection</code> 获得选定文字的内容，<code>ime.execute</code> 用来把一个字符串当做 Lua 脚本运行，双点号是字符串连接操作。</p><p>这个扩展可以比较有用，比如当选定 <code>315+23*6145</code> 这样的表达式之后，运行一下扩展就可以知道计算结果，也可以选定 <code>ime.VERSION</code> 这样的内部变量，查看其内容。甚至可以选定一段 <code>ime.register_command</code> 代码，动态添加扩展 <img
src='http://lihdd.net/wp-includes/images/smilies/happy.png' alt='(:' class='wp-smiley' /></p><p><strong>“回音”效果</strong><br
/> 不知道从什么地方开始流行这种效果，我想说明的是，声明一个函数并且在扩展中调用是可以的：</p><div
class="wp_syntax"><div
class="code"><pre class="lua" style="font-family:monospace;"><span style="color: #b1b100;">function</span> echo_effect<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
	<span style="color: #b1b100;">local</span> s <span style="color: #66cc66;">=</span> ime.get_selection<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
	<span style="color: #b1b100;">for</span> i <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span>, #s, <span style="color: #cc66cc;">3</span> <span style="color: #b1b100;">do</span> ime.commit<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>i <span style="color: #66cc66;">==</span> <span style="color: #cc66cc;">1</span> <span style="color: #b1b100;">and</span> <span style="color: #ff0000;">''</span> <span style="color: #b1b100;">or</span> <span style="color: #ff0000;">'，'</span><span style="color: #66cc66;">&#41;</span>..s:sub<span style="color: #66cc66;">&#40;</span>i<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">end</span>
<span style="color: #b1b100;">end</span>
ime.register_command<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'E'</span><span style="color: #66cc66;">&#41;</span>:byte<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, key.SHIFT_MASK + key.CONTROL_MASK,
  <span style="color: #ff0000;">&quot;产生回音&quot;</span>, <span style="color: #ff0000;">&quot;echo_effect()&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div><p>这里简单地使用了 3 个字节 作为步长，所以只能处理纯中文。对文字 &#8220;这是回音你懂吗&#8221; 使用这个扩展会得到：&#8221;这是回音你懂吗，是回音你懂吗，回音你懂吗，音你懂吗，你懂吗，懂吗，吗&#8221; <img
src='http://lihdd.net/wp-includes/images/smilies/sigh.png' alt=':sigh:' class='wp-smiley' /></p><p><strong>全半角切换</strong><br
/> 输入法本身没有提供全半角切换功能，但是通过扩展可以实现类似功能：</p><div
class="wp_syntax"><div
class="code"><pre class="lua" style="font-family:monospace;">ime.second_punc_map <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span>
<span style="color: #b1b100;">function</span> toggle_punc_map<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
	ime.second_punc_map, ime.punc_map <span style="color: #66cc66;">=</span> ime.punc_map, ime.second_punc_map
	ime.apply_settings<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
	ime.notify<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'已切换到'</span> .. <span style="color: #66cc66;">&#40;</span>ime.punc_map<span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'.'</span><span style="color: #66cc66;">&#93;</span> <span style="color: #b1b100;">and</span> <span style="color: #ff0000;">'全'</span> <span style="color: #b1b100;">or</span> <span style="color: #ff0000;">'半'</span><span style="color: #66cc66;">&#41;</span> ..<span style="color: #ff0000;">'角'</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #b1b100;">end</span>
ime.register_command<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">','</span><span style="color: #66cc66;">&#41;</span>:byte<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, key.CONTROL_MASK , <span style="color: #ff0000;">&quot;全半角切换&quot;</span>, <span style="color: #ff0000;">&quot;toggle_punc_map()&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div><p>注册了 Ctrl + 逗号 作为切换热键，并会用桌面提示显示切换结果。</p><p><strong>全双拼切换</strong><br
/> 可以仿造上例写出：</p><div
class="wp_syntax"><div
class="code"><pre class="lua" style="font-family:monospace;">ime.register_command<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #ff0000;">&quot;全双拼切换&quot;</span>,
  <span style="color: #ff0000;">&quot;ime.use_double_pinyin = not ime.use_double_pinyin ime.apply_settings()&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div><p>前面填写的两个 0 表示这个扩展没有热键，你也可以再加上一句 <code>ime.notify</code>，使得切换的时候有桌面提示。</p><p><strong>对缓存的操作</strong><br
/> 缓存是存在全局的 <code>request_cache</code> 中的，可以直接对其操作：</p><div
class="wp_syntax"><div
class="code"><pre class="lua" style="font-family:monospace;"><span style="color: #b1b100;">function</span> show_request_cache<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
	<span style="color: #b1b100;">for</span> i,v <span style="color: #b1b100;">in</span> <span style="color: #b1b100;">pairs</span><span style="color: #66cc66;">&#40;</span>request_cache<span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">do</span>
		ime.commit<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'&quot;'</span>..i..<span style="color: #ff0000;">'&quot; =&gt; &quot;'</span>..v..<span style="color: #ff0000;">'&quot;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: #66cc66;">&#41;</span>
	<span style="color: #b1b100;">end</span>
<span style="color: #b1b100;">end</span>
ime.register_command<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span> , <span style="color: #ff0000;">&quot;查看缓存&quot;</span>, <span style="color: #ff0000;">&quot;show_request_cache()&quot;</span><span style="color: #66cc66;">&#41;</span>
ime.register_command<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span> , <span style="color: #ff0000;">&quot;清空缓存&quot;</span>, <span style="color: #ff0000;">&quot;request_cache = {}&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div><p>其中的 <code>ime.commit</code> 方法用来向客户端插入文本，还有一个方法是 <code>ime.request</code>，用来向输入法提交一个拼音请求，比如下面这段代码片段将向输入法提交《春晓》的拼音：</p><div
class="wp_syntax"><div
class="code"><pre class="lua" style="font-family:monospace;"><span style="color: #b1b100;">for</span> _, v <span style="color: #b1b100;">in</span> <span style="color: #b1b100;">pairs</span>
<span style="color: #66cc66;">&#123;</span><span style="color: #ff0000;">'chun mian bu jue xiao'</span>, <span style="color: #ff0000;">'chu chu wen ti niao'</span>,
 <span style="color: #ff0000;">'ye lai feng yu sheng'</span>, <span style="color: #ff0000;">'hua luo zhi duo shao'</span><span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">do</span>
	ime.request<span style="color: #66cc66;">&#40;</span>v<span style="color: #66cc66;">&#41;</span>
	ime.commit<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #b1b100;">end</span></pre></div></div><p><strong>给自己发送飞信</strong><br
/> 输入法全局配置文件默认加载了 <code>socket.http</code> 和 <code>socket.url</code> 模块，可以用它们来访问网络。</p><p>比如，下面的代码通过 <a
href="http://api.bz/">api.bz</a> 这个在线接口把选定文字内容通过飞信发送给自己：</p><div
class="wp_syntax"><div
class="code"><pre class="lua" style="font-family:monospace;"><span style="color: #b1b100;">function</span> send_sms<span style="color: #66cc66;">&#40;</span>content<span style="color: #66cc66;">&#41;</span>
	http.TIMEOUT <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">2</span>
	<span style="color: #b1b100;">local</span> res <span style="color: #66cc66;">=</span> http.request<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'https://sms.api.bz/fetion.php?username=15566119320&amp;password=nevermind&amp;sendto=15566119320&amp;message='</span>..url.escape<span style="color: #66cc66;">&#40;</span>content<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
	ime.notify<span style="color: #66cc66;">&#40;</span>res <span style="color: #b1b100;">or</span> <span style="color: #ff0000;">'飞信发送失败'</span>, content, <span style="color: #ff0000;">'info'</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #b1b100;">end</span>
&nbsp;
ime.register_command<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'m'</span><span style="color: #66cc66;">&#41;</span>:byte<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, key.CONTROL_MASK + key.MOD1_MASK, <span style="color: #ff0000;">&quot;飞信发送&quot;</span>, <span style="color: #ff0000;">&quot;send_sms(ime.get_selection())&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div><p>以上填写的飞信用户名和密码皆为虚构，实际用的时候需要改一下。</p><p><strong>简繁体转换和翻译</strong><br
/> 使用 Google API 来翻译文字，从简体中文翻译成繁体中文就实现了转换成繁体 <img
src='http://lihdd.net/wp-includes/images/smilies/happy.png' alt='(:' class='wp-smiley' /></p><div
class="wp_syntax"><div
class="code"><pre class="lua" style="font-family:monospace;"><span style="color: #b1b100;">function</span> google_translate<span style="color: #66cc66;">&#40;</span>text, langpair<span style="color: #66cc66;">&#41;</span>
	<span style="color: #b1b100;">local</span> url <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&amp;q='</span>..url.escape<span style="color: #66cc66;">&#40;</span>text<span style="color: #66cc66;">&#41;</span>..<span style="color: #ff0000;">'&amp;langpair='</span>..url.escape<span style="color: #66cc66;">&#40;</span>langpair<span style="color: #66cc66;">&#41;</span>
	http.TIMEOUT <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span>
	<span style="color: #b1b100;">local</span> res <span style="color: #66cc66;">=</span> http.request<span style="color: #66cc66;">&#40;</span>url<span style="color: #66cc66;">&#41;</span>
	<span style="color: #b1b100;">if</span> res <span style="color: #b1b100;">then</span> res <span style="color: #66cc66;">=</span> res:match<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'&quot;translatedText&quot;:&quot;(.-)&quot;}'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">end</span>
	<span style="color: #b1b100;">return</span> <span style="color: #b1b100;">tostring</span><span style="color: #66cc66;">&#40;</span>res <span style="color: #b1b100;">or</span> text<span style="color: #66cc66;">&#41;</span>
<span style="color: #b1b100;">end</span>
&nbsp;
ime.register_command<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'t'</span><span style="color: #66cc66;">&#41;</span>:byte<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, key.CONTROL_MASK + key.MOD1_MASK ,
  <span style="color: #ff0000;">&quot;转换成繁体&quot;</span>, <span style="color: #ff0000;">&quot;ime.commit(google_translate(ime.get_selection(), 'zh-CN|zh-TW'))&quot;</span><span style="color: #66cc66;">&#41;</span>
ime.register_command<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'e'</span><span style="color: #66cc66;">&#41;</span>:byte<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, key.CONTROL_MASK + key.MOD1_MASK ,
  <span style="color: #ff0000;">&quot;翻译成英文&quot;</span>, <span style="color: #ff0000;">&quot;ime.commit(google_translate(ime.get_selection(), 'zh-CN|en'))&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div><p><strong>写在最后</strong></p><p>这是一个悲剧。</p><p>Lua 作者根本不相信多线程，原因是现在的主流语言中连 <code>a = a + 1</code> 都不是原子的，谈什么多线程呢？</p><p>我曾经做过一些尝试，确实让程序多线程地执行 Lua 代码，又共享一些全局数据，不是轻松的事情。我也想到一些解决办法，但是都太麻烦了，于是就偷懒不管那么多了。</p><p>这有什么影响呢？影响就是目前输入法执行 Lua 代码是单线程的，扩展中的 Lua 代码会造成阻塞。在有网络请求等操作的时候，要注意控制超时，否则程序可能被认为没有响应了，各种死法都有可能出现 <img
src='http://lihdd.net/wp-includes/images/smilies/hmm.png' alt='.~.' class='wp-smiley' /></p><p>目前输入法的自由程度到了可以随意 AOE，比如用 <code>os.execute('pkill Xorg')</code>，就可以干掉许多无辜者。正所谓权力越大，责任越大。到底安全与否，就看扩展中的代码自我约束得如何了 <img
src='http://lihdd.net/wp-includes/images/smilies/meeh.png' alt='._.' class='wp-smiley' /></p> ]]></content:encoded> <wfw:commentRss>http://lihdd.net/ibus-sogoupycc-extensions/feed/</wfw:commentRss> <slash:comments>15</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced

Served from: lihdd.net @ 2012-05-19 14:39:45 -->
