使用 ahkv2 (autohotkey) 实现快速将所选文本替换成 markdown 的列表模式

代码如下:

class TextEdit {
    /**
     * 判断文本每一个首行是否是以 "- "开头
     * @param text 输入文本
     * @returns {boolean} 
     */
    static IsEveryLineStartWithDash(text) {
        ; 使用 StrSplit 将文本按行分割
        lines := StrSplit(text, "`n")
        for line in lines {
            ; 检查每一行是否以 "- " 开头
            if (InStr(line, "- ", 1) != 1) {
                return false
            }
        }
        return true
    }

    /**
     * 判断文本每一个首行是否是以数字序号开头
     * @param text 输入文本
     * @returns {boolean} 
     */
    static IsEveryLineStartWithNum(text) {
        ; 使用 StrSplit 将文本按行分割
        lines := StrSplit(text, "`n", "`r")
        for line in lines {
            ; 检查每一行是否以 "- " 开头
            if (!RegExMatch(line, "^\d+\.")) {
                return false
            }
        }
        return true
    }
    /**
     * 得到选中的文字
     * @returns {[String, String]} 
     * 1. 备份的剪贴板内容
     * 2. 选中的文字
     */
    static GetSelectedText() {
        clip_saved := A_Clipboard
        A_Clipboard := ""
        Send("^c")
        ClipWait(0.05)
        clipText := A_Clipboard
        return [clip_saved, clipText]
    }

    /**
     * 得到选中文字所在行的所有内容
     * @returns {String} 
     */
    static getLineOfSelectedText() {
        Send("+{Home}")
        HomeSelectedText := TextEdit.GetSelectedText()[2]
        ; OutputDebug(HomeSelectedText)

        Send("+{End}")
        EndSelectedText := TextEdit.GetSelectedText()[2]
        ; OutputDebug(EndSelectedText)

        if (StrLen(HomeSelectedText) > StrLen(EndSelectedText)) {
            Send("+{Home}")
            text := TextEdit.GetSelectedText()[2]
            Send("{BackSpace}")
            Send("+{End}")
            text := text . TextEdit.GetSelectedText()[2]
        } else {
            Send("+{End}")
            text := TextEdit.GetSelectedText()[2]
            Send("{BackSpace}")
            Send("+{Home}")
            text := TextEdit.GetSelectedText()[2] . text
        }
        return text
    }
}

!-:: {
    text := TextEdit.getLineOfSelectedText()
    ; 检查是否是每行开头都添加了 "- ", 如果是,则删除 "- "
    bool := TextEdit.IsEveryLineStartWithDash(text)
    if (bool) {
        text := RegExReplace(text, "m)- ", "")
        A_Clipboard := text
        Send("^v")
        return
    }

    A_Clipboard := RegExReplace(text, "m)^", "- ")
    Send("^v")
}
!=:: {
    text := TextEdit.getLineOfSelectedText()
    ; 检查是否是每行开头都添加了数字序号., 如果是,则删除
    bool := TextEdit.IsEveryLineStartWithNum(text)
    if (bool) {
        text := RegExReplace(text, "m)\d+. ", "")
        A_Clipboard := text
        Send("^v")
        return
    }

    ; 将每行的开头添加 "数字 "
    num := 1
    modifiedText := ""
    for line in StrSplit(text, "`n", "`r")
    {
        modifiedText .= num . ". " . line . "`r`n"
        num++
    }
    ; 删除末尾的换行符
    modifiedText := RTrim(modifiedText, "`r`n")
    A_Clipboard := modifiedText
    Send("^v")
}

展示效果:

动画.gif

欢迎提出优化建议

注意事项

如果使用过程中, 出现了按键粘滞的现象, 可以参考此文章解决: https://zhuanlan.zhihu.com/p/666348622

1 个赞

这种需求我一般用代码编辑器和正则表达式解决

1 个赞