用AutoHotkey實現【小狼毫】一鍵添加「選中內容」到詞庫並重新部署


換了win10后,極點就不好用了,看上了自定義更強的小狼毫,太難掌控了,只能先用點皮毛。

目前的理解,感覺很有特色的就是能根據候選項自定義提示內容,並且還能用Ctrl-Shift-Enter上屏提示內容

比如我自定義了個詞組indirect,並設置了其提示內容為Excel公式:indirect("$A$2:$E$"&COUNTA($A:$A))

當我想輸入公式時,先按移到第2條,再按Ctrl-Shift-Enter即可(不知道能否設置為Ctrl-Shift-2直接上屏)

 

回到正題:五筆詞庫需慢慢完善,所以用AutoHotkey寫了腳本一鍵添加選中內容。

本人把小狼毫詞庫分為:

  • 單字:常用字,可能會添加用到的生僻字,因為臨時生僻字暫時還不會
  • 自帶詞組(不動)
  • 用戶詞組(大部分修改的就是這個文件)
  • 英語:(常用英語和【U盤】這樣的詞組)

在主dict.yaml里通過以下設置可導入wubi86.ci.dict.yaml等3個詞庫文件

 

import_tables: #導入的詞典只導入詞匯,會忽略YAML定義內容
  - wubi86.ci
  - wubi86.eng
  - wubi86.user

 

下面放上ahk(v2)代碼:

#SingleInstance Force
;添加選中內容到詞庫
F9::
add2Rime()
return

;添加選中單詞到詞庫
;我詞庫分為單字fpSingle(常用字,可能會添加生僻字)、自帶詞組(不動)、用戶詞組fpUser(大部分修改)、英語fpEng(常用英語和【U盤】這樣的詞組)
add2Rime()
{
    ;用戶目錄 dirUser
    if !DirExist(dirUser := RegRead("HKEY_CURRENT_USER\Software\Rime\Weasel", "RimeUserDir"))
    {
        msgbox("用戶目錄不存在")
        return
    }
    fpSingle := dirUser . "\wubi86.hy.dict.yaml" ;單字詞庫
    fpUser := dirUser . "\wubi86.user.dict.yaml" ;用戶詞庫
    fpEng := dirUser . "\wubi86.eng.dict.yaml" ;英語詞庫
    ;軟件安裝目錄 dirSoft(里面有 WeaselServer.exe 和 WeaselDeployer.exe)
    if !DirExist(dirSoft := RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Rime\Weasel", "WeaselRoot"))
    {
        msgbox("軟件安裝目錄不存在")
        return
    }
    ;復制選中內容
    clipSave := ClipboardAll
    clipboard := ""
    send("{ctrl down}c{ctrl up}")
    if !ClipWait(0.5)
    {
        msgbox("沒復制到內容",,262144)
        clipboard := clipSave
        return
    }
    ;過濾無效內容
    if !strlen(word := trim(clipboard, "`t`r`n ")) ;空白內容
        return
    if (word ~= "(\w\W|\W\w)") ;【U盤】這種詞不處理
        return
    ;開始處理
    if (word ~= "^\w+$" && FileExist(fpEng)) ;全字母(【U盤】這種手動添加)
        FileAppend(format("{1}`t{2}`r`n", word,StrLower(substr(word,1,4))), fpEng, "utf-8")
    else ;中文
    {
        bm := this.getCode(word) ;若有問題 getCode 會直接退出
        if (strlen(word) > 1) ;多字
        {
            if !FileExist(fpUser)
            {
                msgbox(format("詞庫不存在`n{1}", fpUser))
                return
            }
            if (FileRead(fpUser, "utf-8") ~= "`n" . word . "`t")
            {
                msgbox("已存在詞組")
                return
            }
            FileAppend(format("{1}`t{2}`t9`r`n", word,bm), fpUser, "utf-8")
        }
        else
        {
            if !FileExist(fpSingle)
            {
                msgbox(format("單字詞庫不存在`n{1}", fpSingle))
                return
            }
            if (FileRead(fpSingle, "utf-8") ~= "`n" . word . "`t")
            {
                msgbox("已存在單字")
                return
            }
            FileAppend(format("{1}`t{2}`r`n", word,bm), fpSingle, "utf-8")
        }
    }
    if !ProcessExist("WeaselServer.exe")
        run(dirSoft . "\WeaselServer.exe")
    run(format("{1}\WeaselDeployer.exe /deploy", dirSoft))
}

getCode(word) ;獲取中文詞組的86五筆編碼
{
    if !(word ~= "^[\x{4E00}-\x{9FA5}]")
        _Debug.msgExit(word . "`n要求全中文", A_LineFile, A_LineNumber)
    ;修改4字以上的詞組
    if (strlen(word) >4)
        word := substr(word,1,3) . substr(word,-1)
    SplitPath(A_LineFile, , dir)
    strAll := FileRead(dir . "\86五筆單字碼表.txt")
    arr := []
    loop parse, word
    {
        RegExMatch(strAll, "i)\w+(?= " . A_LoopField . ")", m)
        arr.push(m[0])
    }
    if (strlen(word) == 1)
        return arr[1]
    if (strlen(word) == 2)
        return substr(arr[1], 1, 2) . substr(arr[2], 1, 2)
    else if (strlen(word) == 3)
        return substr(arr[1], 1, 1) . substr(arr[2], 1, 1) . substr(arr[3], 1, 2)
    else
        return substr(arr[1], 1, 1) . substr(arr[2], 1, 1) . substr(arr[3], 1, 1) . substr(arr[4], 1, 1)
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM