自訂 plink 自訂協議

使用各種筆記軟體時,最後遇到的一個困擾就是 本地端檔案要怎麼連結。最簡單的方式當然是把檔案丟到雲端服務,然後取得連結即可。然而,有些資料你就是不想放到網路上:一方面為了保密,另一方面也不打算跨裝置或多人共用。



本地端檔案連結的問題

在本地端,你可以把檔案路徑用瀏覽器開啟,例如 D:\ 就會變成 file:///D:/,但是點擊時通常會被瀏覽器當成下載,因為瀏覽器對你電腦裡的檔案路徑沒有完整權限。

如果你用過 Obsidian、Logseq 或 Eagle,會發現它們有專屬的協議,例如 Eagle:\\ 開頭的自訂協議。這種方式很好,正是我需要的,我自己也打算建立一個,命名為 plink

plink 的實現思路

實際上,要讓本地端自訂協議正常運作,需要分成幾個步驟:

  1. 註冊協定:讓 Windows 認識 plink:// 這個協議。

  2. 指定程式處理:Windows 需要知道點擊這個協議時,用哪個程式打開。

  3. 生成 plink 連結:將本地檔案路徑轉換成 plink 格式。


生成 plink 的程式示例

這個程式把剪貼簿中的檔案路徑轉換成 plink:// 連結:

import pyperclip
import urllib.parse

def convert_path_to_plink():
# 取得剪貼簿中的內容
clipboard_content = pyperclip.paste()

# 去除前後雙引號
clipboard_content = clipboard_content.strip('"')

# 將空白轉換為 %20
clipboard_content = clipboard_content.replace(' ', '%20')

# 將反斜線 \ 轉換為 /
clipboard_content = clipboard_content.replace('\\', '/')

# 添加 plink:// 前綴
plink_url = "plink://" + clipboard_content

# 複製轉換後的結果回剪貼簿
pyperclip.copy(plink_url)

print(f"轉換後的 plink 網址:{plink_url}")

# 呼叫轉換函數
convert_path_to_plink()

這樣,你就可以把任何本地檔案路徑轉成 plink 連結,方便在筆記或文件中使用。


plink 連結的解析與開啟

接下來需要一個程式負責解析 plink 並開啟對應的檔案或資料夾,例如 plink_protocol.py

import os
import sys
import urllib.parse

def open_path_from_plink(url):
# 移除 plink:// 協議前綴
if url.startswith("plink://"):
url = url[len("plink://"):]

# 解碼 URL 中的編碼字符(如 %20)
path = urllib.parse.unquote(url)

# 提取磁碟機代號,例如 C:
drive_letter = path.split('/')[0] # 假設磁碟機代號和路徑分隔符是 /
path_rest = path[len(drive_letter):] # 取得剩餘部分

# 構建完整的 Windows 路徑
full_path = drive_letter + ":" + path_rest.replace('/', '\\')

# 修正可能出現的 '::' 問題
full_path = full_path.replace('::', ':')

# 移除路徑兩端的雙引號(如果有)
if full_path.startswith('"') and full_path.endswith('"'):
full_path = full_path[1:-1]

print(f"Opening path: {full_path}")

# 檢查路徑是否存在
if os.path.exists(full_path):
if os.path.isdir(full_path):
os.startfile(full_path)
elif os.path.isfile(full_path):
os.startfile(full_path)
else:
print(f"無法識別的路徑類型:{full_path}")
else:
print(f"路徑不存在:{full_path}")

# 主程式
if __name__ == "__main__":
if len(sys.argv) > 1:
open_path_from_plink(sys.argv[1])
else:
print("未提供任何路徑。")

這樣,當使用者點擊 plink 連結時,程式會解析路徑並自動打開對應的檔案或資料夾。


註冊 plink 協定

最後,需要在 Windows 註冊表中註冊 plink:// 協定,指向你的 Python 程式:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\plink]
@="URL:Plink Protocol"
"URL Protocol"=""

[HKEY_CLASSES_ROOT\plink\shell]

[HKEY_CLASSES_ROOT\plink\shell\open]

[HKEY_CLASSES_ROOT\plink\shell\open\command]
@="\"C:\\Users\\bill\\AppData\\Local\\Programs\\Python\\Python312\\python.exe\" \"D:\\plink_protocol.py\" \"%1\""

這樣設定完成後:

  • 點擊 plink:// 開頭的連結,Windows 會自動呼叫 plink_protocol.py

  • 程式會解析連結,找到對應的檔案或資料夾並打開。

  • 完全不需要上傳到雲端,也能在本地筆記軟體中使用。

About the author

陳小泉
喜愛用文字說明自己眼中所見的一切

張貼留言