skk-tankan.el を改造して遊ぶ - 読みと画数で候補を絞り込む

DDSKK の総画数変換、部首変換ができる skk-tankan.el の内容を読んでいて、ちょっと思い浮かんだので、少し改造して遊んでみましてた。


概要

「読み」+「画数」+「skk-tankan-search-key (デフォルトだと @)」で変換する事で指定した画数と読みを持つ語句のみを変換候補として出せます。
以下のような感じです。

▽りょう2@  ;; => 了
▽あ7@      ;; => 亜 吾

ただ、skk-tankan.el のデフォルトの機能として、「読み」+ 「skk-tankan-search-key (デフォルトだと @)」で画数で変換候補をソートして出せます。
# 画数の少い候補が先に出るようにソートされる。
そのため、この改造の機能を使用する場合は、おそらく、覚えている画数は少いものになると思うので、上記ソート機能で十分の場合がほとんどであまり嬉しくないかもです。

パッチ

小さいのでパッチをそのまま貼り付け。
patch -p0 < skk-tankan.el.patch みたいな感じであたる思います。

diff --git skk-tankan.el skk-tankan.el
index 34822a8..c297d8a 100644
--- skk-tankan.el
+++ skk-tankan.el
@@ -1698,11 +1698,12 @@ C-u 数値 M-x skk-tankan で総画数変換を開始する。"
   "変数 skk-henkan-key で指定された「読み」に基づいて単漢字変換を実行する。
 通常は skk-search-prog-list の1要素として次の形式で指定される。
 '(skk-tankan-search 'skk-search-jisyo-file
-                    skk-large-jisyo 10000))"
+		     skk-large-jisyo 10000))"
   (when (string-match (format "%s$" (regexp-quote
 				     (char-to-string skk-tankan-search-key)))
 		      skk-henkan-key)
-    (let ((skk-henkan-key (substring skk-henkan-key 0 (match-beginning 0))))
+    (let ((skk-henkan-key (substring skk-henkan-key 0 (match-beginning 0)))
+	  kakusu)
       ;; get KOUHO list
       (skk-tankan-select-tankanji-kouho
        (cons nil (cond
@@ -1715,12 +1716,25 @@ C-u 数値 M-x skk-tankan で総画数変換を開始する。"
 			  skk-henkan-key)
 		   (skk-search-by-stroke-or-radical
 		    (skk-tankan-bushu-compread) 0))
+		  ;; ▽あ7@ => 画数7で読みが「あ」の候補
+		  ((string-match "^\\(.*\\)\\([0-9]+\\)$" skk-henkan-key)
+		   (let ((num (match-string 2 skk-henkan-key))
+			 (skk-henkan-key (match-string 1 skk-henkan-key)))
+		     (setq kakusu (string-to-number num))
+		     (apply func args)))
 		  ;; ▽あ <SPC> => "読み"単漢字変換
 		  (t
-		   (apply func args))))))))
+		   (apply func args))))
+       kakusu))))
 
-(defun skk-tankan-select-tankanji-kouho (lis)
+(defun skk-tankan-select-tankanji-kouho (lis &optional kakusu)
   (let ((top lis)
+	(get-anno #'(lambda (cell)
+		      (format "%d画(%s部%d画)%s"
+			      (nth 4 cell)
+			      (aref skk-tankan-radical-vector (nth 2 cell))
+			      (nth 3 cell)
+			      (or (nth 1 cell) ""))))
 	tmp)
     ;; select TANKANJI KOUHO
       (while (cdr lis)
@@ -1747,21 +1761,29 @@ C-u 数値 M-x skk-tankan で総画数変換を開始する。"
 				    (< xb yb))
 				(< xa ya))
 			    (< xc yc))))))
-      ;; return list with annotation
-      (mapcar (lambda (cell)
-		(let ((anno (if (= 0 (nth 2 cell))
-				(nth 1 cell)
-			      (format "%d画(%s部%d画)%s"
-				      (nth 4 cell)
-				      (aref skk-tankan-radical-vector
-					    (nth 2 cell))
-				      (nth 3 cell)
-				      (or (nth 1 cell) "")
-				      ))))
-		  (if (= 0 (length anno))
-		      (char-to-string (car cell))
-		    (concat (char-to-string (car cell)) ";" anno))))
-	      lis)))
+      (cond
+       (kakusu
+	;; return list that extracted by KAKUSU.
+	(let (l)
+	  (dolist (i lis)
+	    (when (and (/= 0 (nth 2 i))
+		       (= kakusu (nth 4 i)))
+	      (let ((anno (funcall get-anno i)))
+		(setq l (cons (if (= 0 (length anno))
+				  (char-to-string (car i))
+				(concat (char-to-string (car i)) ";" anno))
+			      l)))))
+	  (nreverse l)))
+       (t
+	;; return list with annotation
+	(mapcar (lambda (cell)
+		  (let ((anno (if (= 0 (nth 2 cell))
+				  (nth 1 cell)
+				(funcall get-anno cell))))
+		    (if (= 0 (length anno))
+			(char-to-string (car cell))
+		      (concat (char-to-string (car cell)) ";" anno))))
+		lis)))))
 
 ;;;###autoload
 (defun skk-search-tankanji (&optional jisyo)


まあ、よかったらどうぞという感じで…。

更新時刻

  • 更新時刻 2011/01/03/04:55