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

把 “词干提取” 的功能合并到主干分支了。需要添加 python 包snowballstemmer, 并没使用 nltk, snowballstemmer 更加轻量,专注与词干提取。

将生词添加到生词本或者熟词本时,同时会把提取的词干也加入其中。因此下次遇到词干相同的词语也会进行翻译,例如 city 和 cities.

由于只有新增加的单词会有效果。如果发现没有效果,需要重新添加一下某个单词,才能根据词干进行匹配。

主要的功能,基本已经都完成了。接下来就是修修补补了。欢迎大家使用,提出问题与建议。

还没有合并补丁吧?

1 个赞

网络太差,居然没有合并成功。

现在合并了。

1 个赞

大家是怎么更新的,不会像我一样笨地每次删除目录重新clone回来吧

git pull

像猫大一样用 submodule 管理插件的话,就

git submodule foreach git pull
1 个赞

可以看一下 GitHub - redguardtoo/mybigword: Use Zipf frequency of each word to extract English big words 一次生词都事先查好. 词典可自己定义.

3 个赞

蹲一个org-remark同款defface。:grin: 今天尝试自己添加,轮子造了一半,发现face是在dictionary-overlay.py里定义的?我对python不熟悉。

;; TODO 2022-11-21: test
(defface dictionary-overlay-knownwords
  '((((class color) (min-colors 88) (background light))
     :underline "#aecf90" :background "#ecf7ed")
    (((class color) (min-colors 88) (background dark))
     :underline "#00422a" :background "#001904")
    (t
     :inherit highlight))
  "Face for dictionary-overlay known words.")

;; TODO 2022-11-21: test
(defface dictionary-overlay-unknownwords
  '((((class color) (min-colors 88) (background light))
     :underline "#fb8c96" :background "#fbd8db")
    (((class color) (min-colors 88) (background dark))
     :underline "#C77577" :background "#7A696B")
    (t
     :inherit highlight))
  "Face for dictionary-overlay unknown words.")

把所有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 个赞