目前查到的快捷键的优先级是: global-map ← major-mode ← minor-mode ← emulation-mode-maps ← overlay keymap. 应该 overlay keymap 是优先级最高的,当你在一个生词上时,快捷键会覆盖你的 xah-fly-keys
感谢回复,奇怪的是xah-fly-keys的优先级更高,比如 M-x dictionary-overkay-jump-next-unknown-word,它会正确地跳转到下一个不认识的词上,而且状态栏里会闪一下可以按 n 来执行;
全实际上真按 n 键时,还是由 xah-fly-keys 接手了
dictionary-overy 有自己的 mode 吗, 我按 ctrl-h m 出来的结果里似乎无:
Enabled minor modes: Auto-Composition Auto-Compression Auto-Encryption
Blink-Cursor Delete-Selection Electric-Indent File-Name-Shadow
Font-Lock Global-Eldoc Global-Font-Lock Line-Number Marginalia
Mouse-Wheel Tooltip Transient-Mark Vertico Xah-Fly-Keys
暂时用 global set key 顶上了
今日遇到的几个问题:
- 定义了一个简单的启动命令如下:
(defun dorender ()
(interactive)
(dictionary-overlay-start)
(dictionary-overlay-render-buffer))
M-x dorender 后会出现
再重复执行一次就可以了,但第一次不行不知为何(先后单独执行两个命令是不会报错的)-
想标记 don 为 known 未果,标记时状态栏只显示一个 don’ t (中间有个空格应该)
isn’t haven’t亦同 -
在一个生词上执行 M-x dictionary-overlay-lookup, 返回
dictionary-overlay-lookup: Symbol’s function definition is void: dictionary-lookup-definition
目前还缺一个对 dictionary-overlay-start 反馈处理机制,websocket-bridge-server 还没跑起来正处于closed状态,但下一条命令dictionary-overlay-render-buffer 立马就开始了,于是 render 命令发送的buffer文字就撞了南墙了。等你反应过来的时候再render一次,server 跑起来了,所以第二次就没问题了。
这方面我也是小白,想修但不会。那就两次吧
,然后等ginqi7大佬修。
stem分词内在缺陷吧?看见一次标注一次就是了。我目前 knownwords.txt 里有 210kb 的内容,已经没有这样的问题了。
(defcustom dictionary-overlay-lookup-with 'dictionary-lookup-definition
"Look up word with fn."
:group 'dictionary-overlay
:type '(function))
不知道你用的什么词典,记得你是用popweb-dict? 设个相关的值上去,比如 #'popweb-dict-youdao-pointer。
@ginqi7 大佬,这个值可能要 (require 'dictionary)?而且它需要emacs 29。记得之前也有出问题的案例?也许可以设为nil, 把相关 option 放到 docstring 里。想用的就自己设置。
开始以为没跑起来是需要等一下,加了延时也不起作用看来不是。另外准备在 macos 上复现一下,结果死活render不了了,只有linux能用两次的方法难道
还真不是,现在执行标记就是没变化(只有状态栏有字),标记不成奇怪
readme 里似乎没找到示例,有可能真是需要 dictionary (AI也说了我没信我以为它乱讲的
)
@heisaari 目前并没有自己的mode,它的快捷键只有光标在生词上时生效,快捷键是设定在 Emacs 的 overlay 上的。
你可以在 init lisp 中加上 (dictionary-overlay-start), 让它在Emacs 启动时,就开启。之后就只需要 (dictionary-overlay-render-buffer) 即可。
@zqso 确实可以加一个变量来判断dictionary-overlay 是否 ready. 今天我来加一下。
dictionary-overlay-lookup 这个默认的词典我都想去掉,似乎群众遇到的问题挺多。但我俩都不怎么用它。
增加了一个 dictionary-overlay-ready-p 方法。会在 render buffer 之前校验一下是否ready,如果没有会给出提示信息,而不是之前那样单纯报错。
去掉吧,至少目前不好用。我自己也是设为popweb-dict-youglish-pointer. 要么去掉,要么默认为nil。
我以前提交过一个PR, 可能被我删掉了,因为当时考虑到要 (sleep-for 2),可能有点儿贵:
(defun dictionary-overlay-render-buffer ()
"Render current buffer."
(interactive)
(unless (and (member "dictionary-overlay" websocket-bridge-app-list) ; <--
(boundp 'websocket-bridge-client-dictionary-overlay)) ; <--
(dictionary-overlay-start) ; <--
(message "Dictionary Overlay is launching, please wait 2 seconds.") ; <--
(sleep-for 2)) ; <-- waiting for #'dictionary-overlay-start to finish, usually 0.5~3 seconds, we set 2.
(setq-local dictionary-overlay-active-p t)
(dictionary-overlay-refresh-buffer)
(when (member 'render-buffer dictionary-overlay-auto-jump-after)
(websocket-bridge-call-buffer "jump_next_unknown_word")))
这样可以避免干等:准备好了,那就直接渲染; 如果还没有启动,那就等两秒后自动渲染。也不用再写一个predicate。
EDIT1: 先别用,测试中跑不起来,我再看一下。
还是在 README 里告知,最好把 (dictionary-overlay-start) 写在 init 里。和 Emacs 同时启动最简单。让它在Emacs启动时就默默的启动,异步的也不会卡住Emacs.
嗯。我也先不折腾了。我emacs可能有什么干扰了,
导致dictionary-overlay-start 产生不了这个symbol:
(boundp 'websocket-bridge-client-dictionary-overlay)。明天起床再 debug 了。
macos 下目前提示为(重复执行render buffer也是):
Dictionary-Overlay not ready, please wait a second.
已经update过包
linux 下在init里写入(dictionary-overlay-start)就好了,有撇号的单词标记时仍然不动作:

能否有一个 special.txt,专门放这样的非标准单词
刚刚在 emacs 里试用了下,感觉 M-x dictionary-search 是不是更方便些(少按好多下键盘
)。
当你阅读电子书时,控制焦点未必在生词上,移动控制焦点要按更多的键.
没有移动光标的焦点

mybigword针对阅读电子书提供了新方法。例如把可能的生词都列出来,然后读者把这些单词先熟悉后再一口气把书读完,阅读过程中尽量少查单词。
目前不行。当前的实现会对buffer 首先进行分词。目前的分词逻辑会把撇号,下划线,中划线之类的都当作分隔符。会分割成不同的单词。
有可能的方案是,提供一种自定义的分词方式:例如通过空格分词,其他的任何连接符连接起来的算作一个单词。
不过目前没有啥修改的动力。我感觉通常只有长难单词有提示的意义。
我希望解决的是词组一类的可以实现提示。但目前还没有什么好办法解决。
好的
另:
-
macos 下一直提示not ready 这个需要分几步执行下啥能查到是哪卡住了吗?
-
linux 下标记其他词正常工作,但标记 ’ 号前的词则直接跳过(标注其他词是正常的)。我去看了下knownwords.txt, 发现里面是有 isn’t shouldn’t 的,之后我做了个实验,stop D-O后将这两个词从knownwords 里删除掉,再回文章重新标记,发现它们确实又回到 knownwords.txt 里了,初步猜测,D-O 标记了 isn’t 这样的单词进入了 knownwords.txt, 但是在render 的时候出于分词?原因又没能正常解析?
可以运行命令:websocket-bridge-app-log-buffer 查看 python 程序的日志。如果卡住了就是 python 程序那边有问题。
添加生词是按照 Emacs (thing-at-point 'word) 进行解析的。但进行buffer 分词的时候,使用的python包分词的。两边逻辑可能不一致。
好的,linux 暂时添加如下作为临时解决方案(贴一下方便其他遇到同类问题的)有意思的是 render 完, 那个 ‘ 号是红色的且占据两个字符宽(我猜是overlay还在)

couldn
didn
doesn
hadn
hasn
haven
isn
mightn
mustn
needn
oughtn
shan
shouldn
wasn
weren
won
wouldn
可以接入chatgpt
(不完全是玩笑,因为它就是干这个起家的对吧)
macos 用命令看了下,最后(已经试过 dictionary-overlay-install 及手动安装)卡在
tokenizers/__init__.py", line 80, in <module>
from .tokenizers import (
ModuleNotFoundError: No module named 'tokenizers.tokenizers'
但是requirements.txt 里要的包都在 /usr/local/lib/python3.10/site-packages,pip install也说satisfied & pip show tokenizers 的版本也一致,咋就不行涅
请问有变宽字体推荐吗?
周末又死磕了2晚上,终于有了一点进展在macos上
一是alias 了 python 至 python3,二是pip3 install -r requirement.txt 终于跑起来了,但 render 时只 render 了三行就报错了
[Dictionary-overlay]Render buffer error. Run (websocket-bridge-app-open-buffer ’dictionary-overlay) see the error details
这个提示里的命令执行不了(没有match) 于是还是按你给的调试命令,得到
No module named 'CoreServices'
执行 pip3 install pyobjc, pip3 install packaging
终!于!跑了起来!
以上思路多亏 chatgpt 协助(我的微小工作就是在pip后面加了个3
)
update: 研究中的:
<urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:992)>
linux 和 macos 下表现各有千秋,linux 下标记不动 don’t 的 don,在 macos 下是可以的,反过来 mac 下调用修改单词释义功能无效(c)


