BlindingDark / rime-easy-en

Rime / Easy English 英文输入法
GNU Lesser General Public License v3.0
286 stars 25 forks source link

Windows 10 下,连续输入增强失败, 可能是 wordninja 安装失败。 #24

Closed yu-soong closed 3 years ago

yu-soong commented 3 years ago

我用的是Windows 10,步骤如下:

  1. plum里用 bash rime-install BlindingDark/rime-easy-en 安装 easy_en;
  2. plum里 git clone --depth=1 https://github.com/chengyuhui/wordninja-rs
  3. 在 Windows Subsystem Linux (Ubuntu) 中输入cargo build --release 部署 wordninja 在 某文件夹下
  4. 按照指示: patch: easy_en/wordninja_rs_path: "/My/PATH/wordninja-rs/target/release/wordninja" 结果部署后启用 easy_en 后有问题,具体如下

综上,我觉得我的 wordninja 可能没有安装成功,但是不知道问题出在哪。谢谢。

BlindingDark commented 3 years ago

WSL 我不太熟,但是你的 rime 是装在哪里的?如果是 rime 在 Windows 里,去直接调用 WSL 编译出来的二进制文件(这个二进制文件应该是在 Linux 里才能运行吧)可行么?

你试试交叉编译到 Windows。或者最直接的办法,在 Windows 下面装 rust 进行编译。

yu-soong commented 3 years ago

用 rust 编译时遇到了 link.exe not found 的 error,懒得折腾就用 Python 装的 wordninja。但是还是没有成功,输入连续单词会有窗口闪动,然后输入框无法输入了。

BlindingDark commented 3 years ago

我现在手头没有 windows 的环境进行测试,只能先等等看有没有其它 windows 用户进行反馈。

yu-soong commented 3 years ago

好。说实话,这个 easy_en 我用的很少。关键是不够智能。不支持模糊匹配,比如我想输入 interesting 每一个字母的顺序都不能错。我曾经用过一个 AutoHotkey 的脚本,输入 inst 也可以匹配到 intersting 。 估计这个在 Rime 中很难实现。

BlindingDark commented 3 years ago

输入 inst 也可以匹配到 intersting

不加空格的 fuzzy 匹配的准确度相当低,相当于这个正则 ".*?i.*?n.*?s.*?t.*?",会匹配到你不想要的单词。一般的做法是用空格表示哪里需要模糊,比如 i[空格]nst 相当于 ".*?i.*?nst.*?",这样准确率就会提高。

在 Rime 中很难实现

用 lua 搞也能实现,不过这么做就是相当于完全绕开 rime 自己的查询词典了。

yu-soong commented 3 years ago

嗯,看起来,加空格确实可以提高准确度,但是,空格键经常是作为第 1 候选词的选择键,所以加空格可能会影响输入的流畅度?其实不加空格的 fuzzy 匹配也可以很快的 一次没匹配 再敲一个字母就行。不管怎样, 如果可以实现还蛮期待的。Rime 对英语输入的支持很差,所以绕开了也无所谓,只要整合在一起就行了 😂

我之前用 AutoHotkey 可以实现(不加空格 fuzzy 匹配,估计加空格也可以),但做的不好的地方就是输入法的候选窗在某些应用比如 Chrome 里不跟随当前输入位置的光标,而是跟随鼠标的位置,影响体验。且没有和 Rime 整合,需要另开 (当然这个也不是特别大的问题)

BlindingDark commented 3 years ago

如果可以实现还蛮期待的

还是要调用一个外部的 rust 程序哦 😂

yu-soong commented 3 years ago

不需要调用一个外部的 rust 程序员就行,😂

cnlog commented 3 years ago

win10上确实有问题,闪一下黑窗,然后输入框就刷没了。rust不懂,通过ENV进行高频数据交换,还是比较卡的。后来找了个C++写的分词类,down下来librime-lua,整合进去,编译rime.dll,替换小狼毫自带的,在lua里面只接调用C函数分词,终于不出黑窗了。如何和中文混输时候进行连输?主页上输入法显示彩色灯泡,为啥我这里显示黑白灯泡☹

yu-soong commented 3 years ago

@cnlog 厉害了 👏🏻,你这个方案会放到 GitHub 上吗?有空我学习一下。还有,这个方案支持 fuzzy 匹配吗?(这个可以有😂)

你显示黑白灯泡,可能是字体的问题?我虽然没成功,但某次看到一个黄色的灯泡一闪而过。

cnlog commented 3 years ago

https://github.com/cnlog/warehouse
自己编译的话.env.bat中 set CMAKE_GENERATOR="Visual Studio 16 2019" -A Win32 换成你的vs版本

替换原来的rime.dll,注意备份。退出算法服务,复制dll后再启动算法服务。把wordninja_words.txt放到用户目录,和rime.lua同一目录。修改easy_en.lua, local function split_sentence_wordninja_rs(sentence, wordninja_rs_path) --return capture(wordninja_rs_path .. " -n " .. sentence) --调用l_word_split函数分词 local result = l_word_split(0,sentence) return result end

yu-soong commented 3 years ago

没有 vs,只有 VS Code 😂

yu-soong commented 3 years ago

发现一个有趣的英文输入法,用 lua 实现的:https://github.com/sdadonkey/rime-english 希望对各位有所启发 🤭

BlindingDark commented 3 years ago

@yu-soong easy-en 的重点是提供基本的单词和句子输入,不会考虑单词释义等功能,今后的目标是优化长句输入体验。
rime-english 更像是英文单词词典,对于学习使用更有帮助。
两者侧重点不同,用户可以根据需要搭配使用。😘

yu-soong commented 3 years ago

@BlindingDark 对的,我也不需要单词释义,所以用他那个方案,我自己手动把能去的释义都去掉了。

目前那个方案的优点是: -不需要用 wordninja, 因为目前 wordninja 貌似在 Windows 10上面有 bug,至少我现在用 Rust 和 Python 装的都用不了;他这个应该是用的 Lua 速度也挺快的。 -支持通配符 fuzzy 匹配;空格键输入单词会自动插入空格(目前用数字键选词没有空格,不知道是不是 bug)。

缺点是好像不支持短语,只能是单个单词。

我觉得这两个方案结合起来可能就完美了😂

BlindingDark commented 3 years ago

@yu-soong 我本人不在 Windows 下使用 rime,所以没有暂时测试 Windows 下的兼容情况。不过下阶段有计划提供 Windows 平台的二进制文件,到时直接下载使用即可。 单个单词的模糊匹配也有在计划中,不过整句的模糊输入还没有想到什么好的方案。

yu-soong commented 3 years ago

@BlindingDark

下阶段有计划提供 Windows 平台的二进制文件,到时直接下载使用即可。

期待👏

整句的模糊输入

我觉得可以将常用的短语放进 dict 里面去。就是不知道可不可以将短语当作普通的单词看待。另外那个方案对符号支持比较友好,输入逗号句号,直接在单词后面添加符号,不会产生不必要的空格。供您参考。

BlindingDark commented 3 years ago

将常用的短语放进 dict 里面去

词典中已经有部分短语了

不会产生不必要的空格

这个之前有讨论过

easy-en 的做法是,不需要用户手动输入空格,程序自动会在每个单词后面加空格,不过 rime 不能删除已经加上的空格,所以我目前没找到一个好办法可以在输入标点后将前面的空格删除,如果有的话那就完美了。 rime-english 的做法是,每个标点和空格需要用户手动输入,只不过是附带触发单词上屏,这样是可以根据情况来选择要不要加空格。

举例,输入 I love rime.

easy-en 的键盘按键顺序:Iloverime[删除空格][句号] rime-english 的键盘按键顺序:I[空格]love[空格]rime[句号]

yu-soong commented 3 years ago

嗯,这是个输入习惯偏好问题。rime-english 更接近于我们平常的英语输入习惯,但是 easy-en 习惯后估计会更流畅(毕竟少打不少空格😝)。

H-111-di commented 3 years ago

现在用起来的感觉,更像是连续输入增强在windows下的实现方式可能不太行。

我两种都试了,感觉两种连续输入增强都是调用外部程序失败的那种感觉。

连续输入之后,想要它进行空格补充的时候,都会有一个程序被调用,rust版本的时候是一个没有任务栏图标的东西,弹出然后就消失;然后就会卡在原来的位置,再因为小狼毫的问题,窗口会被隐藏;之后再继续输入的时候,就会卡住;然后rime被暂时挂起,直到调用到切换输入方案的菜单的时候。
而在python的那个的情况下直接是一个巨大的cmd窗口弹出,然后消失,然后直接rime挂起。

不过现在关掉之后用起来还是很爽的(除了词库比较细碎 和 模糊好像还是怪怪的以外,比rime-english那样直接占用中英输入要爽很多很多

BlindingDark commented 3 years ago

@H-111-di 看来 windows 下确实不能这么直接调用,我再尝试下别的方案

H-111-di commented 3 years ago

开发大大辛苦了🙏🏻

BlindingDark commented 3 years ago

@yu-soong

Windows 版本的 exe 文件,点击下载 https://github.com/BlindingDark/wordninja-rs/releases/download/latest/wordninja.exe

也可以去我的仓库的 Release/Assets 找到编译好的 Linux, MacOS 以及 Windows 版本的 wordninjia-rs https://github.com/BlindingDark/wordninja-rs/releases

yu-soong commented 3 years ago

谢谢 @BlindingDark 我刚才试了一下,还是没有成功。 以下是我的配置过程:

  1. 安装wordninja.exe,Windows 警告程序不安全,我没管 run anyway。
  2. 用东风破安装easy_en 发现打句子依然闪屏、退出,再次点击 wordninja.exe 时安装界面也没有了,而是有个黑色的框一闪而过。
  3. 去 easy_en.custom.yaml 里设置路径 patch: easy_en/wordninja_rs_path: "C:\Users\myname\Downloads\wordninja.exe" 还是不行 Rime 的 log.ERROR 文件报错: E0324 17:32:52.420958 9544 config_data.cc:71] Error parsing YAML: yaml-cpp: error at line 2, column 43: bad character found while scanning hex number

不知道我以上的步骤有没有错误的地方?

BlindingDark commented 3 years ago

@yu-soong 大概发现问题了,在尝试解决

yu-soong commented 3 years ago

👍

BlindingDark commented 3 years ago

@yu-soong 问题比较复杂

首先是路径问题,Windows 配置路径如果使用 \,则需要两次转义也就是写四个 \\\\,所以推荐用 / 作为路径分隔符,也就是 C:/Users/myname/Downloads/wordninja.exe

然后是权限问题,rime lua 只能读取到 rime 用户配置文件夹下的文件,所以放在 download 路径下的文件是读取不到的,所以路径应该放到 C:/Users/username/AppData/Roaming/Rime/wordninja.exe

这样放好之后,虽然不报错了,但是在大部分输入框里都没办法正常工作,只有在极个别的一些窗口,比如文件管理器的搜索栏里可以使用。打字的时候你会发现会有一个黑框闪过去,这个楼上很多人已经提过了,就是这个黑框导致输入焦点丢失,无法正常使用。这个是 lua windows 实现的一个问题,一定会弹 cmd 窗口,我现在在想办法绕过去,比较麻烦。


AM 4:00 成功了,今天搞的比较晚了,明天整理解决方案

yu-soong commented 3 years ago

@BlindingDark 期待 🤞

BlindingDark commented 3 years ago

@yu-soong 下面这个方案仅作为测试使用

  1. 点击下载 weasel-lua-winapi.zip
  2. 将两个 dll 解压到 weasel 目录(右键点击 rime 托盘后,选择 程序文件夹 即可打开 weasel 目录)
  3. 必须将 wordninja.exe 放在 用户文件夹 中
  4. 正确配置 wordninja.exe 路径,如 C:/Users/username/AppData/Roaming/Rime/wordninja.exe,注意是 / 斜杠
  5. 修改 easy_en.lua,将开头的 capture 函数,也就是开头的 6 行,替换为下面的代码

    require "winapi"
    
    local function capture(cmd)
       code, s = winapi.execute(cmd)
       return s
    end
  6. 退出算法服务再启动算法服务

上面的方案我自己试了一下,性能不是很理想,步骤也过于繁琐了,接下来我会仿照 @cnlog 的方案,把 rust 程序打包成 dll/so,这样所有平台都能受益,速度应该也会提升。

yu-soong commented 3 years ago

我试了一下,不行。连候选词都没有了,如图: image 我等你更成熟的方法吧。你慢慢来🤭

BlindingDark commented 3 years ago

@cnlog @H-111-di @yu-soong

适用于 Windows 系统的更新来了 🎉 参照 README https://github.com/BlindingDark/rime-easy-en#lua-native-module 只需要

  1. 点击下载 https://github.com/BlindingDark/wordninja-rs-lua/releases/download/latest/wordninja_windows_32_lua53.dll
  2. 点击下载并解压 https://sourceforge.net/projects/luabinaries/files/5.3.6/Windows%20Libraries/Dynamic/lua-5.3.6_Win32_dllw6_lib.zip/download
  3. 将第 1 步得到的 wordninja_windows_32_lua53.dll 重命名为 wordninja.dll 并放到喜欢的位置
  4. 将第 2 步得到的 lua53.dll 放入 weasel 目录(右键点击 rime 托盘后,选择 程序文件夹 即可打开 weasel 目录)
  5. 配置 easy_en.custom.yaml
    patch:
      easy_en/use_wordninja_rs_lua_module: true
      easy_en/wordninja_rs_lua_module_path: "C:/SOME/PATH/wordninja.dll"

欢迎反馈

yu-soong commented 3 years ago

@BlindingDark 不知道是不是我电脑的原因,按照这个方法还是没有成功,依然闪屏。 但是我按照 @cnlog 的方法成功了。但是他这个也有小 bug,就是有时会打出两个空格。并且不支持撇号(')比如 it's, that's 等打不了,只能打its 然后在候选框了选 it's.
如果愿意的话,建议可以考虑合并过来。然后对比一下看哪个速度更快一些。

BlindingDark commented 3 years ago

依然闪屏

理论上是不可能的,这个方案从头到尾就没有调用过外部程序,可以把你的完整配置发来么?

你说的闪屏是什么现象?可以分词但是有窗口弹出来闪一下,还是输入闪一下但是没分词,还是一点候选也没有只闪屏?

以及你的 rime 是从哪里下载的?官网上默认是 32 位程序。

@yu-soong 最近你有空的话可以给你远程控制看看问题。你有什么联系方式么?

yu-soong commented 3 years ago

@BlindingDark 不好意思,我刚刚认真的检查了一下。原来是我的 easy_en.lua 文件有了改动(或者是你做了什么改动?) 总之,覆盖成你的,就可以使用了。十分感谢!

BlindingDark commented 3 years ago

(或者是你做了什么改动?)

是的,最新(0.9)版本的 lua 脚本是升级了的。

既然问题已经解决,我就先关闭这个 issue 了。 有什么新的意见和建议欢迎提新的 issue 😘。