SDICを動かす, ispellも
Emacs上で 英単語を検索したりスペルチェックする、昔ながらの英作文編集環境構築方法です。
saryをinstall&修正
saryは高速なテキスト検索を可能にするライブラリです。
saryはなくてもsdicは動作しますが、圧倒的に高速なそうです。
ただし、作成されたのが随分昔なので、最近の環境で使うにはいくつか手入れ
が必要です。
saryはここにあります。 https://sary.sourceforge.net/
- パッケージにlibglib2.0-dev, libglib2.0-dev-binが必要です。aptします。
- 関数indexがconflictします。(strings.hでindex使っているので. 最近??,2021.4:bullseye/emacs27) sary/builder.c,src/mksary.cで定義している関数indexをs_index(適当な名前)と改名
- src/sary.cでStrncompFuncの呼び出し側が、
3番目の引数の型を size_tと unsigned intを混在していて、
型が合わないと怒られるようになりました。(2025.9: trixie/emacs30, gcc14.2?)
StrncompFuncを適当な名前にcp-renameして、対応。
以下saryに関するdiffです。
1 diff -Naru ./sary-1.2.0/sary/builder.c ./sary-1.2.0_rev/sary/builder.c
2--- ./sary-1.2.0/sary/builder.c 2005-01-28 17:50:24.000000000 +0900
3+++ ./sary-1.2.0_rev/sary/builder.c 2025-10-02 09:31:48.970512307 +0900
4@@ -45,7 +45,7 @@
5 gpointer progress_func_data;
6 };
7
8-static SaryInt index (SaryBuilder *builder,
9+static SaryInt s_index (SaryBuilder *builder,
10 SaryProgress *progress,
11 SaryWriter *writer);
12 static void progress_quiet (SaryProgress *progress);
13@@ -124,7 +124,7 @@
14 builder->progress_func,
15 builder->progress_func_data);
16
17- count = index(builder, progress, writer);
18+ count = s_index(builder, progress, writer);
19
20 sary_progress_destroy(progress);
21 sary_writer_destroy(writer);
22@@ -219,7 +219,7 @@
23 }
24
25 static SaryInt
26-index (SaryBuilder *builder, SaryProgress *progress, SaryWriter *writer)
27+s_index (SaryBuilder *builder, SaryProgress *progress, SaryWriter *writer)
28 {
29 gchar *bof, *cursor;
30 SaryInt count;
31diff -Naru ./sary-1.2.0/src/mksary.c ./sary-1.2.0_rev/src/mksary.c
32--- ./sary-1.2.0/src/mksary.c 2004-06-12 03:57:28.000000000 +0900
33+++ ./sary-1.2.0_rev/src/mksary.c 2025-10-02 09:42:30.280153828 +0900
34@@ -59,7 +59,7 @@
35 static SaryIpointFunc dispatch_codeset_func (const gchar *codeset);
36 static SaryBuilder* new_builder (const gchar *file_name,
37 const gchar *array_name);
38-static void index (SaryBuilder *builder,
39+static void s_index (SaryBuilder *builder,
40 const gchar *file_name,
41 const gchar *array_name);
42 static void sort (SaryBuilder *builder,
43@@ -149,7 +149,7 @@
44 }
45
46 static void
47-index (SaryBuilder *builder,
48+s_index (SaryBuilder *builder,
49 const gchar *file_name,
50 const gchar *array_name)
51 {
52@@ -186,7 +186,7 @@
53 const gchar *file_name,
54 const gchar *array_name)
55 {
56- index(builder, file_name, array_name);
57+ s_index(builder, file_name, array_name);
58 sort(builder, file_name, array_name);
59 }
60
61@@ -358,7 +358,7 @@
62 show_help();
63 break;
64 case 'i':
65- process = index;
66+ process = s_index;
67 break;
68 case 'l':
69 ipoint_func = sary_ipoint_line;
70diff -Naru ./sary-1.2.0/src/sary.c ./sary-1.2.0_rev/src/sary.c
71--- ./sary-1.2.0/src/sary.c 2004-06-12 03:57:28.000000000 +0900
72+++ ./sary-1.2.0_rev/src/sary.c 2025-10-02 09:45:13.226900979 +0900
73@@ -38,6 +38,11 @@
74 typedef int (*StrncmpFunc) (const gchar *s1,
75 const gchar *s2,
76 size_t n);
77+/*size_t to unsigned int*/
78+typedef int (*StrncmpFunc_r) (const gchar *s1,
79+ const gchar *s2,
80+ unsigned int n);
81+
82 typedef gboolean (*SearchFunc) (SarySearcher *searcher,
83 const gchar *pattern);
84 typedef void (*PrintFunc) (const gchar *text,
85@@ -213,7 +218,26 @@
86 }
87 }
88 }
89-
90+/*tak add*/
91+static void
92+print_highlight_internal_r (const gchar *text, int len, const gchar *pattern,
93+ StrncmpFunc_r cmpfunc)
94+{
95+ int i, patlen;
96+ patlen = strlen(pattern);
97+ for (i = 0; i < len;) {
98+ if (cmpfunc(text + i, pattern, patlen) == 0) {
99+ printf("\x1b[7m");
100+ fwrite(text + i, sizeof(gchar), patlen, stdout);
101+ printf("\x1b[0m");
102+ i += patlen;
103+ } else {
104+ fwrite(text + i, sizeof(gchar), 1, stdout);
105+ i++;
106+ }
107+ }
108+}
109+/* end here */
110 static void
111 print_highlight (const gchar *text, int len, const gchar *pattern)
112 {
113@@ -223,7 +247,8 @@
114 static void
115 print_highlight_icase (const gchar *text, int len, const gchar *pattern)
116 {
117- print_highlight_internal(text, len, pattern, g_strncasecmp);
118+ // tak print_highlight_internal(text, len, pattern, g_strncasecmp);
119+ print_highlight_internal_r(text, len, pattern, g_strncasecmp);
120 }
121
122 static voidsdicを修正
sdicは土屋さんのとこにあります。 http://www.namazu.org/~tsuchiya/sdic/#download
./configureしないとsdic.elが生成されないので注意!
またconfigureすると上書きされるので、下記修正を行ったときは注意!
permissionも+wすること!(他のelも)
- (a)文法chkがきつくなったそうな
stem.el,sdic-compat.el,sdic-gene.elの '(lambdaとなっている 'を全部消去。
つまり'(lambdaを(lambdaと修正!
,)も修正::全部削除 (b) default-fill-column が未定義と怒られるので、setqします。
1(if (not (boundp 'default-fill-column)) 2 (setq default-fill-column (default-value 'fill-column)))または
1(if (string-match "26" emacs-version) 2 (setq default-fill-column (default-value 'fill-column)))をsdic.el冒頭に追加 こちらの情報です。
コンパイルしないときは.emacsに書いてました。
- sdic.elのold-style backquoteを手動修正!! bullseye(d11),Emacs27で必要になりました。
旧スタイルの
1; Source - https://stackoverflow.com/questions/8109665/how-fix-emacs-error-old-style-backquotes-detected'
2; Posted by Drew
3; Retrieved 2025/11/5, License - CC-BY-SA 4.0
4
5(` (foo (, bar) (,@ toto)))を
新スタイル
1; Source - https://stackoverflow.com/questions/8109665/how-fix-emacs-error-old-style-backquotes-detected'
2; Posted by Drew
3; Retrieved 2025/11/5, License - CC-BY-SA 4.0
4
5`(foo ,bar ,@toto)に変更します。
以下sdic.elのdiffです
1--- ./lisp/sdic.el 2023-02-24 14:39:35.446144218 +0900
2+++ ../sdic-2.1.3_rev/lisp/sdic.el 2022-04-06 15:01:33.820311317 +0900
3@@ -89,6 +89,9 @@
4 (require 'sdicf)
5 (require 'stem)
6
7+;;2022.4.7 tak add and old-style backquote modify
8+(if (not (boundp 'default-fill-column))
9+ (setq default-fill-column (default-value 'fill-column)))
10
11 ;;;----------------------------------------------------------------------
12 ;;; カスタマイズ用変数
13@@ -362,27 +365,27 @@
14 QUERY に検索形式を指定する構造が含まれていない場合は、default の動作と
15 して SEXP を評価する。通常の検索の場合は、検索された見出し語のリストを
16 返す。"
17- (` (cond
18+ `(cond
19 ;; 検索語が '' で囲まれている場合 -> 完全一致検索
20- ((and (equal ?' (string-to-char (, query)))
21- (equal "'" (substring (, query) -1)))
22+ ((and (equal ?' (string-to-char query))
23+ (equal "'" (substring query -1)))
24 (sdic-insert-entry-list
25- (sdic-search-multi-dictionaries (, dic-list) (substring (, query) 1 -1) 'lambda)))
26+ (sdic-search-multi-dictionaries dic-list (substring query 1 -1) 'lambda)))
27 ;; 検索語の先頭に / がある場合 -> 全文検索
28- ((equal ?/ (string-to-char (, query)))
29+ ((equal ?/ (string-to-char query))
30 (sdic-insert-entry-list
31- (sdic-search-multi-dictionaries (, dic-list) (substring (, query) 1) 0)))
32+ (sdic-search-multi-dictionaries dic-list (substring query 1) 0)))
33 ;; 検索語の先頭に * がある場合 -> 後方一致検索
34- ((equal ?* (string-to-char (, query)))
35+ ((equal ?* (string-to-char query))
36 (sdic-insert-entry-list
37- (sdic-search-multi-dictionaries (, dic-list) (substring (, query) 1) t)))
38+ (sdic-search-multi-dictionaries dic-list (substring query 1) t)))
39 ;; 検索語の末尾に * がある場合 -> 前方一致検索
40- ((equal "*" (substring (, query) -1))
41+ ((equal "*" (substring query -1))
42 (sdic-insert-entry-list
43- (sdic-search-multi-dictionaries (, dic-list) (substring (, query) 0 -1))))
44+ (sdic-search-multi-dictionaries dic-list (substring query 0 -1))))
45 ;; 特に指定がない場合 -> 指定された S 式を評価
46 (t
47- (,@ sexp)))))
48+ ,@ sexp)))dictやsdic設定elは以前の流用
以上の修正で、 make, make installでsdic動くようになった!
Happy!!
emacs側設定ファイル(50-sdic-set.el)はこちら
ispellを動かす,2023.hunspellを使う
本体と辞書をapt
1apt install hunspell
2apt install hunspell-en-usbashrcへの設定は不要でした。
端末で使うとき
-dで使用辞書を指定します。
1hunspell -Dで辞書サーチパスを示します。
- emacsから使う。 init.elに以下指定を追加します。
1(setq ispell-program-name "hunspell")
2(setq ispell-really-hunspell t)
3(setenv "DICTIONARY" "en_US")
4(setenv "WORDLIST" "$HOME/.hunspell_personal_dictionary")
5
6;;ispell を使う場合、日本語混じりのファイルのスペルチェックをすることができます。
7(eval-after-load "ispell"
8 '(add-to-list 'ispell-skip-region-alist '("[^\000-\377]+")))HAPPY!
ispellを動かす(aspel):OSOLETEです。
Error: No word lists can be found for the language "ja_JP"
といわれる。
処置
~/.aspell.confに
lang en_US
と書く。=入れたらだめ!
Thanks muneda's diary