过年有时间,折腾了好几天 sdcv ,目的是想在 windows 上用 ecdict
未果,困难重重。论坛的贴子,搜索引擎的文章,能看的都看了,还是败下阵来,发个贴看看有没有人解决成功过
环境 : windows 11
一通浏览下来,这篇 blog 比较接近目的:
但是文中的编译好的 sdcv 的链接已经失效,所以我尝试着按网上的文章在 cygwin 下编译,非常不顺利,各种包安装重试了N回,就是通不过
然后没办法又找到了一个 msys2 下已经编译好的 sdcv 版本
https://packages.msys2.org/base/mingw-w64-sdcv
这回 windows cmd 能跑了,但是输出时中文释义都是空的,类似
Enter word or phrase: test
Found 1 items, similar to test.
–>€
–>test
*[test] -K5
n. , , , €, €,
vt. , ,
vi. ,
[€] tested, testing, tests
( 575/627)
ecdict 也放到 .startdic/dic 目录下了
有这么4个文件
stardict-ecdict-2.4.2.dict
stardict-ecdict-2.4.2.idx
stardict-ecdict-2.4.2.idx.oft
stardict-ecdict-2.4.2.ifo
但是 sdcv -l 列出的结果是个空行
脑子有点不转了,请指教
问题:
1、 有没有不借助 cygwin msys2 就能原生在 windows 下运行的 sdcv
理论它是 c++ 写的? 那为什么没见到直接在 windows 下编译的例子呢
2、sdcv 直接指定查询字典的目录的语法是怎样的,按 help 里 = 号后跟个目录没成功
3、sdcv.el 能直接去读取查询 stardict 的词典库吗,这样就能跳过 sdcv 编译的问题,看这个贴子的意思是可以?
4、paw.el 应用到了 ecdict 的 sql 库,要是有高手能写一个直接查询 ecdict sql库的插件就好了,返回查词结果
感谢大佬指路
又折腾了一天,终于在假期末尾用上了
设置了朗道和ecdict,朗道查不到词时没反馈(经常查不到),查到时它的弹窗也不好看(如图),还会报个错
uncompressing langdao-ec-gb.dict.dz...done
You can’t save this buffer because compression program is not defined
因此我用了两下就不用了,只用 ecdict
谢谢!节前论坛有人问过年玩什么,别人不知道,我是就干了这么一件事儿 
弹窗可以改用别的插件的.我因为一直在terminal下用emacs.所以用了个对terminal支持比较好的弹窗.
以下代码你把最后一行(popup-tip def)
改成用其他弹窗就可以了,
(defun my-dict-simple-definition ()
"Show dictionary lookup in popup."
(interactive)
(let* ((word (my-dict-prompt-input))
(def (my-dict-search-detail word my-dict-simple my-dict-simple-cache)))
(when def
(popup-tip def))))
感谢感谢,搜索时有点不得要领,问了ai 说
popup.el:这是一个简单的弹窗库,提供了基本的弹窗功能,适用于菜单、提示和选择等场景。
helm:虽然 Helm 主要是一个增强的选择和搜索框,但它也提供了弹窗功能,可以在弹窗中显示候选项并进行选择。
ivy:类似于 Helm,Ivy 是一个用于增强选择和搜索的框架,提供了弹窗式的界面,用户可以在其中快速选择。
company-mode:这是一个用于代码补全的包,提供了弹窗式的补全建议,适用于多种编程语言。
which-key:这个包在你按下键盘组合时会弹出一个窗口,显示可用的键绑定,帮助用户记忆和使用快捷键。
popup-echo:这是一个简单的弹窗库,专注于在回显区域显示信息
看介绍第1个应该就是这个popup吧,反而其他的用于选择或补全的,popup-echo没在melpa看到,不知是不是AI编的 
能想到的是懒猫的popweb,但似乎它是弹出网页的,这种纯字符的结果不知如何设置
BTW:大佬的 mybigword 好用 
update: 找到一个有希望的
也许posframe? 我没用过,不过reddit上很多人用.
嗯嗯,这个我也搜索到了,然后显示也挺好,就是有个问题,不知道怎么退出这个弹窗,研究中
(defvar my-dict-posframe-buffer " *Dictionary Definition*"
"Buffer name for displaying dictionary definitions in posframe.")
(defun my-dict-simple-definition ()
"Show dictionary lookup in posframe."
(interactive)
(let* ((word (my-dict-prompt-input))
(def (my-dict-search-detail word my-dict-simple my-dict-simple-cache)))
(when def
(with-current-buffer (get-buffer-create my-dict-posframe-buffer)
(erase-buffer) ;; 清空缓冲区
(insert def)) ;; 插入定义内容
(when (posframe-workable-p)
(posframe-show my-dict-posframe-buffer
:position (point)
:font "Monospace-18"
)))))
gpt改了几轮都是按q退出时,q输入到原buffer了,而不是在弹窗处响应,搜索办法中
update: 没搞定,直接设置了快捷键来执行 posframe-delete-all 临时解决,我再去看看 ppper
goldendict 我一般会在单独查词的时候,对比不同释义选用时用,但似乎脱离了 emacs
感谢指路 Siverdict ,这个估计能用 popweb 或 EAF 集成起来,对我也是个大工程,不过已经有希望,谢谢
可以同时拥有。 以下配置,没有经过全平台测试,仅供参考。
- Godendict
使用它的popup 窗口。
Godendict 配置
;;(global-set-key (kbd "C-c g") 'goldendict-popup)
(require 'subr+)
(defun goldendict-popup ()
"query goldendict popup thing"
(interactive)
(let (content-str)
(cond ((use-region-p)
;;(setq content-str (buffer-substring-no-properties (region-beginning) (region-end))))
(setq content-str (buffer-substring-of-visible (region-beginning) (region-end))))
((pdf-view-active-region-p)
(setq content-str (mapconcat 'identity (pdf-view-active-region-text) "")))
(t
(let ((bds (bounds-of-thing-at-point 'symbol)))
(if bds
(setq content-str (buffer-substring-no-properties (car bds) (cdr bds)))
)
)
))
(if content-str
(let ((exe-path
(if (eq window-system 'ns)
"/Applications/GoldenDict.app/Contents/MacOS/GoldenDict "
"goldendict ")
))
(start-process-shell-command
"goldendict-popup" nil
(concat exe-path content-str)))
(message "No Word at that point"))
))
- Silverdict
使用 posframe, 窗口大小,自己调整下吧。
Silverdict 配置
;;(global-set-key (kbd "C-c h") 'eli/silverdict-pop-posframe-toggle)
(defvar silverdict--frame nil)
(defcustom silver-dict-scale 1
"silver dict buffer sacle"
:type 'number
:group 'silver-dict)
(defun eli/silverdict-pop-posframe-toggle (&optional word)
"Toggle silverdict in child frame."
(interactive)
(let ((search-word (or word (if (region-active-p)
(buffer-substring-of-visible (region-beginning)
(region-end))
(buffer-substring-of-visible (point)
(1+ (point)))
))))
(unless (and silverdict--frame
(frame-live-p silverdict--frame))
(let ((width (max 300 (round (* (frame-width) 0.8))))
(height (round (* (frame-height) 0.8))))
(setq silverdict--frame
(posframe-show
"*silverdict*"
:poshandler #'posframe-poshandler-frame-center
:hidehandler nil
:left-fringe 8
:right-fringe 8
:width width
:height height
:min-width width
:min-height height
:border-width 2
:border-color "light gray"
;; :background-color (face-background 'tooltip nil t)
:override-parameters '((cursor-type . t))
:accept-focus t))
(with-current-buffer "*silverdict*"
(setq-local cursor-type 'box)
(read-only-mode)
(keymap-local-set (kbd "g") #'posframe-hide-all)
(keymap-local-set (kbd "q") #'posframe-hide-all)
)))
(eli/silverdict--query search-word))
(select-frame-set-input-focus silverdict--frame))
(defun eli/silverdict--query (word)
(let ((buffer (url-retrieve-synchronously
(url-encode-url
(concat
"http://127.0.0.1:2628/api/query/"
"Default Group"
"/"
word))
t))
(inhibit-read-only t)
dom)
(with-current-buffer buffer
(goto-char (point-min))
(search-forward-regexp "^$")
(setq dom (libxml-parse-html-region (point))))
(with-current-buffer (get-buffer-create "*silverdict*")
(make-local-variable 'text-scale-mode-amount)
(setq text-scale-mode-amount silver-dict-scale)
(text-scale-mode)
(erase-buffer)
(shr-insert-document dom)
(newline)
)))
太强了,感谢感谢,这就拜读(估计得读一段时间回来我再更新)
update:
借了大佬的 goldendict 配置,已另发帖感谢
popup popon posframe 都可以,posframe-show 有 :timeout 参数,应该可以自动退出,也可以调用 posframe-hide 函数来解决。一般不建议用 posframe-delete,因为重建 posframe 速度很慢。
感谢,我去试试这几个,posframe 我没找到方法做到:弹出释义窗口后响应q键退出,感觉是个焦点问题?