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

找到了,看了下crow这个默认的还是使用google翻译引擎。能不能做一个可配置项?我试了下好像只有lingva这个引擎是可以用的,其他好像都用不了了。 谢谢;

大佬,提个 pr 更新一下?

render buffer 的时候会自动启动。

词组确实是不支持,并且由于分词的问题,wake-up 这种用连接在一起的单词也不行。渲染前,会先把这个buffer 分词。

这个可以有。

哈哈是 @tangxinfa 大佬的代码,你喊他提一下PR。

另外不知道 @tangxinfa 能不能顺便把 font-lock-comment/keyword-face 做成 defface,允许自定义。

大佬,提个pr吧?

@ginqi7 关于这条 (左为生词本,右为 buffer),我不是很理解,为啥hospital 已经在熟词本了,它还会被显示一遍。难道本体是hospita 而不是hospital?

补充:我开启的是透析模式。

直接再运行命令添加一次数熟词本。

stemmer 算法并不是正确的还原一个单词。而是利用一个既定的算法,提取单词的“主干”,因此 stemmer 的结果并不一定是一个单词。

1 个赞

嗯嗯,感谢解答!

我之前的做法是从导入了一个四六级单词库8000词,以为这些词不会再被显示了,但结果是很多简单词一直被显示,我就很疑惑是不是我哪儿出错了。

看来还是要使用你的方法作为起点了:先使用生词本,然后连续使用mark-buffer-known 一段时间,再开启透析模式。

更新:重新建立了空白的 knownwords.txt 和 unknownwords.txt,mark词之后,确实不一定是词。

导入词库的话,估计要使用 python 脚本,处理一下。你可以看看 snowballstemmer · PyPI 的使用。用它生成一下 sterm 也加入到词库里。

我看看,多谢提醒。

更新1:@ginqi7 我看了一下,没头绪。请教一下我现在手头有8千词汇 knownwords.txt, 应该怎么用snowballstemmer 处理?

更新2:

import snowballstemmer

stemmer = snowballstemmer.stemmer('english');
print(stemmer.stemWords("We are the world".split()));

不知道怎么把"We are the world"替代成 ~/.config/.emacs.d/dictionary-overlay-data/knownwords.txt 里的内容

更新3: 解决一半。

import snowballstemmer

f = open("/Users/z/Dropbox/Apps/Emacs/dictionary-overlay-data/unknownwords.txt")
stemmer = snowballstemmer.stemmer('english');
print(stemmer.stemWords(f.read().split()));

得到结果, 不过还得个整成大佬库里一行一行且没有标点符号的样式。继续学习。

['patriot', 'fit', 'palat', 'partisan', 'cultiv', 'fit', 'decri', 'caricatur', 'disson', 'indoctrin', 'grumpi', 'affluent', 'overrun', 'infus', 'anthem', 'vitriol', 'bust', 'tyranni', 'shambol', 'mantra', 'shambol', 'indoctrin', 'vacat', 'recoil', 'grumpi', 'fallout', 'disson', 'jargon', 'treason']

按照大佬说的,进行一些修改。

把“单词”和“解释”区分开了。分别控制。 并设定了两个face dictionary-overlay-unknownword dictionary-overlay-translation 用户自己定义。

并且翻译的格式,也提供了变量:dictionary-overlay-translation-format 用户也可以自己控制。

face dictionary-overlay-unknownword 如果用户不自行定义,那么不会给单词加上overlay, 只会新增翻译的 overlay. 这样的好处是,当你在单词上移动时,仍旧按照字母移动,而不是按照overlay 移动。

大佬有时间的话,麻烦看看这样是否合理。代码是否需要修正。

1 个赞

大佬提供的这两个 face 看起来也相当的合适。

生词增强显示,解义淡色,不影响阅读。nice

2 个赞

对,很喜欢 @tangxinfa 的方案。走的是系统级的font-lock-keyword-face和font-lock-comment-face, 如果换主题,也会跟着相应更改新主题的配色。

应该不是,同时查了其他词没有弹出这个提示

我再观察下

刚才又遇到一例(也是同时标其他没问题)

Error (websocket): in callback `on-message': could not parse JSON stream: "invalid token near ''", "<string>", 1, 1, 1 Disable showing Disable logging

今天更新了最新版本的dictionary-overlay和websocket-bridge,每次运行mark-word-unknown时,都报错:[WebsocketBridge] Application dictionary-overlay has exited. Message buffer里没有更多的信息了。昨天的版本还可以正常运行,是不是更新啥出错了? 我的环境:emacs 29.0.50@win10;python 3.9

应该是 dictionary-overlay 没有启动。之前的版本 mark-word-unknown 会自动启动。后来因为这样会有干扰。

需要提前运行 dictionary-overlay-start

你可以把 (dictionary-overlay-start) 启动放到配置文件中,随加载启动。

新增了一个分支,crow 支持切换引擎。

你可以通过变量设置不同的引擎:

(setq dictionary-overlay-crow-engine "google")

由于我是 mac 平台没法测试 crow,你如果试用可行的话,我就合并到主干。

(defun dictionary-add-overlay-from (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 'dictionary-overlay-unknownword))
  (let ((ov (make-overlay end (+ end 1))))
    (overlay-put ov 'display (concat (format dictionary-overlay-translation-format target) (string (char-after end))))
    (overlay-put ov 'face 'dictionary-overlay-translation)))

只要不给source 加 display 的property, 就不会影响移动性,如下图。大佬测试一下。

image