感觉 melpa 最近更新一直很慢,咱也不懂,等等看吧
给函数增加 around 是这样的:
(defun aaa (x y) (message "i am function aaa"))
(advice-add #'aaa :around (lambda (fn &rest args) (apply fn args)))
给方法添加 around 是这样的:
(cl-defmethod bbb (x y) (message "i am method bbb"))
(cl-defmethod bbb :around (x y) (cl-call-next-method x y))
没啥本质区别。
非常好用, 因为我日常使用 evil, 打开 gt-buffer 之后顺手就关闭了, 增强了一下
(defun my/goto-gt-result-buffer (&rest _args)
"Switch to the *gt-result* buffer after translation without changing the window layout."
(when-let ((buf (get-buffer "*gt-result*")))
(pop-to-buffer buf '(display-buffer-reuse-window (inhibit-same-window . nil)))))
(advice-add 'gt-do-translate :after #'my/goto-gt-result-buffer)
(add-hook 'gt-buffer-render-output-hook (lambda () (define-key evil-normal-state-local-map (kbd "q") 'kill-buffer-and-window)))
是否有更好的native 的实现方式
;; pop-to-buffer
(setq gt-buffer-render-follow-p t)
;; window config
(setq gt-buffer-prompt-window-config
'(display-buffer-reuse-window (inhibit-same-window . nil)))
在 evil 中,默认情况下使用 ,
作为前缀触发快捷键。比如 , q
表示关闭。
当前,你那样绑定也没问题,但最好在 gt-buffer-render-init-hook
中绑定。
Add support for LibreTranslate.
道友好,添加 Libre translate 后,翻译结果显示 http 400(如下图所示)
配置文件如下:
(use-package go-translate
:config
(setq gt-langs '(en zh))
(setq gt-default-translator
(gt-translator
:taker (gt-taker :text 'buffer :pick 'paragraph) ; 配置拾取器
:engines (list
(gt-bing-engine)
(gt-youdao-dict-engine)
(gt-libre-engine)) ;指定多引擎
:render (gt-buffer-render))) ; 配置渲染器
)
LibreTranslate 可以使用官方服务,也可以使用第三方或本地服务。
官方服务需要购买 token,所以我就随便设置了一个第三方(https://translate.disroot.org/)。在我这里,它能正常使用,你的上述配置不会报错。
对于你的出错,应该跟 disroot.org 有关。因此建议你搜索并使用你那里可用的 LibreTranslate 服务。比如:
配置 host:
(setq gt-libre-host "https://translate.terraprint.co/")
或指定 host:
...
:engines
(gt-libre-engine :host "https://translate.terraprint.co/")
...
增加新接口,简化适用于多场景的翻译器的配置。
现在 :taker/engines/render 都可以是列表。对于 engines,使用所有可用的;对于 taker/render,使用第一个可用的。根据 :if
值进行可用性判定。
示例:
;; 对于选中的文本,不分段,并使用 posframe 渲染
;; 对于 Info,翻译当前段落,使用 overlay 显示结果
;; 对于只读文本,翻译整个 buffer 中的生词,并使用 overlay 渲染
;; 对于 Magit commit buffer,将翻译结果插入到光标位置
;; 对于单词,使用 google 引擎翻译; 其他使用 deepl 引擎
(setq gt-default-translator
(gt-translator
:taker (list (gt-taker :pick nil :if 'selection)
(gt-taker :text 'paragraph :if '(Info-mode help-mode))
(gt-taker :text 'buffer :pick 'fresh-word :if 'read-only)
(gt-taker :text 'word))
:engines (list (gt-google-engine :if 'word)
(gt-deepl-engine :if 'no-word))
:render (list (gt-posframe-pop-render :if 'selection)
(gt-overlay-render :if 'read-only)
(gt-insert-render :if (lambda (translator) (member (buffer-name) '("COMMIT_EDITMSG"))))
(gt-alert-render :if '(and xxx-mode (or not-selection (and read-only parts))))
(gt-buffer-render))))
这个好评,原来我是设置了 3 个 gt-preset-translators
的,现在只需要设置一个,不用频繁切换了。
有个体验上的小问题。gt-overlay-render
翻译之后光标在overlay 之后,导致 直接执行 M-x:gt-delete-render-overlays 无效, 能否让光标一直在原文区域。
我想实现的效果是翻译之后 C-g
可以马上delete overlay
(defun vmacs-gt-delete-render-overlays()
(call-interactively #'gt-delete-render-overlays))
(advice-add 'keyboard-quit :before #'vmacs-gt-delete-render-overlays))
要是go-translate
能和 fanyi
结合就好了
目前两个都用,
我也是,zsbd
为啥这么说,我两个都没用过,正在纠结😂
各有优缺点啊,go-translate
灵活,可自己定制扩展,用child frame,overlay,buffer等展示;fanyi
只能在buffer展示,但是翻译源多,还带语音等信息,翻译很全。可以
自己试试。
你说的很有道理。
不需要使用 advice,直接绑定按键到 gt-overlay-render-map 即可:
(define-key gt-overlay-render-map
(kbd "C-g") #'gt-delete-render-overlays)
请测试。
还带语音等信息
在我看来,命令 gt-do-speak
很好用,可以通过 C-n
或 C-p
切换不同语音引擎。
http 400
可能是同样的原因: overlay render not working in devdocs buffers · Issue #78 · lorniu/go-translate · GitHub
思路不一样吧,fanyi用的是在线语音,显示比较直观。