对呢。陷入思维陷进了。我以为加了 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,大家一起共同维护。
试了一下,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
快试试这个:
(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)))))
说明:
- 可以把所有释义都扔进help-echo里,而不只是一个简短释义。
- 可以保存原本 buffer 结构完整,没有插入任何东西。除非 face 给原本的词加face, 但不加face怎么知道这儿有个生词呢。尽量不使用bold这种可能会改变宽度的face就好了。比如下划线,或者单纯加颜色
- 给 tooptip 的各种delay设为0, buffer 渲染一遍后,显示速度快到发抖。
不过以后包成熟了应该可以开个 dictionary-overlay-mode 的 minor-mode, 把 tooptip 相关的值包进去。
想法: 可以开放一个选项 (defcustom):
-
word(translation)
比如:love(爱)
- word with help-echo, 比如: love, 光标经过,瞬时在help-echo出结果,结果可以是很多解释词条
更新:灵感来源
大佬总能找到一些用意思的信息。
directionary-overlay 可能这么改的动力不大。就是不想要移动光标,才选择把“翻译”放在单词的后面的,一眼就可以看到。
不过接下来,我准备有空实现一下websocket-bridge-grammaly 用于英文语法检查。help-echo 就很有用,我准备试试。
如果弹出窗口显示翻译,为啥不用各种翻译插件呢?
就是想一眼看到所有不认识单词的翻译才用dictionary-overlay的。
期待大作。
还没有怎么用过其他项目。目前来说,用help-echo显示已经用dictionary-overlay渲染过的overlay速度是相当快的。把 tooptip-delay 设为0,可以秒出,甚至可以说毫秒出?不知道猫大指的那些包是不是能秒出不等待的,求介绍。
秒出很多包就可以做到,但是要移动光标到单词才显示翻译,那我为啥不用单词翻译插件呢?
性能比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 '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回车它不换行,直接回车又空一行
这个需求看起来不太常规。应该可以写一个elisp 的方法,把buffer 当中的所有单词提取出来吧。
循环 forward-word 到下一个单词,然后记录单词,一直到buffer 的最后。应该就可以了吧
找到办法了,用上面楼的 【讨论】一种提升英文阅读体验的可能性 - #120,来自 redguardtoo
mybigword 把阈值改到10就行了
当然,要是能有个函数能标记 reigion 内的单词均为生词就更完美了 谢谢 (目前可以录个宏临时解决)
另,无关痛痒的建议函数名:
dictionary-overlay-mark-buffer-knownleftall 标记当前 buffer 中所有未标记为“生词”的单词全为“已知”
dictionary-overlay-mark-buffer-unknownleftall 标记当前 buffer 中所有未标记为“生词”的单词全为“未知”