ZSaberLv0 / ZFVimIM

vim输入法 / Vim Input Method by pure vim script, support: user word, dynamic word priority, cloud db files
203 stars 14 forks source link

IMAdd 功能在累积到一定程度会失败 #57

Closed shaman-yellow closed 4 months ago

shaman-yellow commented 4 months ago

我最初注意到这个问题,是想要尝试导入一些快速触发的词组的时候。 通过 sourceIMAdd 命令文件:

db1.txt 。 运行后,在该进程下,导入的内容是部分有效的,靠前的有效,例如,llss,可以得到“啰啰嗦嗦”。但靠后的 IMAdd 可能无效。 此外,关闭之后(自动保存更新词典),这些 source 的内容没有被写入到词典中,没有得到更新。新打开 vim ,上一次的 source 也是无效的。

后来,我写了一个很实用的 autocmd 命令:

autocmd User ZFVimIM_event_OnCompleteDone call AddWordsShortCut()

这里的 AddWordsShortCut,会捕获作者大大定义的 g:ZFVimIM_choosedWord,每次输入后自动执行 IMAdd 。例如,当我输入 zhongweng 得到 “中文”,它会帮我执行:

IMAdd 中文 zw。

这极其实用,让我下次重复输入时,只需要每个字的第一个字母。但是因为这个 autocmdIMAdd 会频繁触发,使之前被我有意忽略的 IMAdd 问题在这里又复现了:积累过量的 IMAdd 词语,没有成功被写入到词典中。

本想提供 log.txt 文件给作者大大提供线索,但没有报错好像就没有输出这个文件。如果作者大大想要复现我的 issue, 可以试试 source 我提供的 vim 文件。我觉得,我前后提的两个例子应该是同一个问题。

希望能够帮忙解决这个问题!

ZSaberLv0 commented 4 months ago

let g:ZFVimIM_dbEditLimit = 0 默认限制了 500 词库操作是纯 vimscript 实现的, 多了不确定会不会卡

shaman-yellow commented 4 months ago

感谢及时解答!

shaman-yellow commented 4 months ago

我在保存中遇到了以下错误:

[ZFVimIM] <YourDb> save done: Traceback (most recent call last):                                 
  File "/home/echo/.vim/bundle/ZFVimIM/misc/dbSave.py", line 16, in <module>                     
    for line in file:                                                                            
  File "/usr/lib/python3.10/codecs.py", line 322, in decode                                      
    (result, consumed) = self._buffer_decode(data, self.errors, final)                           
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe5 in position 389: invalid continuation by
te

我手动修改了 /home/echo/.vim/bundle/ZFVimIM/misc/dbSave.py, 加了 errors = 'ignore',然后就成功了,最后保存的词典文件也是正常的,但我不明白是为什么,加入 ignore 不知道会带来什么影响。

with io.open(DB_SAVE_CACHE_PATH, 'r', encoding='utf-8', errors='ignore') as file:
ZSaberLv0 commented 4 months ago

你的 vim set encoding? 是啥?

shaman-yellow commented 4 months ago

encoding=utf-8

ZSaberLv0 commented 4 months ago

有点奇怪,改改 dbSave.py 里面把 DB_SAVE_CACHE_PATH 文件复制出来,文件贴上来看看?

shaman-yellow commented 4 months ago

是自动识别为 latin1 的乱码。我设置 :set fileencoding=utf-8 也还是乱码。但是,是可以保存成功的,弄成 errors='ignore'。 大概是这样:

add zy 遭遇
add zaoyu 遭遇
add hhs 灰褐色的人
add d 的
add hhs 灰褐色的人
add d 的
add d 对

另外,你之前说 “词库操作是纯 vimscript 实现的, 多了不确定会不会卡”, 好像的确速度会变慢。我想知道,如何不离开vim, 重新读取启动词库,相当于重开一遍,这样应该可以不卡吧?我想设置一个 autocmd,当数量过多,就自动保存然后重开。或者有没有其他更优雅的方式重设一遍?

ZSaberLv0 commented 4 months ago

话说你是要自造词库? 没必要一直 IMAdd, 词库文件本身就是个纯文本, 自行编辑后用 call ZFVimIM_dbNormalize('/path/to/dbFile') 格式化一次就行: https://github.com/ZSaberLv0/ZFVimIM?tab=readme-ov-file#make-your-own-db

IMAdd 本身是搭配输入过程中自造词用的, 没考虑过批量使用, 插件本身也还计划兼容纯 vimscript 环境, 所以也不打算搞的那么复杂

shaman-yellow commented 4 months ago

自己编辑词库不是一件明知的做法:加的词太多,找想要的词很麻烦;加的太少,找不到想要的词。 其实我最需要的,是为自己常用的词添加快捷输入。我上面提到的我设计的 autocmd 就是我的预期。其实一年前我开始使用这个插件时,就在憧憬有这样一个功能了,只是最近才略微了解怎么去实现,然后落实了。全拼的输入,实在太累了,但是又没有精力去学习双拼和五笔输入,只能退而求其次了。以 autocmd 自动补充快捷输入,是一件让人愉快的事。 现在的问题在于,IMAdd 不够轻巧呀,从我的使用直觉来看,它应该更轻巧一点。很奇怪,词库本身再大点,输入也不会变慢,但是多执行几次 IMAdd 就变慢了。

ZSaberLv0 commented 4 months ago
  1. 更新一下 ZFVimIM 和 ZFVimJob
  2. let g:ZFVimIM_dbEditLimit = 0
  3. 然后用这种方式添加: IMAdd! 测试 ceshi 或者 call IMAdd('!', {}, '测试', 'ceshi')
  4. 视情况 :IMCloud 主动触发同步
shaman-yellow commented 4 months ago

太感谢了!我试试看!

shaman-yellow commented 4 months ago

使用 IMAdd! 测试 cs 会遇到以下问题:

E477: No ! allowed: IMAdd! 测试 cs

不过,call IMAdd('!', {}, '测试', 'cs') 是可以成功的。

但有一个问题,这次 vim 进程添加的,只能在下次开启时才能生效。 你的意思是,:IMCloud 可以主动同步,让当前进程也能使用吗?但我尝试了,好像没有生效。得重开才能生效。

ZSaberLv0 commented 4 months ago

再更新一下试试

shaman-yellow commented 4 months ago

现在 OK 了!

shaman-yellow commented 4 months ago

IMAdd 的更新好像没有解决执行次数过多会变得卡顿的问题。 在输入时,我大约 10s autocmd 执行一次 IMCloud 更新,应该是触发 Async 更新的词库。 我现在不确定,是电脑的配置不行吗,导致多次执行后发生卡顿? 但是在开始的很多次,都是很顺滑的;在累积可能十多分钟后,会变得迟钝。 难道是 Async 的后台进程会没有及时关闭吗?

ZSaberLv0 commented 4 months ago

echo len(g:ZFVimIM_db[0]['dbEdit']) 看看是不是有堆积, 同步不成功会持续保留 dbEdit, 所以默认限制 500 如果不是, 看看你的 autocmd 怎么写的, 是不是堆积了 另外, 还是建议用 ZFVimIM_dbNormalize 来初始化词库, 词库本来就是拿来干这种事的, 没必要用 IMAdd 一个个加, 舍近求远