本文目录导读:

基于热键的快捷输入脚本(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)
- 安装 AutoHotkey
- 保存脚本为
.ahk文件并运行 - 使用热键:
Ctrl+Shift+V- 展开快捷短语Ctrl+Shift+M- 打开管理界面Ctrl+Shift+Q- 退出程序
Linux (Bash脚本)
- 保存脚本并添加执行权限
- 安装依赖:
xdotool xclip xbindkeys - 运行:
./quick_phrases.sh
Python版本
- 安装依赖:
pip install keyboard pyperclip - 运行:
python quick_phrases.py
这些脚本提供了完整的快捷短语管理功能,包括添加、编辑、删除、导入导出等功能,你可以根据需要调整热键和功能。