一个支持多词典的翻译插件(目前仅支持单词)

把它设置成可以播放声音的软件就好了,例如 mpg123 或者 mpv。我没有 windows 设备不太清楚其他程序是否支持 curl url | mpg123 - 这种写法,这里 - 是代表 stdin

Windows 下可能需要特殊处理下

特殊处理具体是指怎样处理呢?(没有对应的设备真是苦恼啊 :sob:

现在支持网易同义词词典了,没错它支持中文!

2 个赞

Windows 下肯定是不支持curl的,除非用cygwin/msys2或者wsl。用默认的播放器直接播放应该就可以了。装个虚拟机测试下就知道了。

请问这种有弧度的背景色是怎么实现的?

请问fanyi-dwim可以直接读取当前所在的单词或选中的单词吗?现在需要Enter确认一下才查询default的单词。

是 SVG 图片

:rofl: 我个人感觉这样的方式已经非常方便了呀 ,只按一下回车就行了。是想要 fanyi-at-point 的另外版本嘛

实际上没有拿 curl 来获取实际的 url, 而是靠自带的 url-retrieve 获取,然后再用 process-send-region 把下载的内容发送给监听 stdin 的播放进程。

主要的问题是这些 unix old school 的东西基本上都约定 - 是当做 stdin 的,不清楚 Windows 下的程序是否也是这样的。(我是感觉不太可能有这种约定

对啊。我现在用有道就是绑定C-c t,不用额外确认,所以配置文件有点臃肿 :rofl:

;; -------- config youdao-dictionary --------
(if (display-graphic-p)
    (use-package youdao-dictionary
      :init
      ;; define youdao to display with posframe
      (with-eval-after-load 'posframe
	    (defun youdao-dictionary-search-at-point-posframe ()
	      "Search word at point and display result with posframe."
	      (interactive)
	      (let ((word (youdao-dictionary--region-or-word)))
	        (if word
		        (progn
		          (with-current-buffer (get-buffer-create youdao-dictionary-buffer-name)
		            (let ((inhibit-read-only t))
		              (erase-buffer)
		              (youdao-dictionary-mode)
		              (insert (youdao-dictionary--format-result word))
		              (goto-char (point-min))
		              (set (make-local-variable 'youdao-dictionary-current-buffer-word) word)))
		          (posframe-show youdao-dictionary-buffer-name
				                 :internal-border-width 5
				                 :position (point))
		          (unwind-protect
		              (push (read-event) unread-command-events)
		            (posframe-hide youdao-dictionary-buffer-name)))
	          (message "Nothing to look up")))))
      :bind
      ("C-c t" . 'youdao-dictionary-search-at-point-posframe))
  (use-package youdao-dictionary
    :bind
    (("C-c t" . 'youdao-dictionary-search-at-point+))))

对,Windows下不能这样使用stdin,所以我建议直接用默认的播放器播放即可。我最近也没有使用Windows,有空了我试试。

BTW,fanyi已经集成进Centaur Emacs。谢谢!

1 个赞

能不能有个 at-point 版本?不需要回车的。顺便问下,有道同义词没有发音吗?

Update: 我做了个简单版本:

(defun fanyi-at-point ()
    (interactive)
    (if-let ((word (if (use-region-p)
                       (buffer-substring-no-properties (region-beginning) (region-end))
                     (thing-at-point 'word t))))
        (fanyi-dwim word)
      (call-interactively #'fanyi-dwim)))

我试了下,但是我生成的svg图片很不清晰。平台是Mac。

我就用这个版本了,但是取的名字是 fanyi-dwim2。因为我看了一下其他包,只有 xxx-dwim 版本的时候会考虑 thing-at-pointregion ,所以叫 fanyi-dwim2 可能更合适一点。

这个没有唉,它的 API 全部都是文本类的信息。

可能是字体问题,建议换个字体。另外还有一点是文本没有完全居中,需要自己微调一下。

(defvar svg-horizonal-padding 4)
(defvar svg-vertical-padding 2)
(defvar svg-horizonal-offset 0)
(defvar svg-vertical-offset -5) ;; 正常来说只有这个可能需要调整

(defface fanyi-longman-svg-asset-face
  '((((background light))
     :foreground "white"
     :background "#f1d600")
    (((background dark))
     :foreground "black"
     :background "#a6a7bd"))
  "Face used for asset intro."
  :group 'fanyi)

(defun fanyi-longman-svg-tag-make (text face)
  "Create a SVG image displaying TEXT with FACE in a rounded box."
  (let* ((tag-width (* (length text) (window-font-width)))
         (tag-height (window-font-height))
         (svg-width (+ tag-width (* 2 svg-horizonal-padding)))
         (svg-height (+ tag-height (* 2 svg-vertical-padding)))
         (svg (svg-create svg-width svg-height)))
    (svg-rectangle svg 0 0 svg-width svg-height
                   :rx 7 ;; radius, 圆角的半径
                   :fill (face-attribute face :background))
    (svg-text svg text
              :fill (face-attribute face :foreground)
              :x (+ svg-horizonal-padding svg-horizonal-offset)
              :y (+ tag-height svg-vertical-padding svg-vertical-offset))
    (svg-image svg :scale 1 :ascent 'center)))

(insert-image (fanyi-longman-svg-tag-make "TEST" 'fanyi-longman-svg-asset-face))

这个是 fanyi.el 里使用的版本,也是从

这个改的,去掉了外框

1 个赞

2021mmpdf

嗯嗯,函数名字问题不大。

今天尝试了安装使用 fanyi ,给作者点个大大的赞👍。在 Mac 上的效果震撼到我了,显示的图标很漂亮。
希望以后能支持长句翻译,之前用 go-translate 习惯了长句。

另外有个小问题,咨询一下,在按 q 退出翻译界面后,窗口还会保留。也就是说,原来是单窗口的,启动 fanyi 后,退出,就变成了内容一样的两个窗口。
PS:只有打开过里面的柱状图链接,才会有上述的问题。

1 个赞

感谢喜欢! :heart: 长句翻译也在 roadmap 中,目标是支持

  • bing dict
  • youdao

这 2 个长句翻译服务。

这里详细讲一个为啥会存在遗留窗口的原因。

假设 Emacs 初始只有一个 window, 然后使用了 M-x fanyi-dwim,在 fanyi-dwim 内部使用了 pop-to-buffer 来展示对应 fanyi 的 buffer. 因为初始只有 一个 window, 而当前光标又是在这个 window 上,所以 pop-to-buffer 首先会判断 fanyi 的 buffer 能否在当前的 window 上显示(除非显式设置了 display-buffer-alist,不然默认是不会用同一个 window 来显示的)。得到的是否的答案之后,pop-to-buffer 会先建一个 window, 然后再在新的 window 上显示。

在 fanyi buffer 内打开柱状图,柱状图内部所使用的显示 buffer 函数是 switch-to-buffer (在 Emacs 内部的 chart.el)。默认 switch-to-buffer-obey-display-actions 为 nil 的情况下,switch-to-buffer 就只 干了一件事情,将对应 buffer 显示在 当前 window 上。关键的来了,在按 q (quit-window) 退出柱状图时。

因为当前 window 曾经被用来显示过 fanyi 的 buffer, 所以它的 quit-restore window-parameter 被设置成 nil 了。而如果这个 window 没有显示过其他 buffer,那么在这种状态下按 q (quit-window) 则会将其 window 删除。

(window-parameter (get-buffer-window "*fanyi*") 'quit-restore)
;; =>
;; (window window #<window 44 on fanyi-haici.el> #<buffer *fanyi*>)

如上所示,这个 window 的 quit-restore 并未是 nil,且其第 4 个参数正好是它用来显示的 buffer,那么在这种情况下这个 window 会被删除

The fourth element is the buffer whose display caused the creation of this parameter. This function may delete window if and only if it still shows that buffer.

一个可能非适用的方案是设置

(setq switch-to-buffer-obey-display-actions t)

然后 switch-to-buffer 就会转而使用 pop-to-buffer-same-window 了,但是因为仍旧是共用一个 window, 遗留窗口的问题还是存在。因此还需要针对柱状图 buffer 做 buffer displaying 的特殊处理:

(setq display-buffer-alist `((,(concat "\\*" fanyi-haici-distribution-chart-title "\\*")
                              (display-buffer-pop-up-window)
                              (inhibit-same-window . t)))))

这样的话

柱状图就不会在原来的 window 上。

不过我感觉我可以自己设置一下 *fanyi* buffer 对应的 window-parameter 来得到一样的效果,这个可能还要摸索一下。

1 个赞