zoukankan      html  css  js  c++  java
  • 用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_USERSoftwareRimeWeasel", "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_MACHINESOFTWAREWOW6432NodeRimeWeasel", "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 ~= "(wW|Ww)") ;【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)
    }
  • 相关阅读:
    在浏览器中输入URL并回车后都发生了什么?
    HashMap数据结构
    记录一次mysql死锁
    常见排序(归并排序)
    记录一次redis事故
    jsp与javaBean
    org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.zhuoshi.entity.Dep#1]
    Oracle创建表空间报错:O/S-Error: (OS 3) 系统找不到指定的路径
    在myeclipse中maven项目关于ssh整合时通过pom.xml导入依赖是pom.xml头部会报错
    2018idea如何布置tomcat修改URL后连接不到
  • 原文地址:https://www.cnblogs.com/hyaray/p/12578430.html
Copyright © 2011-2022 走看看