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

对呢。陷入思维陷进了。我以为加了 overlay 移动都会变化。我改改。感谢大佬。

(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)
    (overlay-put ov 'after-string (concat (format dictionary-overlay-translation-format target)))))

发现 'before-string 和 'after-string 也很好用。

nice,大佬测试出了更多好用的展示方式。我等会试试。

大佬也可以参与进行,试试看把你认为好的修改提一下 pr,大家一起共同维护。

1 个赞

试了一下,crow虽然声明在命令行中也可以用,但我在win10的命令行中尝试没成功,除了-v和-h选项可以用外,其他的好像都没有反应,也不知道是不是我的格式有问题,但也没有报错。而且即使用-v和-h,也是弹出窗口式的。不知道是不是crow在windows下不能用命令行。窗口中用lingva引擎确实没问题;

国内很多翻译引擎都不太好用了,我现在常用的还是有道的翻译,在emacs elpa中有个包叫做fanyi(https://github.com/condy0919/fanyi.el)可以定制翻译的引擎,有道引擎一直还是挺稳定的。是不是可以考虑引用这个包作为网络翻译选项?毕竟google翻译已经没办法用了;

python下当时也是因为google不能用了,我从网上找过一个翻译的包,自己改了改,用里面的有道翻译,现在用着也还行。如果需要,我发给你。

谢谢;

display使光标无法进入词块的特性专有名词应该是’intangible

‘before-string 和‘after-string的内容是以display的方式显示的,也没法修改。

核心靠你了。我偶尔小修小补,顺便学习一下python。

我感觉用 after-string 更合适。但能够给添加的这个“after-string” 也加一个face或者text-properties吗?目前我没有找到方法。

我刚才没提after-sting是因为我还没想明白怎么给它加face :rofl:

@ginqi7

快试试这个:

(setq tooltip-delay 0)
(setq tooltip-short-delay 0)

(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 'face 'dictionary-overlay-unknownword)
    (overlay-put ov 'help-echo (concat (format dictionary-overlay-translation-format target)))))

说明:

  1. 可以把所有释义都扔进help-echo里,而不只是一个简短释义。
  2. 可以保存原本 buffer 结构完整,没有插入任何东西。除非 face 给原本的词加face, 但不加face怎么知道这儿有个生词呢。尽量不使用bold这种可能会改变宽度的face就好了。比如下划线,或者单纯加颜色
  3. 给 tooptip 的各种delay设为0, buffer 渲染一遍后,显示速度快到发抖。

不过以后包成熟了应该可以开个 dictionary-overlay-mode 的 minor-mode, 把 tooptip 相关的值包进去。

想法: 可以开放一个选项 (defcustom):

  1. word(translation) 比如: love(爱)
  2. word with help-echo, 比如: love, 光标经过,瞬时在help-echo出结果,结果可以是很多解释词条

更新:灵感来源

  1. Displaying image overlays on image filenames in Emacs
  2. Image tooltips in Emacs - YouTube
  3. overlays - Are there different tooltip mechanisms? - Emacs Stack Exchange

大佬总能找到一些用意思的信息。

directionary-overlay 可能这么改的动力不大。就是不想要移动光标,才选择把“翻译”放在单词的后面的,一眼就可以看到。

不过接下来,我准备有空实现一下websocket-bridge-grammaly 用于英文语法检查。help-echo 就很有用,我准备试试。

1 个赞

如果弹出窗口显示翻译,为啥不用各种翻译插件呢?

就是想一眼看到所有不认识单词的翻译才用dictionary-overlay的。

期待大作。

还没有怎么用过其他项目。目前来说,用help-echo显示已经用dictionary-overlay渲染过的overlay速度是相当快的。把 tooptip-delay 设为0,可以秒出,甚至可以说毫秒出?不知道猫大指的那些包是不是能秒出不等待的,求介绍。

秒出很多包就可以做到,但是要移动光标到单词才显示翻译,那我为啥不用单词翻译插件呢?

性能比overlay快不是目标,所有不认识单词都显示翻译才是提升人的效率。

1 个赞
(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 'face 'dictionary-overlay-unknownword)
    (overlay-put ov 'after-string
                 (propertize (format dictionary-overlay-translation-format target)
                             'face 'dictionary-overlay-translation))))

好了,两个face都加上了,请大佬测试,我就不发 PR 了

不足:hl-line-mode背景在overlay处会断开,不知道有没有其他大侠知道怎么解决。

图示:

优秀,我晚点改一改。断开就断开吧。这个也不影响。这样就可以了。完美。

已经补好了 face, 顺手把差不多完成了的 help-echo 选项加上 (夹带私货行为,嘿嘿),刚补好了提交了。

@ginqi7 大佬检查一下 Option to choose where to show overlay by qingshuizheng · Pull Request #35 · ginqi7/dictionary-overlay · GitHub

lz能再加个函数吗谢谢

实现提取文章中的所有单词到一个buffer(已经分词的情况下是不是不太难)

使用场景:准备看完字幕再看剧,又不想剧透,把字幕里的单词取出来用overlay过一下再看

不是很理解。

你是指,把当前 buffer 中所有的生词提取出来,然后导入到其他 buffer 里?

是的

不好意思我没描述清楚,现在不是有 knownword.txt 和 unknownword.txt 嘛

一篇待阅读的文章可以默认 render 出来生词对吧 我想这是因为整篇文章的单词已经提取过了,和生词表对比的结果对吧

那能否把没对比前的单词放到一个 buffer 里

我再对这个 buffer 进行 render 学习 (只是过单词,不是过文章,不需要语境,好处是如前所述不会剧透)

论坛这个换行搞不懂,要编辑多次 shift回车它不换行,直接回车又空一行 :sweat_smile:

这个需求看起来不太常规。应该可以写一个elisp 的方法,把buffer 当中的所有单词提取出来吧。

循环 forward-word 到下一个单词,然后记录单词,一直到buffer 的最后。应该就可以了吧

找到办法了,用上面楼的 【讨论】一种提升英文阅读体验的可能性 - #120,来自 redguardtoo

mybigword 把阈值改到10就行了

当然,要是能有个函数能标记 reigion 内的单词均为生词就更完美了 谢谢 (目前可以录个宏临时解决)

另,无关痛痒的建议函数名:

dictionary-overlay-mark-buffer-knownleftall 标记当前 buffer 中所有未标记为“生词”的单词全为“已知”

dictionary-overlay-mark-buffer-unknownleftall 标记当前 buffer 中所有未标记为“生词”的单词全为“未知”