嗯嗯,以后key 这种东西还是要仔细想想唯一性的问题。
恩恩,等有空了改一改。
关于 “men-闷”,我猜是sdcv查询的结果。
个人觉得sdcv的质量略低,baidu翻译成知乎,zhihu翻译成百度(大概是这样子的),经常看到离谱翻译或直接拼音转化,我是不太推荐放前面。
把local/macos这种高质量词典放前面才是正解。sdcv放到后面去,web依赖网络较慢,放最后。
linux 下 sdcv 是唯一可用的 local 词典。
可以开放让用户使用自定义的 sdcv 词典,默认的这个kdic-ec-11w 可能解释排序不太智能,而我默认使用了第一个解释。
例如楼上有用户提出的 【讨论】一种提升英文阅读体验的可能性 - #236,来自 heisaari 词典,按照常用性排序的,可能比较适合 D-O 的场景。
还有 GoldenDict
这个 fork 更新比较勤,也有安装包提供。
macOS 推荐这个版本:
新拉了一个分支。尝试支持用户自定义的 StatDict 词典。增加了一个变量 dictionary-overlay-sdcv-dictionary-path
例如,我转换了 【讨论】一种提升英文阅读体验的可能性 - #236,来自 heisaari 这个词典。然后设置:
(setq dictionary-overlay-sdcv-dictionary-path
"/Users/jinqiqi/Downloads/TLD")
就可以使用这个词典了。但是:由于目前写的正则表达式的匹配有点粗暴:匹配所有的中文词语。
因此,存在如下的问题:
其中,men 的 “原型” 是man,因此直接使用了 “原型” 作为翻译 其中,pop web 是考研词汇,会展示第一个中文,考研。
如果需要支持自定义的词典,也许要开放自定义的正则表达式,让用户自己去匹配。
嗯嗯,已经定位到问题了。应该是同名 buffer 的问题导致的。当前的版本有个bug,用 buffer 名字作为唯一key来区分不同buffer的渲染内容。但如果一个buffer kill 掉,重开一个同名的buffer 就可能有问题。
dictd 实际上支持本地词典, dictd - ArchWiki
我在Debian Linux上的Emacs里使用本地词典很简单,
-
sudo apt install dictd
# install dictd -
sudo apt install dict-wn
orsudo apt install dict-gcide
# install dictionary sudo systemctl restart dictd
- 在emacs配置里添加
(setq dictionary-server "127.0.0.1")
, 可以使用M-x eval-expression ENTER (dictionary-definition "hello")
测试
关键是词典的生态,外面开放的词典基本上是 mdx 格式的, 开源的 stardict 不支持 mdx 格式,goldendict 没有命令行版本,也没有 mdx 格式到 stardict格式的转换程序。这些问题解决一个本地词典也就很好用了
这个python 程序可以进行词典转换。我试过把 mdx 词典转换为 stardict 格式,是可行的。
不过由于我用 macOS 的词典加猫哥默认的 kdic-ec-11w 基本够用了,就没去物色好用的词典。
有自己常用个人词典的人可以试试,自己转换词典。
排查了一天,才发现报错的原因,给其他小白提个醒
D-O 需要 emacs-websocket,但是
(use-package websocket; 这里名称不同太坑了
:straight (emacs-websocket
:type git
:host github
:repo "ahyatt/emacs-websocket"))
;; Example setting: alpha-version, with `straight', `use-package'
(use-package websocket
:straight (:host github :repo "ahyatt/emacs-websocket"))
(use-package websocket-bridge
:straight (:host github :repo "ginqi7/websocket-bridge")
:commands (websocket-bridge-server-start)) ; autoload it
(use-package dictionary-overlay
:straight (:host github :repo "gingi7/dictionary-overlay")
:commands (dictionary-overlay-render-buffer)
:custom-face
(dictionary-overlay-unknownword ((t :inherit font-lock-keyword-face)))
(dictionary-overlay-translation ((t :inherit font-lock-comment-face)))
:config
;; Pave the infrastructure
(require 'websocket-bridge) ; make sure it is running
(dictionary-overlay-start)
;; Customize the goodies, opinionated.
(setq
dictionary-overlay-just-unknown-words nil ; default is t, usually i prefer `nil' for long-term goal
dictionary-overlay-position 'after ; alt: 'help-echo. i switch between the two occasionally.
dictionary-overlay-translation-format "(%s)"
dictionary-overlay-user-data-directory
(locate-user-emacs-file "dictionary-overlay-data/")
dictionary-overlay-crow-engine "google" ; alt: crow
dictionary-overlay-inhibit-keymap nil ; don't touch it untill you know it
dictionary-overlay-auto-jump-after
'(mark-word-known ; recommended
;; mark-word-unknown ; not recommended
render-buffer ; opinionated, but turn it on, why not
)
dictionary-overlay-recenter-after-mark-and-jump nil ; alt: line number, e.g., 10, at eye-level
dictionary-overlay-translators '("local" "darwin" "sdcv" "web") ; darwin has better quality than sdcv, also google translation has quota limit, dont over use it, or will be blocked.
)
;; Advanced features
(setq dictionary-overlay-lookup-with 'dictionary-lookup-definition) ; advanced, since it might go wrong
(setq dictionary-overlay-sdcv-dictionary-path nil) ; TODO
:bind
("C-c d" . dictionary-overlay-render-buffer)
(:map dictionary-overlay-map
("d" . dictionary-overlay-lookup)
("r" . dictionary-overlay-refresh-buffer)
("p" . dictionary-overlay-jump-prev-unknown-word)
("n" . dictionary-overlay-jump-next-unknown-word)
("<" . dictionary-overlay-jump-first-unknown-word)
(">" . dictionary-overlay-jump-last-unknown-word)
("m" . dictionary-overlay-mark-word-smart)
("M" . dictionary-overlay-mark-word-smart-reversely)
("c" . dictionary-overlay-modify-translation)
("<escape>" . dictionary-overlay-jump-out-of-overlay)))
python 依赖的安装:
M-x dictionary-overlay-install RET
M-x dictionary-overlay-install-google-translate RET
学到了,原来里面的名字和type都可以省略
btw: 像 popweb 可以如上安装上,但它的 dict 不行,因此写成这样
;;popweb
(use-package popweb
:straight (:host github :repo "manateelazycat/popweb"))
(use-package popweb-dict
:load-path "straight/repos/popweb/extension/dict")
我是没太搞懂如何写到一起,但是这样也能跑
btw:关于“粘”的问题,可不可以让 D-O 定时 render ,比如3分钟一次,再定义个快捷键用于中间手动刷新,是不是能改善?另外它对比词表时不知是不是要对比整个文章,如果对比的是屏显内容的话应该快一些
请问 macos 词典是怎么用的可以分享下吗,个人有限经验(也许是因为不会搞)
mac上词典似乎不好用,字很小,格式也不好
我就用mac 默认的词典。没有进行过多的配置。日常查询单词详情还是emacs youdao-dictionary.
mac上词典就只用来 dictionary-overlay 展示基础释义。
呃,遇到新问题,执行了一下 C-c d 来 render buffer
[WebsocketBridge] Server has start.
websocket-send: Cannot send message to a closed websocket: #s(websocket-frame text "[\"data\",[\"render\",\"Fuck, I fancy my flatmate.\\nAnd we're gonna find\\nthe Johnny White\\nand等等很长
另外 dictionary-overlay-install
ERROR: Could not open requirements file: [Errno 2] No such file or directory: '/Users/someone/.emacs.d/straight/build/dictionary-overlay/requirements.txt'
去看了下 build 目录下的d-o目录,里面只有一个dictionary-overlay.el文件,而 repos 目录下是全的(手动执行了一下pip install -r requirement.txt 显示都安装了倒是)
最近不用straight了,靠着记忆写了一下多层文件夹的straight写法,引入 :files 机制,告诉straight, 我build 这些文件:
(use-package popweb
:straight (:host github :repo "manateelazycat/popweb"
:files (:defaults
("*.el"
"extension/dict"
;; "extension/latex"
;; "extension/org-roam"
;; "extension/url-preview"
))))
关于手感延迟的问题,需要重写底层py了。
这个比较迷,我也经常遇到,主要原因3种:
- d-o server 没打开,手动打开一下。
- 手速过快,上面的server还没准备就开始render。中间准备过程以我的老电脑来看,<1s
- 本地 dictionary-overlay.json 坏了。比如emacs 崩溃导致的 json文件末尾缺胳膊少腿
解决方法:
- 用 dictionary-overlay-restart, 耗时预计1s,请等待
- 看看json文件是不是完整的
- 重启emacs
再不行就听天由命了,有时候我也排查不出来什么,但切换到以前能工作的commit就好。
没看明白这里要讲的问题