如何用脚本实现快捷短语管理

wen 实用脚本 3

本文目录导读:

如何用脚本实现快捷短语管理

  1. 基于热键的快捷输入脚本(AutoHotkey)
  2. Python版本(适用于跨平台)
  3. Linux/Unix Bash脚本版本
  4. 使用方法

基于热键的快捷输入脚本(AutoHotkey)

; AutoHotkey 快捷短语管理脚本
; 配置区域
#Persistent
Menu, Tray, Icon, shell32.dll, 132  ; 设置托盘图标
; 定义快捷短语库
global phrases := Object()
; 初始化短语
InitPhrases() {
    phrases["@email"] := "your.email@example.com"
    phrases["@phone"] := "138-0000-0000"
    phrases["@addr"] := "北京市朝阳区xxx街道"
    phrases["@name"] := "张三"
    phrases["@sig"] := "此致`n敬礼`n张三"
    phrases["@date"] := A_YYYY "-" A_MM "-" A_DD
    phrases["@time"] := A_Hour ":" A_Min
}
; 初始化
InitPhrases()
; 热键触发(Ctrl+Shift+V 展开)
^+v::
{
    ; 获取选中文本或输入框内容
    input := ""
    ; 显示选择菜单
    Menu, PhraseMenu, Add, 常用短语, MenuHandler
    Menu, PhraseMenu, Add  ; 分隔线
    For key, value in phrases {
        Menu, PhraseMenu, Add, %key% - %value%, MenuHandler
    }
    Menu, PhraseMenu, Show
    return
}
MenuHandler:
{
    ; 获取选择的菜单项
    selectedPhrase := A_ThisMenuItem
    ; 提取快捷码
    RegExMatch(selectedPhrase, "^@\w+", code)
    if (phrases.HasKey(code)) {
        ; 发送文本
        SendInput % phrases[code]
    }
    return
}
; 管理界面热键(Ctrl+Shift+M 打开管理窗口)
^+m::
{
    Gui, New, , 快捷短语管理
    Gui, Add, ListView, r10 w400, 快捷码|内容
    For key, value in phrases {
        LV_Add("", key, value)
    }
    LV_ModifyCol(1, 100)
    LV_ModifyCol(2, 290)
    Gui, Add, Button, gAddPhrase x10 y+10, 添加
    Gui, Add, Button, gEditPhrase x+10, 编辑
    Gui, Add, Button, gDeletePhrase x+10, 删除
    Gui, Add, Button, gExportPhrases x+10, 导出
    Gui, Add, Button, gImportPhrases x+10, 导入
    Gui, Show
    return
}
AddPhrase:
{
    Gui, New, , 添加快捷短语
    Gui, Add, Text, , 快捷码:
    Gui, Add, Edit, vNewCode w200
    Gui, Add, Text, , 短语内容:
    Gui, Add, Edit, vNewContent w300 r5
    Gui, Add, Button, gSavePhrase Default, 保存
    Gui, Add, Button, gCancelPhrase x+10, 取消
    Gui, Show
    return
}
SavePhrase:
{
    Gui, Submit
    if (NewCode && NewContent) {
        phrases["@" . NewCode] := NewContent
        Gui, Destroy
        ; 刷新主界面
        gosub ^+m
    }
    return
}
EditPhrase:
{
    ; 获取选中的行
    LV_GetText(code, LV_GetNext(0, "Focused"), 1)
    LV_GetText(content, LV_GetNext(0, "Focused"), 2)
    Gui, New, , 编辑快捷短语
    Gui, Add, Text, , 快捷码:
    Gui, Add, Edit, vEditCode w200, %code%
    Gui, Add, Text, , 短语内容:
    Gui, Add, Edit, vEditContent w300 r5, %content%
    Gui, Add, Button, gUpdatePhrase Default, 更新
    Gui, Add, Button, gCancelPhrase x+10, 取消
    Gui, Show
    return
}
UpdatePhrase:
{
    Gui, Submit
    if (EditCode && EditContent) {
        ; 删除旧的
        phrases.Delete(EditCode)
        ; 添加新的
        phrases[EditCode] := EditContent
        Gui, Destroy
        gosub ^+m
    }
    return
}
DeletePhrase:
{
    LV_GetText(code, LV_GetNext(0, "Focused"), 1)
    if (code) {
        MsgBox, 4, 确认删除, 确定删除快捷短语「%code%」?
        IfMsgBox, Yes
        {
            phrases.Delete(code)
            gosub ^+m
        }
    }
    return
}
ExportPhrases:
{
    FileSelectFile, exportFile, S16, phrases.json, 导出短语, JSON文件 (*.json)
    if (exportFile) {
        jsonData := "{"
        For key, value in phrases {
            jsonData .= """" . key . """: """ . value . ""","
        }
        jsonData := SubStr(jsonData, 1, StrLen(jsonData)-1) . "}"
        FileDelete, %exportFile%
        FileAppend, %jsonData%, %exportFile%
        MsgBox, 导出成功!
    }
    return
}
ImportPhrases:
{
    FileSelectFile, importFile, 3, , 导入短语, JSON文件 (*.json)
    if (importFile) {
        FileRead, jsonData, %importFile%
        ; 简单JSON解析
        RegExMatch(jsonData, "\{.*\}", jsonContent)
        ; 实际开发需要使用JSON库
        MsgBox, 导入成功!
        gosub ^+m
    }
    return
}
CancelPhrase:
{
    Gui, Destroy
    return
}
; 退出
^+q::
{
    ExitApp
}

Python版本(适用于跨平台)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import json
import os
import sys
import keyboard
import pyperclip
from tkinter import *
from tkinter import ttk, messagebox, filedialog
class PhraseManager:
    def __init__(self):
        self.phrases = {}
        self.config_file = "phrases.json"
        self.load_phrases()
        self.setup_hotkeys()
    def load_phrases(self):
        """加载短语配置"""
        if os.path.exists(self.config_file):
            try:
                with open(self.config_file, 'r', encoding='utf-8') as f:
                    self.phrases = json.load(f)
            except:
                self.phrases = self.get_default_phrases()
        else:
            self.phrases = self.get_default_phrases()
            self.save_phrases()
    def save_phrases(self):
        """保存短语配置"""
        with open(self.config_file, 'w', encoding='utf-8') as f:
            json.dump(self.phrases, f, ensure_ascii=False, indent=2)
    def get_default_phrases(self):
        """默认短语库"""
        return {
            "@email": "your.email@example.com",
            "@phone": "138-0000-0000",
            "@addr": "北京市朝阳区xxx街道",
            "@name": "张三",
            "@sig": "此致\n敬礼\n张三",
            "@date": "__DATE__",
            "@time": "__TIME__"
        }
    def setup_hotkeys(self):
        """设置热键"""
        keyboard.add_hotkey('ctrl+shift+v', self.expand_phrase)
        keyboard.add_hotkey('ctrl+shift+m', self.open_manager)
    def expand_phrase(self):
        """展开快捷短语"""
        # 获取当前选中的文本
        try:
            selected = pyperclip.paste()
            # 简单匹配:最近输入的@开头的文本
            if selected.startswith('@') and selected in self.phrases:
                text = self.phrases[selected]
                # 替换日期时间占位符
                from datetime import datetime
                text = text.replace('__DATE__', datetime.now().strftime('%Y-%m-%d'))
                text = text.replace('__TIME__', datetime.now().strftime('%H:%M'))
                pyperclip.copy(text)
                keyboard.send('ctrl+v')
        except:
            pass
    def open_manager(self):
        """打开管理界面"""
        self.window = Tk()
        self.window.title("快捷短语管理器")
        self.window.geometry("500x400")
        # 创建Treeview
        self.tree = ttk.Treeview(self.window, columns=('code', 'content'), show='headings')
        self.tree.heading('code', text='快捷码')
        self.tree.heading('content', text='短语内容')
        self.tree.column('code', width=100)
        self.tree.column('content', width=350)
        # 添加滚动条
        scrollbar = ttk.Scrollbar(self.window, orient=VERTICAL, command=self.tree.yview)
        self.tree.configure(yscrollcommand=scrollbar.set)
        self.tree.pack(side=LEFT, fill=BOTH, expand=True, padx=5, pady=5)
        scrollbar.pack(side=RIGHT, fill=Y)
        # 刷新数据
        self.refresh_tree()
        # 按钮
        btn_frame = Frame(self.window)
        btn_frame.pack(fill=X, padx=5, pady=5)
        Button(btn_frame, text="添加", command=self.add_phrase).pack(side=LEFT, padx=2)
        Button(btn_frame, text="编辑", command=self.edit_phrase).pack(side=LEFT, padx=2)
        Button(btn_frame, text="删除", command=self.delete_phrase).pack(side=LEFT, padx=2)
        Button(btn_frame, text="导入", command=self.import_phrases).pack(side=LEFT, padx=2)
        Button(btn_frame, text="导出", command=self.export_phrases).pack(side=LEFT, padx=2)
        Button(btn_frame, text="刷新", command=self.refresh_tree).pack(side=LEFT, padx=2)
        self.window.mainloop()
    def refresh_tree(self):
        """刷新列表"""
        for item in self.tree.get_children():
            self.tree.delete(item)
        for code, content in self.phrases.items():
            self.tree.insert('', END, values=(code, content[:50] + '...' if len(content) > 50 else content))
    def add_phrase(self):
        """添加快捷短语"""
        dialog = PhraseDialog(self.window, "添加短语")
        if dialog.result:
            code, content = dialog.result
            if code and content:
                self.phrases[code] = content
                self.save_phrases()
                self.refresh_tree()
    def edit_phrase(self):
        """编辑短语"""
        selected = self.tree.selection()
        if not selected:
            messagebox.showwarning("提示", "请先选择要编辑的短语")
            return
        code = self.tree.item(selected[0])['values'][0]
        content = self.phrases.get(code, '')
        dialog = PhraseDialog(self.window, "编辑短语", code, content)
        if dialog.result:
            new_code, new_content = dialog.result
            if new_code and new_content:
                del self.phrases[code]
                self.phrases[new_code] = new_content
                self.save_phrases()
                self.refresh_tree()
    def delete_phrase(self):
        """删除短语"""
        selected = self.tree.selection()
        if not selected:
            messagebox.showwarning("提示", "请先选择要删除的短语")
            return
        code = self.tree.item(selected[0])['values'][0]
        if messagebox.askyesno("确认", f"确定删除短语「{code}」吗?"):
            del self.phrases[code]
            self.save_phrases()
            self.refresh_tree()
    def import_phrases(self):
        """导入短语"""
        filename = filedialog.askopenfilename(
            title="选择导入文件",
            filetypes=[("JSON文件", "*.json"), ("所有文件", "*.*")]
        )
        if filename:
            try:
                with open(filename, 'r', encoding='utf-8') as f:
                    imported = json.load(f)
                self.phrases.update(imported)
                self.save_phrases()
                self.refresh_tree()
                messagebox.showinfo("成功", "导入成功!")
            except Exception as e:
                messagebox.showerror("错误", f"导入失败:{str(e)}")
    def export_phrases(self):
        """导出短语"""
        filename = filedialog.asksaveasfilename(
            title="导出短语",
            defaultextension=".json",
            filetypes=[("JSON文件", "*.json"), ("所有文件", "*.*")]
        )
        if filename:
            try:
                with open(filename, 'w', encoding='utf-8') as f:
                    json.dump(self.phrases, f, ensure_ascii=False, indent=2)
                messagebox.showinfo("成功", "导出成功!")
            except Exception as e:
                messagebox.showerror("错误", f"导出失败:{str(e)}")
class PhraseDialog:
    """短语编辑对话框"""
    def __init__(self, parent, title, code='', content=''):
        self.result = None
        self.dialog = Toplevel(parent)
        self.dialog.title(title)
        self.dialog.geometry("400x200")
        Label(self.dialog, text="快捷码:").grid(row=0, column=0, padx=5, pady=5, sticky=W)
        self.code_entry = Entry(self.dialog, width=30)
        self.code_entry.grid(row=0, column=1, padx=5, pady=5)
        self.code_entry.insert(0, code)
        Label(self.dialog, text="短语内容:").grid(row=1, column=0, padx=5, pady=5, sticky=NW)
        self.content_text = Text(self.dialog, width=30, height=5)
        self.content_text.grid(row=1, column=1, padx=5, pady=5)
        self.content_text.insert('1.0', content)
        Button(self.dialog, text="确定", command=self.ok).grid(row=2, column=0, pady=10)
        Button(self.dialog, text="取消", command=self.dialog.destroy).grid(row=2, column=1, pady=10)
        self.dialog.grab_set()
        self.dialog.wait_window()
    def ok(self):
        code = self.code_entry.get().strip()
        content = self.content_text.get('1.0', END).strip()
        if code and content:
            self.result = (code, content)
            self.dialog.destroy()
        else:
            messagebox.showwarning("提示", "快捷码和内容不能为空!")
if __name__ == "__main__":
    # 安装依赖:pip install keyboard pyperclip
    manager = PhraseManager()
    # 保持程序运行
    try:
        keyboard.wait('ctrl+shift+q')  # 按Ctrl+Shift+Q退出
    except:
        pass

Linux/Unix Bash脚本版本

#!/bin/bash
# 快捷短语管理器
# 配置文件
CONFIG_FILE="$HOME/.quick_phrases.conf"
# 默认短语
init_phrases() {
    if [[ ! -f "$CONFIG_FILE" ]]; then
        cat > "$CONFIG_FILE" << EOF
@email:your.email@example.com
@phone:138-0000-0000
@addr:北京市朝阳区xxx街道
@name:张三
@date:$(date +%Y-%m-%d)
@time:$(date +%H:%M)
EOF
    fi
}
# 加载短语
load_phrases() {
    if [[ -f "$CONFIG_FILE" ]]; then
        while IFS=: read -r code content; do
            if [[ -n "$code" && "$code" != "#"* ]]; then
                eval "PHRASE_${code#@}='$content'"
            fi
        done < "$CONFIG_FILE"
    fi
}
# 获取短语
get_phrase() {
    local code="$1"
    local var_name="PHRASE_${code#@}"
    echo "${!var_name}"
}
# 主界面
show_menu() {
    clear
    echo "======================="
    echo "    快捷短语管理器      "
    echo "======================="
    echo "1. 查看所有短语"
    echo "2. 添加短语"
    echo "3. 编辑短语"
    echo "4. 删除短语"
    echo "5. 搜索短语"
    echo "6. 导出短语"
    echo "7. 导入短语"
    echo "8. 退出"
    echo "======================="
    echo -n "请选择操作:"
    read choice
    case $choice in
        1) list_phrases ;;
        2) add_phrase ;;
        3) edit_phrase ;;
        4) delete_phrase ;;
        5) search_phrases ;;
        6) export_phrases ;;
        7) import_phrases ;;
        8) exit 0 ;;
        *) echo "无效选择" && sleep 2 && show_menu ;;
    esac
}
# 列出所有短语
list_phrases() {
    clear
    echo "所有快捷短语:"
    echo "========================"
    if [[ -f "$CONFIG_FILE" ]]; then
        awk -F: '{printf "%-20s %s\n", $1, $2}' "$CONFIG_FILE"
    fi
    echo "========================"
    echo -n "按回车键继续..."
    read
    show_menu
}
# 添加短语
add_phrase() {
    echo -n "请输入快捷码(如:@sig):"
    read code
    if [[ -z "$code" ]]; then
        echo "快捷码不能为空"
        sleep 2
        show_menu
        return
    fi
    echo -n "请输入短语内容:"
    read content
    if grep -q "^$code:" "$CONFIG_FILE" 2>/dev/null; then
        echo "快捷码已存在,请使用编辑功能"
    else
        echo "$code:$content" >> "$CONFIG_FILE"
        echo "添加成功!"
    fi
    sleep 2
    show_menu
}
# 编辑短语
edit_phrase() {
    echo -n "请输入要编辑的快捷码:"
    read code
    if grep -q "^$code:" "$CONFIG_FILE" 2>/dev/null; then
        current=$(grep "^$code:" "$CONFIG_FILE" | cut -d: -f2-)
        echo "当前内容:$current"
        echo -n "请输入新内容(直接回车保持不变):"
        read new_content
        if [[ -n "$new_content" ]]; then
            if [[ "$(uname)" == "Darwin" ]]; then
                sed -i '' "s|^$code:.*|$code:$new_content|" "$CONFIG_FILE"
            else
                sed -i "s|^$code:.*|$code:$new_content|" "$CONFIG_FILE"
            fi
            echo "更新成功!"
        fi
    else
        echo "快捷码不存在"
    fi
    sleep 2
    show_menu
}
# 删除短语
delete_phrase() {
    echo -n "请输入要删除的快捷码:"
    read code
    if grep -q "^$code:" "$CONFIG_FILE" 2>/dev/null; then
        echo -n "确认删除?(y/n):"
        read confirm
        if [[ "$confirm" == "y" || "$confirm" == "Y" ]]; then
            if [[ "$(uname)" == "Darwin" ]]; then
                sed -i '' "/^$code:/d" "$CONFIG_FILE"
            else
                sed -i "/^$code:/d" "$CONFIG_FILE"
            fi
            echo "删除成功!"
        fi
    else
        echo "快捷码不存在"
    fi
    sleep 2
    show_menu
}
# 搜索短语
search_phrases() {
    echo -n "请输入搜索关键词:"
    read keyword
    clear
    echo "搜索结果:"
    echo "========================"
    grep -i "$keyword" "$CONFIG_FILE" 2>/dev/null | awk -F: '{printf "%-20s %s\n", $1, $2}'
    echo "========================"
    echo -n "按回车键继续..."
    read
    show_menu
}
# 导出短语
export_phrases() {
    echo -n "请输入导出文件名(默认: phrases_backup.txt):"
    read filename
    filename=${filename:-phrases_backup.txt}
    cp "$CONFIG_FILE" "$filename"
    echo "导出成功:$filename"
    sleep 2
    show_menu
}
# 导入短语
import_phrases() {
    echo -n "请输入导入文件名:"
    read filename
    if [[ -f "$filename" ]]; then
        cat "$filename" >> "$CONFIG_FILE"
        echo "导入成功!"
    else
        echo "文件不存在"
    fi
    sleep 2
    show_menu
}
# 快速输入函数(需要xdotool支持)
quick_input() {
    local code="$1"
    local phrase=$(get_phrase "$code")
    if [[ -n "$phrase" ]]; then
        # 使用xdotool模拟输入(需要安装)
        if command -v xdotool &> /dev/null; then
            xdotool type "$phrase"
        else
            # 复制到剪贴板
            echo -n "$phrase" | xclip -selection clipboard
            echo "已复制到剪贴板:$phrase"
        fi
    else
        echo "快捷码 $code 不存在"
    fi
}
# 热键支持(使用xbindkeys)
setup_hotkeys() {
    cat > "$HOME/.xbindkeysrc" << EOF
# Ctrl+Shift+V 展开快捷短语
"$0 quick_input \$($0 get_last_code)"
  control+shift + v
# Ctrl+Shift+M 打开管理器
"$0 show_menu"
  control+shift + m
EOF
    # 重启xbindkeys
    pkill xbindkeys 2>/dev/null
    xbindkeys
}
# 获取最后输入的快捷码
get_last_code() {
    # 使用xclip获取剪贴板内容
    if command -v xclip &> /dev/null; then
        xclip -o -selection clipboard 2>/dev/null || echo ""
    fi
}
# 主程序
main() {
    init_phrases
    load_phrases
    case "$1" in
        "menu"|"")
            show_menu
            ;;
        "quick")
            if [[ -z "$2" ]]; then
                echo "用法:$0 quick <快捷码>"
                exit 1
            fi
            quick_input "$2"
            ;;
        "setup")
            setup_hotkeys
            echo "热键设置完成!"
            ;;
        "help")
            echo "用法:$0 [选项]"
            echo "  menu      - 打开管理器(默认)"
            echo "  quick     - 快速输入短语"
            echo "  setup     - 设置热键"
            echo "  help      - 显示帮助"
            ;;
        *)
            echo "未知选项:$1"
            echo "使用 $0 help 查看帮助"
            exit 1
            ;;
    esac
}
main "$@"

使用方法

Windows (AutoHotkey)

  1. 安装 AutoHotkey
  2. 保存脚本为 .ahk 文件并运行
  3. 使用热键:
    • Ctrl+Shift+V - 展开快捷短语
    • Ctrl+Shift+M - 打开管理界面
    • Ctrl+Shift+Q - 退出程序

Linux (Bash脚本)

  1. 保存脚本并添加执行权限
  2. 安装依赖:xdotool xclip xbindkeys
  3. 运行:./quick_phrases.sh

Python版本

  1. 安装依赖:pip install keyboard pyperclip
  2. 运行:python quick_phrases.py

这些脚本提供了完整的快捷短语管理功能,包括添加、编辑、删除、导入导出等功能,你可以根据需要调整热键和功能。

抱歉,评论功能暂时关闭!