拥有python 与 AutoHotKey都可以使用,个人推荐AutoHotKey更为方便
py代码与ahk代码在最后

  1. 跨文件跳转和锚点链接的概念
    在 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
}

Logo

一站式 AI 云服务平台

更多推荐