Typora 自动化创建跨文件跳转的 Markdown 锚点链接:Python 与 AutoHotkey 实现
在编写 Markdown 文档时,我们经常需要创建锚点链接来跳转到文档的不同部分,或者跨文件链接到其他文档的特定位置。虽然 Markdown 本身提供了基本的锚点支持,但手动创建这些链接通常比较繁琐,尤其是在多个文件之间跳转时。这篇教程将展示如何通过 Python 和 AutoHotkey 两种工具,自动化生成支持跨文件跳转的 Markdown 锚点链接,提高文档编辑和管理的效率。
·
拥有python 与 AutoHotKey都可以使用,个人推荐AutoHotKey更为方便
py代码与ahk代码在最后
- 跨文件跳转和锚点链接的概念
在 Markdown 文件中,锚点链接通常用于跳转到当前文档的某个部分,或跳转到另一个文件中的特定位置。例如:
1. 简介
在编写 Markdown 文档时,我们经常需要创建锚点链接来跳转到文档的不同部分,或者跨文件链接到其他文档的特定位置。虽然 Markdown 本身提供了基本的锚点支持,但手动创建这些链接通常比较繁琐,尤其是在多个文件之间跳转时。
这篇教程将展示如何通过 Python 和 AutoHotkey 两种工具,自动化生成支持跨文件跳转的 Markdown 锚点链接,提高文档编辑和管理的效率。
2. 目标
设置触发键都为alt+1,按下后自动将生成类似下面的链接在剪贴版中
ID是由时间生成的唯一id
锚点 <a id="20241209220339"></a>
[点击至 "3.Dart的函数与方法.md"](3.Dart的函数与方法.md#20241209220339)
我们可以使用锚点链接跳转到 “目标” 部分:
[跳转到目标](#目标)
如果需要在不同文件之间跳转,可以使用类似下面的跨文件跳转链接:
[跳转到 doc2.md 的目标部分](doc2.md#目标)
生成这些链接的过程虽然简单,但当涉及多个文件和标题时,手动创建会变得非常繁琐。
为了简化这个过程,我们可以使用脚本自动化生成。
Python代码
typora.py文件
import time
import pyperclip
import ctypes
from datetime import datetime
from ctypes.wintypes import HWND, DWORD, LPWSTR
import keyboard
# Windows API 函数
user32 = ctypes.WinDLL('user32')
GetForegroundWindow = user32.GetForegroundWindow
GetWindowTextW = user32.GetWindowTextW
GetWindowTextLengthW = user32.GetWindowTextLengthW
# 设置函数返回值类型
GetForegroundWindow.restype = HWND
GetWindowTextW.restype = DWORD
GetWindowTextW.argtypes = (HWND, LPWSTR, DWORD)
GetWindowTextLengthW.argtypes = (HWND,)
def get_active_window_title():
"""
获取当前活动窗口的标题,并去除标题中的 "• - Typora" 后缀
"""
hwnd = GetForegroundWindow()
length = GetWindowTextLengthW(hwnd) + 1 # 获取窗口标题长度
buffer = ctypes.create_unicode_buffer(length)
GetWindowTextW(hwnd, buffer, length)
title = buffer.value
# 去除以 "• - Typora" 结尾的部分
title = title.replace("• - Typora", "")
return title
def generate_id():
"""
生成基于当前时间到秒的唯一ID
"""
now = datetime.now()
return now.strftime('%Y%m%d%H%M%S')
def generate_anchor_and_links(title):
"""
根据给定的标题生成锚点和跳转链接
:param title: 标题字符串
:return: 返回一个包含锚点和链接的元组
"""
id_value = generate_id()
# 生成锚点
anchor = f'<a id="{id_value}"></a>{title}'
# 生成跳转链接
link = f'[点击跳转至 "{title}"]({title}#{id_value})'
return anchor, link
def copy_to_clipboard(text):
"""
将文本复制到剪贴板
:param text: 要复制的文本
"""
pyperclip.copy(text)
def on_trigger():
"""
监听并触发操作
当按下 Alt + 1 时,执行生成锚点和链接的操作并复制到剪贴板
"""
# 获取当前窗口的标题
title = get_active_window_title()
print(title)
# 生成锚点和链接
anchor_and_links = generate_anchor_and_links(title)
# 先复制锚点,再复制链接
copy_to_clipboard(anchor_and_links[0])
time.sleep(0.5)
copy_to_clipboard(anchor_and_links[1])
if __name__ == "__main__":
print("程序正在监听按键... 按下 Alt + 1 触发操作。")
# 使用 keyboard 库监听 Alt + 1 组合键
while True:
if keyboard.is_pressed('alt') and keyboard.is_pressed('1'):
on_trigger()
time.sleep(0.5) # 防止多次触发
利用AutoHotKey
寻找AutoHotKey,创建typora.ahk文件,按alt+1,就可以触发自动创建描点
如:
typora.ahk文件:
#Persistent ; 保持脚本一直运行
#NoEnv ; 禁用环境变量
SendMode Input ; 设置发送模式为快速输入
; 定义全局变量
windowTitle := "" ; 存储当前窗口的标题
generatedID := "" ; 存储生成的 ID
; 按下 Alt+1 时触发
!1::
; 获取当前活动窗口的标题
windowTitle := GetActiveWindowTitle()
; 去除 "• - Typora" 后缀(如果需要)
StringReplace, windowTitle, windowTitle, • - Typora, , All
; 生成唯一 ID
generatedID := GenerateUniqueID()
; 生成锚点和链接
anchor := "锚点 <a id=""" generatedID """></a>"
link := "[点击至 """ windowTitle """](" windowTitle "#" generatedID ")"
; 将结果复制到剪贴板
Clipboard := anchor "`n" link
; 显示提示
ToolTip, 锚点和链接已复制到剪贴板!
Sleep, 2000
ToolTip ; 关闭提示
Return
; 获取当前活动窗口的标题
GetActiveWindowTitle()
{
; 获取当前活动窗口的句柄
WinGetActiveTitle, activeTitle
Return activeTitle
}
; 生成唯一的 ID(基于当前时间)
GenerateUniqueID()
{
FormatTime, uniqueID,, yyyyMMddHHmmss
Return uniqueID
}
更多推荐




所有评论(0)