【讨论】一种提升英文阅读体验的可能性

把所有python 的异常都catch 了,详细的错误信息就打印在 python 进程的buffer 里,然后给emacs 发一个消息,提示用户排查问题。

我来试试看。

方案可行。只是应该只支持 unknown words

known words 本身没有加 overlay 也没地方加 face

我准备添加一个 face 的变量,默认为空。不干扰任何阅读。如果有需求,自己定义 face 的值,README 给一个参考。

2 个赞

推荐个小设置:(setq x-underline-at-descent-line t) , 值为 t 时underline与背景底部平齐, 值为nil就是你图里展示的样子, 看以下两种设置的对比,注意字母 g 和 y:

image image

1 个赞

每次mark完词后的 dictionary-overlay-refresh-buffer 耗时略长,更新的瞬间也影响阅读,所以我今天有个想法是执行 dictionary-overlay-mark-word-(un)known 时,只更新当前词的 face,比如浅红转浅绿,而不是 rerender 整个 buffer,想要整个 buffer 的话就手动执行 dictionary-overlay-refresh-buffer

简单写了下,结果发现参数控制在dictionary-overlay.py,我能力有限,就放弃了。以下是一些小碎片:

(defcustom dictionary-overlay-refresh-buffer-after-mark-word nil
  "Refresh buffer or not after mark word as known or unknown.
Since rerendering buffer overlay while looking up words in
background takes relatively long time, One can refresh buffer manually with
`dictionary-overlay-refresh-buffer'.
TODO: Or rather, switching different overlay between known and unknown
status?"
  :group 'dictionary-overlay
  :type 'boolean)

;; make refresh buffer command interactively
(defun dictionary-overlay-refresh-buffer ()
  "Refresh current buffer."
  (interactive)
  (when dictionary-overlay-active-p
    (remove-overlays)
    (websocket-bridge-call-buffer "render")))

(defun dictionary-overlay-mark-word-known ()
  "Mark current word known."
  (interactive)
  (websocket-bridge-call-word "mark_word_known")
  (when dictionary-overlay-refresh-buffer-after-mark-word
    (dictionary-overlay-refresh-buffer)))

(defun dictionary-overlay-mark-word-unknown ()
  "Mark current word unknown."
  (interactive)
  (websocket-bridge-call-word "mark_word_unknown")
  (when dictionary-overlay-refresh-buffer-after-mark-word
    (dictionary-overlay-refresh-buffer)))

嗯嗯,我来看看。其实是偷懒,就每次都render 整个buffer 了。当单词比较多的时候,闪烁会比较明显。

1 个赞

添加一个 face 的变量,已经加上了。可以更新一下代码试试。 在你的配置项里,设置更新 dictionary-overlay-unknownwords-face 的值即可。

1 个赞

感谢大佬,已经用上了。

帮助中说是除了支持google-translate,还支持Crow Translate,可是没找到怎么配置Crow Translate啊?我查了代码里也没有,是不是不支持了? google-tranlate被墙了,或者能不能换一个在线的词典?

谢谢;

对了,defface 不要以 -face 结尾,去掉就好了。

(defface dictionary-overlay-unknownwords nil
  "Face for dictionary-overlay unknown words."
  :group 'dictionary-overlay)

参考:

crow 直接官网安装之后,如果你可以使用 crow 的命令行,那么就可以直接使用了。

嗯嗯,晚点我改改。

何不将显示相关的功能全交给 Emacs 来定制,同时包里提供默认实现,后面可以提交更多的实现。

如下所示:

dictionary-overlay.el 添加:

(defun dictionary-add-overlay (begin end source target)
  "Add a overlay with range BEGIN to END for the translation SOURCE to TARGET."
  (let ((ov (make-overlay begin end)))
    (overlay-put ov 'display source)
    (overlay-put ov 'face 'font-lock-keyword-face))
  (let ((ov (make-overlay end (+ end 1))))
    (overlay-put ov 'display (format "(%s)" target))
    (overlay-put ov 'face 'font-lock-comment-face)))
(defvar dictionary-add-overlay-function #'dictionary-add-overlay "Add overlay function.")

dictionary-overlay.py 修改:

async def render_word(token, chinese):
    word = token[0]
    begin = token[1][0] + 1
    end = token[1][1] + 1
    cmd = '(funcall dictionary-add-overlay-function {begin} {end} "{source}" "{target}")'.format(
        begin=begin, end=end, source=word, target=chinese
    )
    await run_and_log(cmd)
1 个赞

更新后遇到的问题: 标生词时

if: Cannot send message to a closed websocket: #s(websocket-frame text "[\"data\",[\"mark_word_unknown\",\"psychiatrist\"]]" nil t)

另外,你们比较顺手的快捷键定义可以发一下吗

有道理,mark,有空改一改。

dictionary-overlay-restart 重启 dictionary-overlay 试试看。

这个 font-lock-keyword-face / font-lock-comment-face合用的显示效果真是太好了!

image

另外:括号后面能加上一个空格显示效果就完美了。

10分钟后的更新:后面加了个空格,测试了下,可以了。

(overlay-put ov 'display (format "(%s) " target))

image

请问怎么设置才能让 dictionary-overlay 在打开 Emacs 时就启动啊?现在每次打开 Emacs 就要手动 start 一下,启动之后还需要手动 render buffer。

还有一个问题就是如果本地词典没有查询到的话,添加生词和熟词都失效了,overlay 也消失了。可不可以把 face 的优先级提高到查词前面啊,这样就不会导致 overlay 失败了。

以 face 为基准的话,就不需要本地词典和网络词典的强依赖了,避免本地词典词汇量不足和网络词典不可用的情况。

谢谢

另,今天标生词时还遇到了如下错(出来一个buffer提示,但不影响使用):

Error (websocket): in callback `on-message': End of file while parsing JSON: "unexpected token near end of file", "<string>", 1, 0, 0 Disable showing Disable logging
Error (websocket): in callback `on-message': could not parse JSON stream: "unable to decode byte 0xf7", "<string>", 1, 0, 0 Disable showing Disable logging

还有目前只能标生词,不能标词组对吧,比如 double up 这样的, sdcv能查到,但无法标入生词

这是网络的问题吧,查网络单词挂了。