hchunhui / librime-lua

Extending RIME with Lua scripts
BSD 3-Clause "New" or "Revised" License
359 stars 45 forks source link

Memory 记录的生成词无法生效,需重启 fcitx 后生效 #318

Closed amosbird closed 9 months ago

amosbird commented 9 months ago

使用如下 lua 脚本生成词( Ctrl-t 触发)

local flag = false

local function processor(key, env)
    local kAccepted = 1
    local kNoop = 2
    local engine = env.engine
    local context = engine.context

    if key:repr() == "Control+t" then
        if context:is_composing() then
            flag = true
            context:refresh_non_confirmed_composition()
            return kAccepted
        end
    end

    return kNoop
end

local translator = {}

local function memoryCallback(memory, commit)
    for i, dictentry in ipairs(commit:get()) do
        log.error(dictentry.text)
        memory:update_userdict(dictentry, 1, "")
    end
    return true
end

function translator.init(env)
    env.mem = Memory(env.engine, Schema("double_pinyin"))
    env.mem:memorize(function(commit) memoryCallback(env.mem, commit) end)
end

function translator.func(input, seg, env)
    if flag then
        flag = false

        local f = assert(io.popen("cloudinput " .. input, "r"))
        local s = assert(f:read("*a"))
        f:close()
        for word in s:gmatch("%S+") do
            dict = DictEntry()
            dict.text = word
            dict.custom_code = input .. ' '
            dict.comment = '+'

            local ph = Phrase(env.mem, "baidu", seg.start, seg.start + #input, dict)
            yield(ph:toCandidate())
        end
    end
end

return {processor = processor, translator = translator}

主 translator 配置

  translator:
    dictionary: luna_pinyin.extended
    user_dict: baidu
    db_class: tabledb

当生成词 commit 之后,输入相同的 input 无法得到之前的词条作为 candidate,baidu.txt 文件中也没有对应的词条。 重启 rime 后,baidu.txt 中出现生成的词条,输入相同的 input 可以获得对应的词条。

@shewer 辛苦大佬指点一二

shewer commented 9 months ago

你的操作 不是很懂, env.mem 都沒有使用, 而是使用 DictEntry 建立Phrase struct DictEntry & class Code 我沒有涉略。

userdict 是tabledb (text) 可能要去查看 source code , 理論上,載入後應該就能工作,檔案更新時機可能在關閉檔案時才更新吧. tabledb 是文字檔 ,無法局部寫入,不可能每次commit就存檔

是否還有一個正字典翻譯器在使用同一個字典(script_translator@translator), env.mem(env.engine , Schema(....)) 和 目前方案相同嗎

amosbird commented 9 months ago

env.mem 都沒有使用, 而是使用 DictEntry 建立Phrase

请问这里规范的使用方式是什么样的呢?

tabledb 是文字檔 ,無法局部寫入,不可能每次commit就存檔

我测试了 leveldb,行为是一样的,只有重启 fcitx 之后,之前 update_userdict 记录的生成词才会 flush 到对应的 ldb log 中。

是否還有一個正字典翻譯器在使用同一個字典(script_translator@translator),

目前在用的有:

  translators:
    - "lua_translator@baidu_translator"
    - punct_translator
    - reverse_lookup_translator
    - script_translator
    - "table_translator@custom_phrase"

其中 custom_phrase 有涉及到 user_dict,不过是不同的字典

custom_phrase:
  db_class: stabledb
  dictionary: ""
  enable_completion: false
  enable_sentence: false
  initial_quality: 1
  user_dict: custom_phrase
mirtlecn commented 9 months ago

问题可能在这

dict.custom_code = input .. ' '

这样写会搞乱音节,必须一个音节加空格,除非是 table_translator

https://github.com/mirtlecn/rime-radical-pinyin/blob/master/lua%2Fsearch.lua#L122-L151

amosbird commented 9 months ago

@mirtlecn 我将 custom_code 构建成了音节分割的形态,结尾带有空格,依然不行

amosbird commented 9 months ago

@mirtlecn 确实是 custom_code 的问题。我在代码中打了一些日志发现结尾多了两个空格,是其他的配置导致的,调整后就正常了。感谢!