在windows上使用stardict的经验

今天尝试编译和安装了 emacs 下的 stardict 的插件,有一些经验记录一下,首先是工作环境,windows 7 sp1 x64,emacs 版本 GNU Emacs 27.2 (build 1, x86_64-w64-mingw32), cygwin64 ,命令行的 sdcv 来自 GitHub - Dushistov/sdcv ,主页是 Sdcv by Dushistov , 当前版本 0.53。当我下载之后,到 cygwin64 的命令行窗口下进行 cmake ,结果出错,一个是如这个 issue 中: Compiling error 'popen' not declared in this scope · Issue #40 · Dushistov/sdcv · GitHub Compiling error ‘popen’ not declared in this scope,按照帖子中的提示,修改 compiler.cmake, 加入 append(“-std=c++11 -U__STRICT_ANSI__” CMAKE_CXX_FLAGS) 。另一个问题是在连接时,提示一堆 “undefined reference to `rl_readline_name’ ” 这样的错误,原来是 cygwin 上没有安装 readline-devel 的包。在解决这两个问题后,编译成功,把 sdcv.exe 放到 cygwin64/usr/local/bin 下。另外,在一个常用的 path 中,放一个 sdcv.bat ,作为 emacs 上的 sdcv.el 直接调用的接口:

sdcv.bat 内容如下:
@echo off
set PATH=d:\dev\cygwin64\bin;d:\dev\cygwin64\usr\bin;d:\dev\cygwin64\usr\local\bin;%PATH%
rem cygwin-1.7 use utf-8 as default locale, if nothing (LANG/LC_xxx) set
rem but Emacs would set LANG according system active codepage
set LANG=zh_CN.UTF-8
rem @start d:\devtools\bin\argtest.exe %1 %2 %3 %4 %5
rem echo %* > d:\dev\temp\sdcv-1.txt
sdcv.exe %*

然后,下载这里论坛上提供的 sdcv.el https://emacs-china.org/t/emacs/7750/10, 到 manateelazycat 的页面上下载,然后,我发现直接使用会有出错,最多见的是 Internal Error map::at 之类的,或者是没有反应。所以我做了这样的修改,
step 1 首先是设置 sdcv-program 变量
(setq sdcv-program “sdcv.bat”)
step 2 然后,设置字典的目录:
原本我设置过一个 dotstardict-dir 的变量,懒得改了,就添加在后面。
(setq sdcv-dictionary-data-dir (concat dotstardict-dir “/.stardict/dic”))
step 3 用 sdcv-check 检查,去掉字典列表中查不到的字典名称。
step 4 修改 sdcv.el,原版在 windows 上运行是有问题的,主要是 process-coding 的问题所以找到这个地方:

(defun sdcv-translate-result (word dictionary-list)
  "Call sdcv to search word in dictionary list, return filtered
string of results."
  (sdcv-filter
   (shell-command-to-string
;; Set LANG environment variable, make sure `shell-command-to-string' can handle CJK character correctly.
(format "env LANG=%s %s -x -n %s %s --data-dir=%s"
sdcv-env-lang
sdcv-program
(mapconcat (lambda (dict)
 (concat "-u \"" dict "\""))
   dictionary-list " ")
(format "\"%s\"" word)
sdcv-dictionary-data-dir))))

修改为:

(defun sdcv-translate-result (word dictionary-list)
  "Call sdcv to search word in dictionary list, return filtered
string of results."
(if (eq system-type 'gnu/linux) 
	     (setq sdcv-env-string (format "env LANG=%s" sdcv-env-lang)))
(if (eq system-type 'windows-nt)
   (progn 
  (setq default-process-coding-system '(utf-8-dos . chinese-iso-8bit-dos))
		  (setq sdcv-env-string "")))
  (sdcv-filter
	  (shell-command-to-string
 ;; Set LANG environment variable, make sure `shell-command-to-string' can handle CJK character correctly.
 (format "%s %s -x -n %s %s --data-dir=%s"
sdcv-env-string
sdcv-program
(mapconcat (lambda (dict)
 (concat "-u \"" dict "\""))
   dictionary-list " ")
(format "\"%s\"" word)
sdcv-dictionary-data-dir))))

添加的两个条件判断,是让 emacs 在 windows 下,不去运行 env 命令,并以正确的编码传送命令行参数。
现在,sdcv.el 可以正常工作了。

3 个赞

排版花了…

正在调整,不知是怎么回事。

赞一个,很详细。虽然我在win上已经不用stardict了。

有没有在msys2编译成功的

nice啊, 可以给sdcv.el提个pr

请问你的sdcv-check这个命令,在win10上能用吗?我用这个命令查询出来的字典列表总是乱码,导致和目录里的词典名对不上,其他的查询单词倒是可以用; 我尝试了好多修改输出码流的办法,可总是不行,现在是没法检查字典有效性了。。。

星际译王词典哪里下载?

win10上,我没有用过,但我看了源码,是这样的: (format “%s %s --list-dicts --data-dir=%s” sdcv-env-string sdcv-program sdcv-dictionary-data-dir)

而 sdcv-env-string 在此之前是这么设置的: (if (eq system-type 'windows-nt) (progn (setq default-process-coding-system '(utf-8-dos . chinese-iso-8bit-dos)) (setq sdcv-env-string “”)))

所以,我估计 win10 不是 windows-nt 所以 sdcv-env-string 可能没有设置对。

刚才查看了,win10 还是 windows-nt ,所以最好用 C-h v sdcv-env-string 看看是个什么情况。

还有 sdcv-env-lang 应该是 zh_CN.UTF-8,还有 init-sdcv.el 是 utf-8 编码。文件换行符是 unix 风格,等等,据我的经验,这些细节往往是影响程序执行的所在。

水平有限,仅供参考。

hxxp://download.huzheng.org/

把 xx 换成 tt

我觉得词典不在多,而在精,我曾经下载过 5.75G 的星际译王全部词典,但我实际用的还是那几个老的。

楼主动手能力很强啊,应该学过编程。