A config/pkg-dictionary.el => config/pkg-dictionary.el +66 -0
@@ 0,0 1,66 @@
+;;; pkg-dictionary.el --- Offline dictionary (sdcv + StarDict + GoldenDict) -*- lexical-binding: t -*-
+
+;;; Code:
+
+;; 依赖:posframe(浮动提示框)
+(unless (package-installed-p 'posframe)
+ (package-refresh-contents)
+ (package-install 'posframe))
+
+;; 自动检测 ~/.stardict/dic/ 下所有词典
+(defun my/sdcv-detect-dictionaries ()
+ "扫描 `~/.stardict/dic/' 下所有 .ifo 文件,提取 bookname,返回词典名列表。"
+ (let ((dic-dir (expand-file-name "~/.stardict/dic"))
+ (names '()))
+ (when (file-directory-p dic-dir)
+ (dolist (ifo-file (directory-files-recursively dic-dir "\\.ifo$"))
+ (with-temp-buffer
+ (insert-file-contents ifo-file)
+ (when (re-search-forward "^bookname=\\(.+\\)$" nil t)
+ (push (match-string 1) names)))))
+ (nreverse names)))
+
+;; 加载 sdcv(从 site-lisp/sdcv/)
+(let ((sdcv-path (expand-file-name "site-lisp/sdcv" user-emacs-directory)))
+ (if (file-directory-p sdcv-path)
+ (progn
+ (add-to-list 'load-path sdcv-path)
+ (require 'sdcv)
+ (setq sdcv-dictionary-data-dir (expand-file-name "~/.stardict/dic"))
+ (let ((dicts (my/sdcv-detect-dictionaries)))
+ (if dicts
+ (progn
+ (setq sdcv-dictionary-simple-list dicts)
+ (setq sdcv-dictionary-complete-list dicts))
+ (setq sdcv-dictionary-simple-list '("简明英汉字典增强版"))
+ (setq sdcv-dictionary-complete-list '("简明英汉字典增强版"))))
+ (setq sdcv-tooltip-timeout 5))
+ (message "pkg-dictionary: sdcv not found in site-lisp/sdcv, skipping. Run: git clone https://github.com/manateelazycat/sdcv.git ~/.emacs.d/site-lisp/sdcv")))
+
+;; GoldenDict 集成
+(defun my/goldendict-search-at-point ()
+ "取光标处单词,调用 GoldenDict 查询。"
+ (interactive)
+ (let ((word (thing-at-point 'word t)))
+ (if word
+ (start-process "goldendict" nil "goldendict" word)
+ (message "No word at point"))))
+
+(defun my/goldendict-search-input ()
+ "手动输入单词,调用 GoldenDict 查询。"
+ (interactive)
+ (let ((word (read-string "GoldenDict: ")))
+ (unless (string-empty-p word)
+ (start-process "goldendict" nil "goldendict" word))))
+
+;; 手动触发词典转换
+(defun my/convert-dictionaries ()
+ "调用 convert-dictionaries.sh 转换 mdx 词典为 StarDict 格式。"
+ (interactive)
+ (let ((script (expand-file-name "~/.local/bin/convert-dictionaries.sh")))
+ (if (file-executable-p script)
+ (async-shell-command script "*dict-convert*")
+ (message "Conversion script not found: %s" script))))
+
+(provide 'pkg-dictionary)
+;;; pkg-dictionary.el ends here