今天尝试编译和安装了 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 可以正常工作了。