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 void

sdicを修正

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)はこちら

参考サイト: OSSはアルミニウムの翼で飛ぶ /Emacs 英辞郎 + sdic + sary

ispellを動かす,2023.hunspellを使う

本体と辞書をapt

1apt install hunspell
2apt install hunspell-en-us

bashrcへの設定は不要でした。

  1. 端末で使うとき

    -dで使用辞書を指定します。

    1hunspell -D

    で辞書サーチパスを示します。

  2. 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