这个包真是我们这种工作电脑没管理员权限的用户的福音啊
这是啥主题和字体?感觉挺好看……
中文字体请问是?
Sarasa Gothic
Repo的链接打不开了,大哥更新一下呗
从github搬家到codeberg的时侯弄丢了。。。直接用原来的版本吧 EmacsWiki: stardict.el ,我当时的修改主要是加了用posframe显示查询结果的功能,自己写一个应该不难。
好的 lol
我把自己魔改的stardict放在我的配置里了 链接 现在可以在光标处取词或者prompt取词, 能够粗略处理 ing, ed, s 等屈折变化.
因为我是在emacs android上用的, 屏幕太小, 我没有用posframe, 而是直接切换到一个专门的buffer. 不过要改为posframe应该也好改.
这个工具包支不支持中文转英文呢
我试过了,不行.
我试了一下确实不行, 抱歉! 疑似是 stardict-open-1
函数读取索引 (idx文件) 时未能正确地将编码转为汉字, 因为每个索引现在是这个样子: "\344\270\200\342\200\246\344\270\200\342\200\246" (6559 . 995)
. 字符串里应该是几个UTF-8汉字.
我自己不是 stardict.el
的作者, 对汉字编码转换不了解, 尝试在读取idx文件后在临时buffer里运行 (recode-region (point-min) (point-max) 'utf-8 'no-conversion)
但报错, 有空再看看. 要是坛里有大佬指点一下就太好了.
没关系,知道你不是作者。我有空也看看,如果有后面有进展,再一起分享
我用file命令查看idx文件是zlib压缩文件,但是用gzip和pigz都解压失败,stardict3的文件标准我看不太懂,目前不知道该怎么搞。。。我怀疑是你使用的字典文件的idx文件有问题,换个字典试试?
原来只要在stardict-open-1
里面用utf-8解码一下就可以了,只需要改一行代码:
(let (p word offset size)
(re-search-forward "\\([^\x00]+?\\)\x00" nil t)
(setq p (point))
- (setq word (match-string 1))
+ (setq word (decode-coding-string (encode-coding-string (match-string 1) 'no-conversion) 'utf-8))
(setq offset
(stardict-str2int
(buffer-substring-no-properties p
(+ p idx-offset-bytes))))
(setq size
(stardict-str2int
(buffer-substring-no-properties (+ p idx-offset-bytes)
(+ p idx-offset-bytes 4))))
我用朗道汉英词典试过了没问题
优秀,太棒了,感谢哈!
兄弟,有没有人说过你很优秀
基于stardict
写了个类sdcv.el
的代码,
(defvar my-dict-buffer-name "*MYDICT*"
"The buffer buffer of my dictionary lookup.")
;; English => Chinese
(defvar my-dict-simple
'("~/.stardict/dic/stardict-langdao-ec-gb-2.4.2" "langdao-ec-gb"))
;; WordNet English => English
(defvar my-dict-complete
'("~/.stardict/dic/stardict-dictd_www.dict.org_wn-2.4.2" "dictd_www.dict.org_wn"))
(defvar my-dict-simple-cache nil "Internal variable.")
(defvar my-dict-complete-cache nil "Internal variable.")
(defun my-dict-prompt-input ()
"Prompt input for translate."
(let* ((word (if mark-active
(buffer-substring-no-properties (region-beginning)
(region-end))
(thing-at-point 'word))))
(setq word (read-string (format "Word (%s): " (or word ""))
nil nil
word))
(if word (downcase word))))
(defun my-dict-quit-window ()
"Quit window."
(interactive)
(quit-window t))
(defmacro my-dict-search-detail (dict cache)
"Return word's definition with DICT, CACHE."
`(let* ((word (my-dict-prompt-input)))
(when word
(unless (featurep 'stardict) (require 'stardict))
(unless ,cache
(setq ,cache
(stardict-open (nth 0 ,dict) (nth 1 ,dict) t)))
(stardict-lookup ,cache word))))
(defun my-dict-complete-definition ()
"Show dictionary lookup in buffer."
(interactive)
(let* ((def (my-dict-search-detail my-dict-complete my-dict-complete-cache))
buf
win)
(when def
(setq buf (get-buffer-create my-dict-buffer-name))
(with-current-buffer buf
(setq buffer-read-only nil)
(erase-buffer)
(insert def)
(goto-char (point-min))
;; quit easily
(local-set-key (kbd "q") 'my-dict-quit-window)
(when (and (boundp 'evil-mode) evil-mode)
(evil-local-set-key 'normal "q" 'my-dict-quit-window)))
(unless (eq (current-buffer) buf)
(if (null (setq win (get-buffer-window buf)))
(switch-to-buffer-other-window buf)
(select-window win))))))
(defun my-dict-simple-definition ()
"Show dictionary lookup in popup."
(interactive)
(let* ((def (my-dict-search-detail my-dict-simple my-dict-simple-cache)))
(when def
(unless (featurep 'popup) (require 'popup))
(popup-tip def))))