sekka 0.8.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/emacs/sekka.el CHANGED
@@ -1,4 +1,4 @@
1
- ;; -*- coding: iso-2022-jp -*-
1
+ ;; -*- coding: utf-8 -*-
2
2
  ;;
3
3
  ;; "sekka.el" is a client for Sekka server
4
4
  ;;
@@ -36,74 +36,85 @@
36
36
  :group 'Japanese)
37
37
 
38
38
  (defcustom sekka-server-url "http://localhost:12929/"
39
- "Sekka$B%5!<%P!<$N(BURL$B$r;XDj$9$k!#(B"
39
+ "SekkaサーバーのURLを指定する。"
40
40
  :type 'string
41
41
  :group 'sekka)
42
42
 
43
43
  (defcustom sekka-server-timeout 10
44
- "Sekka$B%5!<%P!<$HDL?.$9$k;~$N%?%$%`%"%&%H$r;XDj$9$k!#(B($BIC?t(B)"
44
+ "Sekkaサーバーと通信する時のタイムアウトを指定する。(秒数)"
45
45
  :type 'integer
46
46
  :group 'sekka)
47
47
 
48
48
  (defcustom sekka-stop-chars "(){}<> "
49
- "*$B4A;zJQ49J8;zNs$r<h$j9~$`;~$KJQ49HO0O$K4^$a$J$$J8;z$r@_Dj$9$k(B"
49
+ "*漢字変換文字列を取り込む時に変換範囲に含めない文字を設定する"
50
50
  :type 'string
51
51
  :group 'sekka)
52
52
 
53
53
  (defcustom sekka-curl "curl"
54
- "curl$B%3%^%s%I$N@dBP%Q%9$r@_Dj$9$k(B"
54
+ "curlコマンドの絶対パスを設定する"
55
55
  :type 'string
56
56
  :group 'sekka)
57
57
 
58
58
  (defcustom sekka-use-viper nil
59
- "*Non-nil $B$G$"$l$P!"(BVIPER $B$KBP1~$9$k(B"
59
+ "*Non-nil であれば、VIPER に対応する"
60
60
  :type 'boolean
61
61
  :group 'sekka)
62
62
 
63
63
  (defcustom sekka-realtime-guide-running-seconds 30
64
- "$B%j%"%k%?%$%`%,%$%II=<($N7QB3;~4V(B($BIC?t(B)$B!&%<%m$G%,%$%II=<(5!G=$,L58z$K$J$k(B"
64
+ "リアルタイムガイド表示の継続時間(秒数)・ゼロでガイド表示機能が無効になる"
65
65
  :type 'integer
66
66
  :group 'sekka)
67
67
 
68
68
  (defcustom sekka-realtime-guide-limit-lines 5
69
- "$B:G8e$KJQ49$7$?9T$+$i(B N $B9TN%$l$?$i%j%"%k%?%$%`%,%$%II=<($,;_$^$k(B"
69
+ "最後に変換した行から N 行離れたらリアルタイムガイド表示が止まる"
70
70
  :type 'integer
71
71
  :group 'sekka)
72
72
 
73
73
  (defcustom sekka-realtime-guide-interval 0.2
74
- "$B%j%"%k%?%$%`%,%$%II=<($r99?7$9$k;~4V4V3V(B"
74
+ "リアルタイムガイド表示を更新する時間間隔"
75
75
  :type 'integer
76
76
  :group 'sekka)
77
77
 
78
78
  (defcustom sekka-roman-method "normal"
79
- "$B%m!<%^;zF~NOJ}<0$H$7$F!$(Bnormal($BDL>o%m!<%^;z(B)$B$+!"(BAZIK($B3HD%%m!<%^;z(B)$B$N$I$A$i$N2r<a$rM%@h$9$k$+(B"
79
+ "ローマ字入力方式として,normal(通常ローマ字)か、AZIK(拡張ローマ字)のどちらの解釈を優先するか"
80
80
  :type '(choice (const :tag "normal" "normal")
81
81
  (const :tag "AZIK" "azik" ))
82
82
  :group 'sekka)
83
83
 
84
+ (defcustom sekka-history-stack-limit 100
85
+ "再度候補選択できる単語と場所を最大何件記憶するか"
86
+ :type 'integer
87
+ :group 'sekka)
88
+
89
+ (defcustom sekka-keyboard-type "jp"
90
+ "キーボードの指定: 使っているキーボードはjp(日本語106キーボード)、en(英語usキーボード)のどちらか"
91
+ :type '(choice (const :tag "jp106-keyboard" "jp")
92
+ (const :tag "english(us)-keyboard" "en"))
93
+ :group 'sekka)
94
+
84
95
 
85
96
  (defface sekka-guide-face
86
97
  '((((class color) (background light)) (:background "#E0E0E0" :foreground "#F03030")))
87
- "$B%j%"%k%?%$%`%,%$%I$N%U%'%$%9(B($BAu>~!"?'$J$I$N;XDj(B)"
98
+ "リアルタイムガイドのフェイス(装飾、色などの指定)"
88
99
  :group 'sekka)
89
100
 
90
101
 
91
- (defvar sekka-sticky-shift nil "*Non-nil $B$G$"$l$P!"(BSticky-Shift$B$rM-8z$K$9$k(B")
92
- (defvar sekka-mode nil "$B4A;zJQ49%H%0%kJQ?t(B")
102
+ (defvar sekka-sticky-shift nil "*Non-nil であれば、Sticky-Shiftを有効にする")
103
+ (defvar sekka-mode nil "漢字変換トグル変数")
93
104
  (defvar sekka-mode-line-string " Sekka")
94
- (defvar sekka-select-mode nil "$B8uJdA*Br%b!<%IJQ?t(B")
105
+ (defvar sekka-select-mode nil "候補選択モード変数")
95
106
  (or (assq 'sekka-mode minor-mode-alist)
96
107
  (setq minor-mode-alist (cons
97
108
  '(sekka-mode sekka-mode-line-string)
98
109
  minor-mode-alist)))
99
110
 
100
111
 
101
- ;; $B%m!<%^;z4A;zJQ49;~!"BP>]$H$9$k%m!<%^;z$r@_Dj$9$k$?$a$NJQ?t(B
102
- (defvar sekka-skip-chars "a-zA-Z0-9.,@:`\\-+!\\[\\]?;")
103
- (defvar sekka-mode-map (make-sparse-keymap) "$B4A;zJQ49%H%0%k%^%C%W(B")
104
- (defvar sekka-select-mode-map (make-sparse-keymap) "$B8uJdA*Br%b!<%I%^%C%W(B")
112
+ ;; ローマ字漢字変換時、対象とするローマ字を設定するための変数
113
+ (defvar sekka-skip-chars "a-zA-Z0-9.,@:`\\-+!\\[\\]?;'")
114
+ (defvar sekka-mode-map (make-sparse-keymap) "漢字変換トグルマップ")
115
+ (defvar sekka-select-mode-map (make-sparse-keymap) "候補選択モードマップ")
105
116
  (defvar sekka-rK-trans-key "\C-j"
106
- "*$B4A;zJQ49%-!<$r@_Dj$9$k(B")
117
+ "*漢字変換キーを設定する")
107
118
  (or (assq 'sekka-mode minor-mode-map-alist)
108
119
  (setq minor-mode-map-alist
109
120
  (append (list (cons 'sekka-mode sekka-mode-map)
@@ -122,11 +133,11 @@
122
133
  (defconst sekka-kind-index 3)
123
134
  (defconst sekka-id-index 4)
124
135
 
125
- ;;--- $B%G%P%C%0%a%C%;!<%8=PNO(B
126
- (defvar sekka-psudo-server nil) ; $B%/%i%$%"%s%HC1BN$G2>A[E*$K%5!<%P!<$K@\B3$7$F$$$k$h$&$K$7$F%F%9%H$9$k%b!<%I(B
136
+ ;;--- デバッグメッセージ出力
137
+ (defvar sekka-psudo-server nil) ; クライアント単体で仮想的にサーバーに接続しているようにしてテストするモード
127
138
 
128
- ;;--- $B%G%P%C%0%a%C%;!<%8=PNO(B
129
- (defvar sekka-debug nil) ; $B%G%P%C%0%U%i%0(B
139
+ ;;--- デバッグメッセージ出力
140
+ (defvar sekka-debug nil) ; デバッグフラグ
130
141
  (defun sekka-debug-print (string)
131
142
  (if sekka-debug
132
143
  (let
@@ -136,29 +147,41 @@
136
147
  (insert string)))))
137
148
 
138
149
 
139
- ;;; sekka basic output
140
- (defvar sekka-fence-start nil) ; fence $B;OC<0LCV(B
141
- (defvar sekka-fence-end nil) ; fence $B=*C<0LCV(B
150
+ ;;; 候補選択モード用
151
+ (defvar sekka-history-stack '()) ; 過去に変換した、場所と変換候補の状態を保存しておくスタック
152
+ ;; データ構造は以下の通り。
153
+ ;; alistのlistとなる。 alistのキーは、sekka-* というバッファローカル変数のバックアップとなる)
154
+ ;; 新しいものは先頭に追加され、検索も先頭から行われる。即ち、古い情報も残るがいつかstackのlimitを超えるとあふれて捨てられる。
155
+ ;;(
156
+ ;; (
157
+ ;; (bufname . "*scratch*")
158
+ ;; (markers . '(#<marker at 192 in *scratch*> . #<marker at 194 in *scratch*>))
159
+ ;; (cand-cur . 0)
160
+ ;; (cand-cur-backup . 0)
161
+ ;; (cand-len . 0)
162
+ ;; (last-fix . 0)
163
+ ;; (henkan-kouho-list . '())
164
+ ;; ))
165
+ (defvar sekka-fence-start nil) ; fence 始端marker
166
+ (defvar sekka-fence-end nil) ; fence 終端marker
142
167
  (defvar sekka-henkan-separeter " ") ; fence mode separeter
143
- (defvar sekka-henkan-buffer nil) ; $BI=<(MQ%P%C%U%!(B
144
- (defvar sekka-henkan-length nil) ; $BI=<(MQ%P%C%U%!D9(B
145
- (defvar sekka-henkan-revpos nil) ; $BJ8@a;OC<0LCV(B
146
- (defvar sekka-henkan-revlen nil) ; $BJ8@aD9(B
147
-
148
- ;;; sekka basic local
149
- (defvar sekka-cand-cur 0) ; $B%+%l%s%H8uJdHV9f(B
150
- (defvar sekka-cand-cur-backup 0) ; $B%+%l%s%H8uJdHV9f(B(UNDO$BMQ$KB`Hr$9$kJQ?t(B)
151
- (defvar sekka-cand-len nil) ; $B8uJd?t(B
152
- (defvar sekka-last-fix "") ; $B:G8e$K3NDj$7$?J8;zNs(B
153
- (defvar sekka-henkan-kouho-list nil) ; $BJQ497k2L%j%9%H(B($B%5!<%P$+$i5"$C$F$-$?%G!<%?$=$N$b$N(B)
154
- (defvar sekka-markers '()) ; $BJ8@a3+;O!"=*N;0LCV$N(Bpair: $B<!$N$h$&$J7A<0(B ( 1 . 2 )
155
- (defvar sekka-timer nil) ; $B%$%s%?!<%P%k%?%$%^!<7?JQ?t(B
156
- (defvar sekka-timer-rest 0) ; $B$"$H2?2s8F=P$5$l$?$i!"%$%s%?!<%P%k%?%$%^$N8F=P$r;_$a$k$+(B
157
- (defvar sekka-last-lineno 0) ; $B:G8e$KJQ49$r<B9T$7$?9THV9f(B
158
- (defvar sekka-guide-overlay nil) ; $B%j%"%k%?%$%`%,%$%I$K;HMQ$9$k%*!<%P!<%l%$(B
159
- (defvar sekka-last-request-time 0) ; Sekka$B%5!<%P!<$K%j%/%(%9%H$7$?:G8e$N;~9o(B($BC10L$OIC(B)
160
- (defvar sekka-guide-lastquery "") ; Sekka$B%5!<%P!<$K%j%/%(%9%H$7$?:G8e$N%/%(%jJ8;zNs(B
161
- (defvar sekka-guide-lastresult '()) ; Sekka$B%5!<%P!<$K%j%/%(%9%H$7$?:G8e$N%/%(%jJ8;zNs(B
168
+ (defvar sekka-cand-cur 0) ; カレント候補番号
169
+ (defvar sekka-cand-cur-backup 0) ; カレント候補番号(UNDO用に退避する変数)
170
+ (defvar sekka-cand-len nil) ; 候補数
171
+ (defvar sekka-last-fix "") ; 最後に確定した文字列
172
+ (defvar sekka-henkan-kouho-list nil) ; 変換結果リスト(サーバから帰ってきたデータそのもの)
173
+
174
+
175
+ ;; その他
176
+ (defvar sekka-markers '()) ; 単語の開始、終了位置のpair。 次のような形式で保存する ( 1 . 2 )
177
+ (defvar sekka-timer nil) ; インターバルタイマー型変数
178
+ (defvar sekka-timer-rest 0) ; あと何回呼出されたら、インターバルタイマの呼出を止めるか
179
+ (defvar sekka-last-lineno 0) ; 最後に変換を実行した行番号
180
+ (defvar sekka-guide-overlay nil) ; リアルタイムガイドに使用するオーバーレイ
181
+ (defvar sekka-last-request-time 0) ; Sekkaサーバーにリクエストした最後の時刻(単位は秒)
182
+ (defvar sekka-guide-lastquery "") ; Sekkaサーバーにリクエストした最後のクエリ文字列
183
+ (defvar sekka-guide-lastresult '()) ; Sekkaサーバーにリクエストした最後のクエリ結果
184
+
162
185
 
163
186
 
164
187
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -180,7 +203,17 @@
180
203
 
181
204
 
182
205
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
183
- ;; $BI=<(7O4X?t72(B
206
+ ;; ユーティリティ
207
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
208
+ (defun sekka-assoc-ref (key alist fallback)
209
+ (let ((entry (assoc key alist)))
210
+ (if entry
211
+ (cdr entry)
212
+ fallback)))
213
+
214
+
215
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
216
+ ;; 表示系関数群
184
217
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
185
218
  (defvar sekka-use-fence t)
186
219
  (defvar sekka-use-color nil)
@@ -188,10 +221,10 @@
188
221
  (defvar sekka-init nil)
189
222
 
190
223
  ;;
191
- ;; $B=i4|2=(B
224
+ ;; 初期化
192
225
  ;;
193
226
  (defun sekka-init ()
194
- ;; $B:G=i$N(B n $B7o$N%j%9%H$r<hF@$9$k(B
227
+ ;; 最初の n 件のリストを取得する
195
228
  (defun sekka-take (arg-list n)
196
229
  (let ((lst '()))
197
230
  (dotimes (i n (reverse lst))
@@ -200,15 +233,15 @@
200
233
  (push item lst))))))
201
234
 
202
235
  (when (not sekka-init)
203
- ;; $B%f!<%6!<8lWC$N%m!<%I(B + $B%5!<%P!<$X$NEPO?(B
236
+ ;; ユーザー語彙のロード + サーバーへの登録
204
237
  (sekka-register-userdict-internal)
205
238
 
206
- ;; Emacs$B=*N;;~$N=hM}(B
239
+ ;; Emacs終了時の処理
207
240
  (add-hook 'kill-emacs-hook
208
241
  (lambda ()
209
- ;; $B2?$b$9$k$3$H$OL5$$(B
242
+ ;; 何もすることは無い
210
243
  t))
211
- ;; $B=i4|2=40N;(B
244
+ ;; 初期化完了
212
245
  (setq sekka-init t)))
213
246
 
214
247
 
@@ -232,10 +265,10 @@
232
265
  )))
233
266
 
234
267
  ;;
235
- ;; $B%m!<%^;z$G=q$+$l$?J8>O$r(BSekka$B%5!<%P!<$r;H$C$FJQ49$9$k(B
268
+ ;; ローマ字で書かれた文章をSekkaサーバーを使って変換する
236
269
  ;;
237
- ;; arg-alist$B$N0z?t$N7A<0(B
238
- ;; $BNc(B:
270
+ ;; arg-alistの引数の形式
271
+ ;; 例:
239
272
  ;; '(
240
273
  ;; ("yomi" . "kanji")
241
274
  ;; ("limit" . 2)
@@ -243,10 +276,10 @@
243
276
  ;; )
244
277
  (defun sekka-rest-request (func-name arg-alist)
245
278
  (if sekka-psudo-server
246
- ;; $B%/%i%$%"%s%HC1BN$G2>A[E*$K%5!<%P!<$K@\B3$7$F$$$k$h$&$K$7$F%F%9%H$9$k%b!<%I(B
247
- "((\"$BJQ49(B\" nil \"$B$X$s$+$s(B\" j 0) (\"$BJQ2=(B\" nil \"$B$X$s$+(B\" j 1) (\"$B%X%s%+%s(B\" nil \"$B$X$s$+$s(B\" k 2) (\"$B$X$s$+$s(B\" nil \"$B$X$s$+$s(B\" h 3))"
248
- ;;"((\"$BJQ49(B\" nil \"$B$X$s$+$s(B\" j 0) (\"$BJQ2=(B\" nil \"$B$X$s$+(B\" j 1))"
249
- ;; $B<B:]$N%5!<%P$K@\B3$9$k(B
279
+ ;; クライアント単体で仮想的にサーバーに接続しているようにしてテストするモード
280
+ "((\"変換\" nil \"へんかん\" j 0) (\"変化\" nil \"へんか\" j 1) (\"ヘンカン\" nil \"へんかん\" k 2) (\"へんかん\" nil \"へんかん\" h 3))"
281
+ ;;"((\"変換\" nil \"へんかん\" j 0) (\"変化\" nil \"へんか\" j 1))"
282
+ ;; 実際のサーバに接続する
250
283
  (let ((command
251
284
  (concat
252
285
  sekka-curl " --silent --show-error "
@@ -270,7 +303,7 @@
270
303
  result))))
271
304
 
272
305
  ;;
273
- ;; $B8=:_;~9o$r(BUNIX$B%?%$%`$rJV$9(B($BC10L$OIC(B)
306
+ ;; 現在時刻をUNIXタイムを返す(単位は秒)
274
307
  ;;
275
308
  (defun sekka-current-unixtime ()
276
309
  (let (
@@ -282,13 +315,14 @@
282
315
 
283
316
 
284
317
  ;;
285
- ;; $B%m!<%^;z$G=q$+$l$?J8>O$r(BSekka$B%5!<%P!<$r;H$C$FJQ49$9$k(B
318
+ ;; ローマ字で書かれた文章をSekkaサーバーを使って変換する
286
319
  ;;
287
320
  (defun sekka-henkan-request (yomi limit)
288
321
  (sekka-debug-print (format "henkan-input :[%s]\n" yomi))
322
+ (when (string-equal "en" sekka-keyboard-type)
323
+ (setq yomi (replace-regexp-in-string ":" "+" yomi)))
324
+ (sekka-debug-print (format "henkan-send :[%s]\n" yomi))
289
325
 
290
- ;;(message "Requesting to sekka server...")
291
-
292
326
  (let (
293
327
  (result (sekka-rest-request "henkan" `((yomi . ,yomi)
294
328
  (limit . ,limit)
@@ -308,12 +342,12 @@
308
342
  nil))))
309
343
 
310
344
  ;;
311
- ;; $B3NDj$7$?C18l$r%5!<%P!<$KEAC#$9$k(B
345
+ ;; 確定した単語をサーバーに伝達する
312
346
  ;;
313
347
  (defun sekka-kakutei-request (key tango)
314
348
  (sekka-debug-print (format "henkan-kakutei key=[%s] tango=[%s]\n" key tango))
315
349
 
316
- (message "Requesting to sekka server...")
350
+ ;;(message "Requesting to sekka server...")
317
351
 
318
352
  (let ((result (sekka-rest-request "kakutei" `(
319
353
  (key . ,key)
@@ -323,16 +357,16 @@
323
357
  t))
324
358
 
325
359
  ;;
326
- ;; $B%f!<%6!<8lWC$r%5!<%P!<$K:FEYEPO?$9$k!#(B
360
+ ;; ユーザー語彙をサーバーに再度登録する。
327
361
  ;;
328
362
  (defun sekka-register-userdict (&optional arg)
329
- "$B%f!<%6!<<-=q$r%5!<%P!<$K:FEY%"%C%W%m!<%I$9$k(B"
363
+ "ユーザー辞書をサーバーに再度アップロードする"
330
364
  (interactive "P")
331
365
  (sekka-register-userdict-internal))
332
366
 
333
367
 
334
368
  ;;
335
- ;; $B%f!<%6!<8lWC$r%5!<%P!<$KEPO?$9$k!#(B
369
+ ;; ユーザー語彙をサーバーに登録する。
336
370
  ;;
337
371
  (defun sekka-register-userdict-internal ()
338
372
  (let ((str (sekka-get-jisyo-str "~/.sekka-jisyo")))
@@ -345,17 +379,30 @@
345
379
  t))))
346
380
 
347
381
 
382
+ ;;
383
+ ;; ユーザー語彙をサーバーから全て削除する
384
+ ;;
385
+ (defun sekka-flush-userdict (&optional arg)
386
+ "サーバー上のユーザー辞書を全て削除する"
387
+ (interactive "P")
388
+ (message "Requesting to sekka server...")
389
+ (let ((result (sekka-rest-request "flush" `())))
390
+ (sekka-debug-print (format "register-result:%S\n" result))
391
+ (message result)
392
+ t))
393
+
394
+
348
395
  (defun sekka-get-jisyo-str (file &optional nomsg)
349
- "FILE $B$r3+$$$F(B SKK $B<-=q%P%C%U%!$r:n$j!"%P%C%U%!$rJV$9!#(B
350
- $B%*%W%7%g%s0z?t$N(B NOMSG $B$r;XDj$9$k$H%U%!%$%kFI$_9~$_$N:]$N%a%C%;!<%8$rI=<($7$J(B
351
- $B$$!#(B"
396
+ "FILE を開いて SKK 辞書バッファを作り、バッファを返す。
397
+ オプション引数の NOMSG を指定するとファイル読み込みの際のメッセージを表示しな
398
+ い。"
352
399
  (when file
353
400
  (let* ((file (or (car-safe file)
354
401
  file))
355
402
  (file (expand-file-name file)))
356
403
  (if (not (file-exists-p file))
357
404
  (progn
358
- (message (format "SKK $B<-=q(B %s $B$,B8:_$7$^$;$s(B..." file))
405
+ (message (format "SKK 辞書 %s が存在しません..." file))
359
406
  nil)
360
407
  (let ((str "")
361
408
  (buf-name (file-name-nondirectory file)))
@@ -363,14 +410,14 @@
363
410
  (find-file-read-only file)
364
411
  (setq str (with-current-buffer (get-buffer buf-name)
365
412
  (buffer-substring-no-properties (point-min) (point-max))))
366
- (message (format "SKK $B<-=q(B %s $B$r3+$$$F$$$^$9(B...$B40N;!*(B" (file-name-nondirectory file)))
413
+ (message (format "SKK 辞書 %s を開いています...完了!" (file-name-nondirectory file)))
367
414
  (kill-buffer-if-not-modified (get-buffer buf-name)))
368
415
  str)))))
369
416
 
370
417
  ;;(sekka-get-jisyo-str "~/.sekka-jisyo")
371
418
 
372
419
 
373
- ;; $B%]!<%?%V%kJ8;zNsCV49(B( Emacs$B$H(BXEmacs$B$NN>J}$GF0$/(B )
420
+ ;; ポータブル文字列置換( EmacsとXEmacsの両方で動く )
374
421
  (defun sekka-replace-regexp-in-string (regexp replace str)
375
422
  (cond ((featurep 'xemacs)
376
423
  (replace-in-string str regexp replace))
@@ -378,9 +425,9 @@
378
425
  (replace-regexp-in-string regexp replace str))))
379
426
 
380
427
 
381
- ;; $B%j!<%8%g%s$r%m!<%^;z4A;zJQ49$9$k4X?t(B
428
+ ;; リージョンをローマ字漢字変換する関数
382
429
  (defun sekka-henkan-region (b e)
383
- "$B;XDj$5$l$?(B region $B$r4A;zJQ49$9$k(B"
430
+ "指定された region を漢字変換する"
384
431
  (sekka-init)
385
432
  (when (/= b e)
386
433
  (let* (
@@ -391,9 +438,9 @@
391
438
  (condition-case err
392
439
  (progn
393
440
  (setq
394
- ;; $BJQ497k2L$NJ];}(B
441
+ ;; 変換結果の保持
395
442
  sekka-henkan-kouho-list henkan-list
396
- ;; $BJ8@aA*Br=i4|2=(B
443
+ ;; 文節選択初期化
397
444
  sekka-cand-cur 0
398
445
  ;;
399
446
  sekka-cand-len (length henkan-list))
@@ -411,7 +458,7 @@
411
458
  nil))))
412
459
 
413
460
 
414
- ;; $B%+!<%=%kA0$NJ8;z<o$rJV5Q$9$k4X?t(B
461
+ ;; カーソル前の文字種を返却する関数
415
462
  (eval-and-compile
416
463
  (if (>= emacs-major-version 20)
417
464
  (progn
@@ -427,9 +474,9 @@
427
474
 
428
475
 
429
476
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
430
- ;; undo $B>pJs$N@)8f(B
477
+ ;; undo 情報の制御
431
478
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
432
- ;; undo buffer $BB`HrMQJQ?t(B
479
+ ;; undo buffer 退避用変数
433
480
  (defvar sekka-buffer-undo-list nil)
434
481
  (make-variable-buffer-local 'sekka-buffer-undo-list)
435
482
  (defvar sekka-buffer-modified-p nil)
@@ -437,14 +484,14 @@
437
484
 
438
485
  (defvar sekka-blink-cursor nil)
439
486
  (defvar sekka-cursor-type nil)
440
- ;; undo buffer $B$rB`Hr$7!"(Bundo $B>pJs$NC_@Q$rDd;_$9$k4X?t(B
487
+ ;; undo buffer を退避し、undo 情報の蓄積を停止する関数
441
488
  (defun sekka-disable-undo ()
442
489
  (when (not (eq buffer-undo-list t))
443
490
  (setq sekka-buffer-undo-list buffer-undo-list)
444
491
  (setq sekka-buffer-modified-p (buffer-modified-p))
445
492
  (setq buffer-undo-list t)))
446
493
 
447
- ;; $BB`Hr$7$?(B undo buffer $B$rI|5"$7!"(Bundo $B>pJs$NC_@Q$r:F3+$9$k4X?t(B
494
+ ;; 退避した undo buffer を復帰し、undo 情報の蓄積を再開する関数
448
495
  (defun sekka-enable-undo ()
449
496
  (when (not sekka-buffer-modified-p) (set-buffer-modified-p nil))
450
497
  (when sekka-buffer-undo-list
@@ -452,10 +499,10 @@
452
499
 
453
500
 
454
501
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
455
- ;; $B8=:_$NJQ49%(%j%"$NI=<($r9T$&(B
502
+ ;; 現在の変換エリアの表示を行う
456
503
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
457
504
  (defun sekka-get-display-string ()
458
- ;; $BJQ497k2LJ8;zNs$rJV$9!#(B
505
+ ;; 変換結果文字列を返す。
459
506
  (let* ((kouho (nth sekka-cand-cur sekka-henkan-kouho-list))
460
507
  (_ (sekka-debug-print (format "sekka-cand-cur=%s\n" sekka-cand-cur)))
461
508
  (_ (sekka-debug-print (format "kouho=%s\n" kouho)))
@@ -467,17 +514,17 @@
467
514
  (defun sekka-display-function (b e select-mode)
468
515
  (setq sekka-henkan-separeter (if sekka-use-fence " " ""))
469
516
  (when sekka-henkan-kouho-list
470
- ;; UNDO$BM^@)3+;O(B
517
+ ;; UNDO抑制開始
471
518
  (sekka-disable-undo)
472
519
 
473
520
  (delete-region b e)
474
521
 
475
- ;; $B%j%9%H=i4|2=(B
522
+ ;; リスト初期化
476
523
  (setq sekka-markers '())
477
524
 
478
525
  (setq sekka-last-fix "")
479
526
 
480
- ;; $BJQ49$7$?(Bpoint$B$NJ];}(B
527
+ ;; 変換したpointの保持
481
528
  (setq sekka-fence-start (point-marker))
482
529
  (when select-mode (insert "|"))
483
530
 
@@ -492,29 +539,29 @@
492
539
  (let* ((end (point-marker))
493
540
  (ov (make-overlay start end)))
494
541
 
495
- ;; $B3NDjJ8;zNs$N:n@.(B
542
+ ;; 確定文字列の作成
496
543
  (setq sekka-last-fix insert-word)
497
544
 
498
- ;; $BA*BrCf$N>l=j$rAu>~$9$k!#(B
545
+ ;; 選択中の場所を装飾する。
499
546
  (overlay-put ov 'face 'default)
500
547
  (when select-mode
501
548
  (overlay-put ov 'face 'highlight))
502
549
  (setq sekka-markers (cons start end))
503
550
  (sekka-debug-print (format "insert:[%s] point:%d-%d\n" insert-word (marker-position start) (marker-position end))))))
504
551
 
505
- ;; fence$B$NHO0O$r@_Dj$9$k(B
552
+ ;; fenceの範囲を設定する
506
553
  (when select-mode (insert "|"))
507
554
  (setq sekka-fence-end (point-marker))
508
555
 
509
556
  (sekka-debug-print (format "total-point:%d-%d\n"
510
557
  (marker-position sekka-fence-start)
511
558
  (marker-position sekka-fence-end)))
512
- ;; UNDO$B:F3+(B
559
+ ;; UNDO再開
513
560
  (sekka-enable-undo)))
514
561
 
515
562
 
516
563
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
517
- ;; $BJQ498uJdA*Br%b!<%I(B
564
+ ;; 変換候補選択モード
518
565
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
519
566
  (let ((i 0))
520
567
  (while (<= i ?\177)
@@ -537,14 +584,14 @@
537
584
 
538
585
 
539
586
 
540
- ;; $BJQ49$r3NDj$7F~NO$5$l$?%-!<$r:FF~NO$9$k4X?t(B
587
+ ;; 変換を確定し入力されたキーを再入力する関数
541
588
  (defun sekka-kakutei-and-self-insert (arg)
542
- "$B8uJdA*Br$r3NDj$7!"F~NO$5$l$?J8;z$rF~NO$9$k(B"
589
+ "候補選択を確定し、入力された文字を入力する"
543
590
  (interactive "P")
544
591
  (sekka-select-kakutei)
545
592
  (setq unread-command-events (list last-command-event)))
546
593
 
547
- ;; $B8uJdA*Br>uBV$G$NI=<(99?7(B
594
+ ;; 候補選択状態での表示更新
548
595
  (defun sekka-select-update-display ()
549
596
  (sekka-display-function
550
597
  (marker-position sekka-fence-start)
@@ -552,13 +599,13 @@
552
599
  sekka-select-mode))
553
600
 
554
601
 
555
- ;; $B8uJdA*Br$r3NDj$9$k(B
602
+ ;; 候補選択を確定する
556
603
  (defun sekka-select-kakutei ()
557
- "$B8uJdA*Br$r3NDj$9$k(B"
604
+ "候補選択を確定する"
558
605
  (interactive)
559
- ;; $B8uJdHV9f%j%9%H$r%P%C%/%"%C%W$9$k!#(B
606
+ ;; 候補番号リストをバックアップする。
560
607
  (setq sekka-cand-cur-backup sekka-cand-cur)
561
- ;; $B%5!<%P!<$K3NDj$7$?C18l$rEA$($k(B($B<-=q3X=,(B)
608
+ ;; サーバーに確定した単語を伝える(辞書学習)
562
609
  (let* ((kouho (nth sekka-cand-cur sekka-henkan-kouho-list))
563
610
  (_ (sekka-debug-print (format "2:sekka-cand-cur=%s\n" sekka-cand-cur)))
564
611
  (_ (sekka-debug-print (format "2:kouho=%s\n" kouho)))
@@ -569,41 +616,44 @@
569
616
  (sekka-kakutei-request key tango)))
570
617
  (setq sekka-select-mode nil)
571
618
  (run-hooks 'sekka-select-mode-end-hook)
572
- (sekka-select-update-display))
619
+ (sekka-select-update-display)
620
+ (sekka-history-push))
573
621
 
574
622
 
575
- ;; $B8uJdA*Br$r%-%c%s%;%k$9$k(B
623
+ ;; 候補選択をキャンセルする
576
624
  (defun sekka-select-cancel ()
577
- "$B8uJdA*Br$r%-%c%s%;%k$9$k(B"
625
+ "候補選択をキャンセルする"
578
626
  (interactive)
579
- ;; $B%+%l%s%H8uJdHV9f$r%P%C%/%"%C%W$7$F$$$?8uJdHV9f$GI|85$9$k!#(B
627
+ ;; カレント候補番号をバックアップしていた候補番号で復元する。
580
628
  (setq sekka-cand-cur sekka-cand-cur-backup)
581
629
  (setq sekka-select-mode nil)
582
630
  (run-hooks 'sekka-select-mode-end-hook)
583
- (sekka-select-update-display))
631
+ (sekka-select-update-display)
632
+ (sekka-history-push))
633
+
584
634
 
585
- ;; $BA0$N8uJd$K?J$a$k(B
635
+ ;; 前の候補に進める
586
636
  (defun sekka-select-prev ()
587
- "$BA0$N8uJd$K?J$a$k(B"
637
+ "前の候補に進める"
588
638
  (interactive)
589
- ;; $BA0$N8uJd$K@Z$j$+$($k(B
639
+ ;; 前の候補に切りかえる
590
640
  (decf sekka-cand-cur)
591
641
  (when (> 0 sekka-cand-cur)
592
642
  (setq sekka-cand-cur (- sekka-cand-len 1)))
593
643
  (sekka-select-update-display))
594
644
 
595
- ;; $B<!$N8uJd$K?J$a$k(B
645
+ ;; 次の候補に進める
596
646
  (defun sekka-select-next ()
597
- "$B<!$N8uJd$K?J$a$k(B"
647
+ "次の候補に進める"
598
648
  (interactive)
599
- ;; $B<!$N8uJd$K@Z$j$+$($k(B
649
+ ;; 次の候補に切りかえる
600
650
  (setq sekka-cand-cur
601
651
  (if (< sekka-cand-cur (- sekka-cand-len 1))
602
652
  (+ sekka-cand-cur 1)
603
653
  0))
604
654
  (sekka-select-update-display))
605
655
 
606
- ;; $B;XDj$5$l$?(B type $B$N8uJd$rH4$-=P$9(B
656
+ ;; 指定された type の候補を抜き出す
607
657
  (defun sekka-select-by-type-filter ( _type )
608
658
  (let ((lst '()))
609
659
  (mapcar
@@ -615,67 +665,163 @@
615
665
  (sekka-debug-print (format "filterd-lst = %S" (reverse lst)))
616
666
  (car (reverse lst))))
617
667
 
618
- ;; $B;XDj$5$l$?(B type $B$N8uJd$K6/@)E*$K@Z$j$+$($k(B
668
+ ;; 指定された type の候補に強制的に切りかえる
619
669
  (defun sekka-select-by-type ( _type )
620
670
  (let ((kouho (sekka-select-by-type-filter _type)))
621
671
  (if (null kouho)
622
672
  (cond
623
673
  ((eq _type 'j)
624
- (message "Sekka: $B4A;z$N8uJd$O$"$j$^$;$s!#(B"))
674
+ (message "Sekka: 漢字の候補はありません。"))
625
675
  ((eq _type 'h)
626
- (message "Sekka: $B$R$i$,$J$N8uJd$O$"$j$^$;$s!#(B"))
676
+ (message "Sekka: ひらがなの候補はありません。"))
627
677
  ((eq _type 'k)
628
- (message "Sekka: $B%+%?%+%J$N8uJd$O$"$j$^$;$s!#(B"))
678
+ (message "Sekka: カタカナの候補はありません。"))
629
679
  ((eq _type 'l)
630
- (message "Sekka: $BH>3Q$N8uJd$O$"$j$^$;$s!#(B"))
680
+ (message "Sekka: 半角の候補はありません。"))
631
681
  ((eq _type 'z)
632
- (message "Sekka: $BA43Q$N8uJd$O$"$j$^$;$s!#(B")))
682
+ (message "Sekka: 全角の候補はありません。")))
633
683
  (let ((num (nth sekka-id-index kouho)))
634
684
  (setq sekka-cand-cur num)
635
685
  (sekka-select-update-display)))))
636
686
 
637
687
  (defun sekka-select-kanji ()
638
- "$B4A;z8uJd$K6/@)E*$K@Z$j$+$($k(B"
688
+ "漢字候補に強制的に切りかえる"
639
689
  (interactive)
640
690
  (sekka-select-by-type 'j))
641
691
 
642
692
  (defun sekka-select-hiragana ()
643
- "$B$R$i$,$J8uJd$K6/@)E*$K@Z$j$+$($k(B"
693
+ "ひらがな候補に強制的に切りかえる"
644
694
  (interactive)
645
695
  (sekka-select-by-type 'h))
646
696
 
647
697
  (defun sekka-select-katakana ()
648
- "$B%+%?%+%J8uJd$K6/@)E*$K@Z$j$+$($k(B"
698
+ "カタカナ候補に強制的に切りかえる"
649
699
  (interactive)
650
700
  (sekka-select-by-type 'k))
651
701
 
652
702
  (defun sekka-select-hankaku ()
653
- "$BH>3Q8uJd$K6/@)E*$K@Z$j$+$($k(B"
703
+ "半角候補に強制的に切りかえる"
654
704
  (interactive)
655
705
  (sekka-select-by-type 'l))
656
706
 
657
707
  (defun sekka-select-zenkaku ()
658
- "$BH>3Q8uJd$K6/@)E*$K@Z$j$+$($k(B"
708
+ "半角候補に強制的に切りかえる"
659
709
  (interactive)
660
710
  (sekka-select-by-type 'z))
661
711
 
712
+
662
713
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
663
- ;; $B%m!<%^;z4A;zJQ494X?t(B
714
+ ;; 変換履歴操作関数
715
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
716
+
717
+ (defun sekka-history-gc ()
718
+ ;; sekka-history-stack中の無効なマークを持つエントリを削除する
719
+ (let ((temp-list '()))
720
+ (mapcar
721
+ (lambda (alist)
722
+ (let ((markers (sekka-assoc-ref 'markers alist nil)))
723
+ (when (and (marker-position (car markers)) ;; 存在するバッファを指しているか
724
+ (marker-position (cdr markers)))
725
+ (if (= (marker-position (car markers))
726
+ (marker-position (cdr markers)))
727
+ ;; マークの開始と終了が同じ位置を指している場合は、
728
+ ;; そのマークは既に無効(選択モードの再表示で一旦マーク周辺の文字列が削除された)
729
+ (progn
730
+ (set-marker (car markers) nil)
731
+ (set-marker (cdr markers) nil))
732
+ (push alist temp-list)))))
733
+ sekka-history-stack)
734
+
735
+ ;; temp-list から limit 件数だけコピーする
736
+ (setq sekka-history-stack '())
737
+ (mapcar
738
+ (lambda (alist)
739
+ (when (< (length sekka-history-stack)
740
+ sekka-history-stack-limit)
741
+ (push alist sekka-history-stack)))
742
+ (reverse temp-list))))
743
+
744
+
745
+ ;;確定ヒストリから、指定_pointに変換済の単語が埋まっているかどうか調べる
746
+ ;; t か nil を返す。
747
+ ;; また、_load に 真を渡すと、見付かった情報で、現在の変換候補変数にロードしてくれる。
748
+ (defun sekka-history-search (_point _load)
749
+ (sekka-history-gc)
750
+
751
+ ;; カーソル位置に有効な変換済エントリがあるか探す
752
+ (let ((found nil))
753
+ (mapcar
754
+ (lambda (alist)
755
+ (let* ((markers (sekka-assoc-ref 'markers alist nil))
756
+ (last-fix (sekka-assoc-ref 'last-fix alist ""))
757
+ (end (marker-position (cdr markers)))
758
+ (start (- end (length last-fix)))
759
+ (bufname (sekka-assoc-ref 'bufname alist ""))
760
+ (pickup (if (string-equal bufname (buffer-name))
761
+ (buffer-substring start end)
762
+ "")))
763
+ (sekka-debug-print (format "sekka-history-search bufname: [%s]\n" bufname))
764
+ (sekka-debug-print (format "sekka-history-search (point): %d\n" (point)))
765
+ (sekka-debug-print (format "sekka-history-search range: %d-%d\n" start end))
766
+ (sekka-debug-print (format "sekka-history-search last-fix: [%s]\n" last-fix))
767
+ (sekka-debug-print (format "sekka-history-search pickup: [%s]\n" pickup))
768
+ (when (and
769
+ (string-equal bufname (buffer-name))
770
+ (< start (point))
771
+ (<= (point) end)
772
+ (string-equal last-fix pickup))
773
+ (setq found t)
774
+ (when _load
775
+ (setq sekka-markers (cons
776
+ (move-marker (car markers) start)
777
+ (cdr markers)))
778
+ (setq sekka-cand-cur (sekka-assoc-ref 'cand-cur alist nil))
779
+ (setq sekka-cand-cur-backup (sekka-assoc-ref 'cand-cur-backup alist nil))
780
+ (setq sekka-cand-len (sekka-assoc-ref 'cand-len alist nil))
781
+ (setq sekka-last-fix pickup)
782
+ (setq sekka-henkan-kouho-list (sekka-assoc-ref 'henkan-kouho-list alist nil))
783
+
784
+ (sekka-debug-print (format "sekka-history-search : sekka-markers : %S\n" sekka-markers))
785
+ (sekka-debug-print (format "sekka-history-search : sekka-cand-cur : %S\n" sekka-cand-cur))
786
+ (sekka-debug-print (format "sekka-history-search : sekka-cand-cur-backup : %S\n" sekka-cand-cur-backup))
787
+ (sekka-debug-print (format "sekka-history-search : sekka-cand-len %S\n" sekka-cand-len))
788
+ (sekka-debug-print (format "sekka-history-search : sekka-last-fix %S\n" sekka-last-fix))
789
+ (sekka-debug-print (format "sekka-history-search : sekka-henkan-kouho-list %S\n" sekka-henkan-kouho-list)))
790
+ )))
791
+ sekka-history-stack)
792
+ found))
793
+
794
+ (defun sekka-history-push ()
795
+ (push
796
+ `(
797
+ (markers . ,sekka-markers )
798
+ (cand-cur . ,sekka-cand-cur )
799
+ (cand-cur-backup . ,sekka-cand-cur-backup )
800
+ (cand-len . ,sekka-cand-len )
801
+ (last-fix . ,sekka-last-fix )
802
+ (henkan-kouho-list . ,sekka-henkan-kouho-list )
803
+ (bufname . ,(buffer-name)))
804
+ sekka-history-stack)
805
+ (sekka-debug-print (format "sekka-history-push result: %S\n" sekka-history-stack)))
806
+
807
+
808
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
809
+ ;; ローマ字漢字変換関数
664
810
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
665
811
  (defun sekka-rK-trans ()
666
- "$B%m!<%^;z4A;zJQ49$r$9$k!#(B
667
- $B!&%+!<%=%k$+$i9TF,J}8~$K%m!<%^;zNs$,B3$/HO0O$G%m!<%^;z4A;zJQ49$r9T$&!#(B"
812
+ "ローマ字漢字変換をする。
813
+ ・カーソルから行頭方向にローマ字列が続く範囲でローマ字漢字変換を行う。"
668
814
  (interactive)
669
815
  ; (print last-command) ; DEBUG
670
816
 
671
817
  (cond
672
- ;; $B%?%$%^!<%$%Y%s%H$r@_Dj$7$J$$>r7o(B
818
+ ;; タイマーイベントを設定しない条件
673
819
  ((or
674
820
  sekka-timer
675
821
  (> 1 sekka-realtime-guide-running-seconds)
676
822
  ))
677
823
  (t
678
- ;; $B%?%$%^!<%$%Y%s%H4X?t$NEPO?(B
824
+ ;; タイマーイベント関数の登録
679
825
  (progn
680
826
  (let
681
827
  ((ov-point
@@ -688,18 +834,18 @@
688
834
  (run-at-time 0.1 sekka-realtime-guide-interval
689
835
  'sekka-realtime-guide)))))
690
836
 
691
- ;; $B%,%$%II=<(7QB32s?t$N99?7(B
837
+ ;; ガイド表示継続回数の更新
692
838
  (when (< 0 sekka-realtime-guide-running-seconds)
693
839
  (setq sekka-timer-rest
694
840
  (/ sekka-realtime-guide-running-seconds
695
841
  sekka-realtime-guide-interval)))
696
842
 
697
- ;; $B:G8e$KJQ49$7$?9THV9f$N99?7(B
843
+ ;; 最後に変換した行番号の更新
698
844
  (setq sekka-last-lineno (line-number-at-pos (point)))
699
845
 
700
846
  (cond
701
847
  (sekka-select-mode
702
- ;; $BJQ49Cf$K8F=P$5$l$?$i!"8uJdA*Br%b!<%I$K0\9T$9$k!#(B
848
+ ;; 候補選択モード中に呼出されたら、keymapから再度候補選択モードに入る
703
849
  (funcall (lookup-key sekka-select-mode-map sekka-rK-trans-key)))
704
850
 
705
851
 
@@ -707,11 +853,11 @@
707
853
  (cond
708
854
 
709
855
  ((eq (sekka-char-charset (preceding-char)) 'ascii)
710
- ;; $B%+!<%=%kD>A0$,(B alphabet $B$@$C$?$i(B
856
+ ;; カーソル直前が alphabet だったら
711
857
  (let ((end (point))
712
858
  (gap (sekka-skip-chars-backward)))
713
859
  (when (/= gap 0)
714
- ;; $B0UL#$N$"$kF~NO$,8+$D$+$C$?$N$GJQ49$9$k(B
860
+ ;; 意味のある入力が見つかったので変換する
715
861
  (let (
716
862
  (b (+ end gap))
717
863
  (e end))
@@ -729,47 +875,41 @@
729
875
 
730
876
  ((sekka-kanji (preceding-char))
731
877
 
732
- ;; $B%+!<%=%kD>A0$,(B $BA43Q$G4A;z0J30(B $B$@$C$?$i8uJdA*Br%b!<%I$K0\9T$9$k!#(B
733
- ;; $B$^$?!":G8e$K3NDj$7$?J8;zNs$HF1$8$+$I$&$+$b3NG'$9$k!#(B
734
- (when (and
735
- (<= (marker-position sekka-fence-start) (point))
736
- (<= (point) (marker-position sekka-fence-end))
737
- (string-equal sekka-last-fix (buffer-substring
738
- (marker-position sekka-fence-start)
739
- (marker-position sekka-fence-end))))
740
- ;; $BD>A0$KJQ49$7$?(Bfence$B$NHO0O$KF~$C$F$$$?$i!"JQ49%b!<%I$K0\9T$9$k!#(B
878
+ ;; カーソル直前が 全角で漢字以外 だったら候補選択モードに移行する。
879
+ ;; また、最後に確定した文字列と同じかどうかも確認する。
880
+ (when (sekka-history-search (point) t)
881
+ ;; 直前に変換したfenceの範囲に入っていたら、候補選択モードに移行する。
741
882
  (setq sekka-select-mode t)
742
883
  (sekka-debug-print "henkan mode ON\n")
743
-
744
- ;; $BI=<(>uBV$r8uJdA*Br%b!<%I$K@ZBX$($k!#(B
884
+
885
+ ;; 表示状態を候補選択モードに切替える。
745
886
  (sekka-display-function
746
- (marker-position sekka-fence-start)
747
- (marker-position sekka-fence-end)
748
- t))))
749
- )))
887
+ (marker-position (car sekka-markers))
888
+ (marker-position (cdr sekka-markers))
889
+ t)))))))
750
890
 
751
891
 
752
892
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
753
- ;; $B%-%c%T%?%i%$%:(B/$B%"%s%-%c%T%?%i%$%:JQ49(B
893
+ ;; キャピタライズ/アンキャピタライズ変換
754
894
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
755
895
  (defun sekka-capitalize-trans ()
756
- "$B%-%c%T%?%i%$%:JQ49$r9T$&(B
757
- $B!&%+!<%=%k$+$i9TF,J}8~$K%m!<%^;zNs$r8+$D$1!"@hF,J8;z$NBgJ8;z>.J8;z$rH?E>$9$k(B"
896
+ "キャピタライズ変換を行う
897
+ ・カーソルから行頭方向にローマ字列を見つけ、先頭文字の大文字小文字を反転する"
758
898
  (interactive)
759
899
 
760
900
  (cond
761
901
  (sekka-select-mode
762
- ;; $B8uJdA*Br%b!<%I$G$OH?1~$7$J$$!#(B
902
+ ;; 候補選択モードでは反応しない。
763
903
  ;; do nothing
764
904
  )
765
905
  ((eq (sekka-char-charset (preceding-char)) 'ascii)
766
- ;; $B%+!<%=%kD>A0$,(B alphabet $B$@$C$?$i(B
906
+ ;; カーソル直前が alphabet だったら
767
907
  (sekka-debug-print "capitalize(2)!\n")
768
908
 
769
909
  (let ((end (point))
770
910
  (gap (sekka-skip-chars-backward)))
771
911
  (when (/= gap 0)
772
- ;; $B0UL#$N$"$kF~NO$,8+$D$+$C$?$N$GJQ49$9$k(B
912
+ ;; 意味のある入力が見つかったので変換する
773
913
  (let* (
774
914
  (b (+ end gap))
775
915
  (e end)
@@ -784,36 +924,36 @@
784
924
  ))
785
925
 
786
926
 
787
- ;; $BA43Q$G4A;z0J30$NH=Dj4X?t(B
927
+ ;; 全角で漢字以外の判定関数
788
928
  (defun sekka-nkanji (ch)
789
929
  (and (eq (sekka-char-charset ch) 'japanese-jisx0208)
790
- (not (string-match "[$B0!(B-$Bt$(B]" (char-to-string ch)))))
930
+ (not (string-match "[亜-瑤]" (char-to-string ch)))))
791
931
 
792
932
  (defun sekka-kanji (ch)
793
933
  (eq (sekka-char-charset ch) 'japanese-jisx0208))
794
934
 
795
935
 
796
- ;; $B%m!<%^;z4A;zJQ49;~!"JQ49BP>]$H$9$k%m!<%^;z$rFI$_Ht$P$94X?t(B
936
+ ;; ローマ字漢字変換時、変換対象とするローマ字を読み飛ばす関数
797
937
  (defun sekka-skip-chars-backward ()
798
938
  (let* (
799
939
  (skip-chars
800
940
  (if auto-fill-function
801
- ;; auto-fill-mode $B$,M-8z$K$J$C$F$$$k>l9g2~9T$,$"$C$F$b(Bskip$B$rB3$1$k(B
941
+ ;; auto-fill-mode が有効になっている場合改行があってもskipを続ける
802
942
  (concat sekka-skip-chars "\n")
803
- ;; auto-fill-mode$B$,L58z$N>l9g$O$=$N$^$^(B
943
+ ;; auto-fill-modeが無効の場合はそのまま
804
944
  sekka-skip-chars))
805
945
 
806
- ;; $B%^!<%/$5$l$F$$$k0LCV$r5a$a$k!#(B
946
+ ;; マークされている位置を求める。
807
947
  (pos (or (and (markerp (mark-marker)) (marker-position (mark-marker)))
808
948
  1))
809
949
 
810
- ;; $B>r7o$K%^%C%A$9$k4V!"A0J}J}8~$K%9%-%C%W$9$k!#(B
950
+ ;; 条件にマッチする間、前方方向にスキップする。
811
951
  (result (save-excursion
812
952
  (skip-chars-backward skip-chars (and (< pos (point)) pos))))
813
953
  (limit-point 0))
814
954
 
815
955
  (if auto-fill-function
816
- ;; auto-fill-mode$B$,M-8z$N;~(B
956
+ ;; auto-fill-modeが有効の時
817
957
  (progn
818
958
  (save-excursion
819
959
  (backward-paragraph)
@@ -830,14 +970,14 @@
830
970
  ;; (sekka-debug-print (format "(point) = %d result = %d limit-point = %d\n" (point) result limit-point))
831
971
  ;; (sekka-debug-print (format "a = %d b = %d \n" (+ (point) result) limit-point))
832
972
 
833
- ;; $B%Q%i%0%i%U0LCV$G%9%H%C%W$9$k(B
973
+ ;; パラグラフ位置でストップする
834
974
  (if (< (+ (point) result) limit-point)
835
975
  (-
836
976
  limit-point
837
977
  (point))
838
978
  result))
839
979
 
840
- ;; auto-fill-mode$B$,L58z$N;~(B
980
+ ;; auto-fill-modeが無効の時
841
981
  (progn
842
982
  (save-excursion
843
983
  (goto-char (point-at-bol))
@@ -852,7 +992,7 @@
852
992
  ;; (sekka-debug-print (format "a = %d b = %d \n" (+ (point) result) limit-point))
853
993
 
854
994
  (if (< (+ (point) result) limit-point)
855
- ;; $B%$%s%G%s%H0LCV$G%9%H%C%W$9$k!#(B
995
+ ;; インデント位置でストップする。
856
996
  (-
857
997
  limit-point
858
998
  (point))
@@ -903,8 +1043,8 @@
903
1043
  (define-key sticky-map sticky-key '(lambda ()(interactive)(insert sticky-key))))
904
1044
 
905
1045
  (defun sekka-realtime-guide ()
906
- "$B%j%"%k%?%$%`$GJQ49Cf$N%,%$%I$r=P$9(B
907
- sekka-mode$B$,(BON$B$N4VCf8F$S=P$5$l$k2DG=@-$,$"$k!#(B"
1046
+ "リアルタイムで変換中のガイドを出す
1047
+ sekka-modeがONの間中呼び出される可能性がある。"
908
1048
  (cond
909
1049
  ((or (null sekka-mode)
910
1050
  (> 1 sekka-timer-rest))
@@ -912,10 +1052,10 @@ sekka-mode$B$,(BON$B$N4VCf8F$S=P$5$l$k2DG=@-$,$"$k!#(B"
912
1052
  (setq sekka-timer nil)
913
1053
  (delete-overlay sekka-guide-overlay))
914
1054
  (sekka-guide-overlay
915
- ;; $B;D$j2s?t$N%G%/%j%a%s%H(B
1055
+ ;; 残り回数のデクリメント
916
1056
  (setq sekka-timer-rest (- sekka-timer-rest 1))
917
1057
 
918
- ;; $B%+!<%=%k$,(Bsekka-realtime-guide-limit-lines $B$r$O$_=P$7$F$$$J$$$+%A%'%C%/(B
1058
+ ;; カーソルがsekka-realtime-guide-limit-lines をはみ出していないかチェック
919
1059
  (sekka-debug-print (format "sekka-last-lineno [%d] : current-line" sekka-last-lineno (line-number-at-pos (point))))
920
1060
  (when (< 0 sekka-realtime-guide-limit-lines)
921
1061
  (let ((diff-lines (abs (- (line-number-at-pos (point)) sekka-last-lineno))))
@@ -930,9 +1070,9 @@ sekka-mode$B$,(BON$B$N4VCf8F$S=P$5$l$k2DG=@-$,$"$k!#(B"
930
1070
  (when (fboundp 'minibufferp)
931
1071
  (minibufferp))
932
1072
  (= gap 0))
933
- ;; $B>e2<%9%Z!<%9$,L5$$(B $B$^$?$O(B $BJQ49BP>]$,L5$7$J$i%,%$%I$OI=<($7$J$$!#(B
1073
+ ;; 上下スペースが無い または 変換対象が無しならガイドは表示しない。
934
1074
  (overlay-put sekka-guide-overlay 'before-string "")
935
- ;; $B0UL#$N$"$kF~NO$,8+$D$+$C$?$N$G%,%$%I$rI=<($9$k!#(B
1075
+ ;; 意味のある入力が見つかったのでガイドを表示する。
936
1076
  (let* (
937
1077
  (b (+ end gap))
938
1078
  (e end)
@@ -971,41 +1111,41 @@ sekka-mode$B$,(BON$B$N4VCf8F$S=P$5$l$k2DG=@-$,$"$k!#(B"
971
1111
 
972
1112
 
973
1113
 
974
- ;; sekka-mode $B$N>uBVJQ994X?t(B
975
- ;; $B@5$N0z?t$N>l9g!">o$K(B sekka-mode $B$r3+;O$9$k(B
976
- ;; {$BIi(B,0}$B$N0z?t$N>l9g!">o$K(B sekka-mode $B$r=*N;$9$k(B
977
- ;; $B0z?tL5$7$N>l9g!"(Bsekka-mode $B$r%H%0%k$9$k(B
1114
+ ;; sekka-mode の状態変更関数
1115
+ ;; 正の引数の場合、常に sekka-mode を開始する
1116
+ ;; {負,0}の引数の場合、常に sekka-mode を終了する
1117
+ ;; 引数無しの場合、sekka-mode をトグルする
978
1118
 
979
- ;; buffer $BKh$K(B sekka-mode $B$rJQ99$9$k(B
1119
+ ;; buffer 毎に sekka-mode を変更する
980
1120
  (defun sekka-mode (&optional arg)
981
- "Sekka mode $B$O(B $B%m!<%^;z$+$iD>@\4A;zJQ49$9$k$?$a$N(B minor mode $B$G$9!#(B
982
- $B0z?t$K@5?t$r;XDj$7$?>l9g$O!"(BSekka mode $B$rM-8z$K$7$^$9!#(B
1121
+ "Sekka mode ローマ字から直接漢字変換するための minor mode です。
1122
+ 引数に正数を指定した場合は、Sekka mode を有効にします。
983
1123
 
984
- Sekka $B%b!<%I$,M-8z$K$J$C$F$$$k>l9g(B \\<sekka-mode-map>\\[sekka-rK-trans] $B$G(B
985
- point $B$+$i9TF,J}8~$KF1<o$NJ8;zNs$,B3$/4V$r4A;zJQ49$7$^$9!#(B
1124
+ Sekka モードが有効になっている場合 \\<sekka-mode-map>\\[sekka-rK-trans]
1125
+ point から行頭方向に同種の文字列が続く間を漢字変換します。
986
1126
 
987
- $BF1<o$NJ8;zNs$H$O0J2<$N$b$N$r;X$7$^$9!#(B
988
- $B!&H>3Q%+%?%+%J$H(Bsekka-stop-chars $B$K;XDj$7$?J8;z$r=|$/H>3QJ8;z(B
989
- $B!&4A;z$r=|$/A43QJ8;z(B"
1127
+ 同種の文字列とは以下のものを指します。
1128
+ ・半角カタカナとsekka-stop-chars に指定した文字を除く半角文字
1129
+ ・漢字を除く全角文字"
990
1130
  (interactive "P")
991
1131
  (sekka-mode-internal arg nil))
992
1132
 
993
- ;; $BA4%P%C%U%!$G(B sekka-mode $B$rJQ99$9$k(B
1133
+ ;; 全バッファで sekka-mode を変更する
994
1134
  (defun global-sekka-mode (&optional arg)
995
- "Sekka mode $B$O(B $B%m!<%^;z$+$iD>@\4A;zJQ49$9$k$?$a$N(B minor mode $B$G$9!#(B
996
- $B0z?t$K@5?t$r;XDj$7$?>l9g$O!"(BSekka mode $B$rM-8z$K$7$^$9!#(B
1135
+ "Sekka mode ローマ字から直接漢字変換するための minor mode です。
1136
+ 引数に正数を指定した場合は、Sekka mode を有効にします。
997
1137
 
998
- Sekka $B%b!<%I$,M-8z$K$J$C$F$$$k>l9g(B \\<sekka-mode-map>\\[sekka-rK-trans] $B$G(B
999
- point $B$+$i9TF,J}8~$KF1<o$NJ8;zNs$,B3$/4V$r4A;zJQ49$7$^$9!#(B
1138
+ Sekka モードが有効になっている場合 \\<sekka-mode-map>\\[sekka-rK-trans]
1139
+ point から行頭方向に同種の文字列が続く間を漢字変換します。
1000
1140
 
1001
- $BF1<o$NJ8;zNs$H$O0J2<$N$b$N$r;X$7$^$9!#(B
1002
- $B!&H>3Q%+%?%+%J$H(Bsekka-stop-chars $B$K;XDj$7$?J8;z$r=|$/H>3QJ8;z(B
1003
- $B!&4A;z$r=|$/A43QJ8;z(B"
1141
+ 同種の文字列とは以下のものを指します。
1142
+ ・半角カタカナとsekka-stop-chars に指定した文字を除く半角文字
1143
+ ・漢字を除く全角文字"
1004
1144
  (interactive "P")
1005
1145
  (sekka-mode-internal arg t))
1006
1146
 
1007
1147
 
1008
- ;; sekka-mode $B$rJQ99$9$k6&DL4X?t(B
1148
+ ;; sekka-mode を変更する共通関数
1009
1149
  (defun sekka-mode-internal (arg global)
1010
1150
  (or (local-variable-p 'sekka-mode (current-buffer))
1011
1151
  (make-local-variable 'sekka-mode))
@@ -1023,7 +1163,7 @@ point $B$+$i9TF,J}8~$KF1<o$NJ8;zNs$,B3$/4V$r4A;zJQ49$7$^$9!#(B
1023
1163
  (when sekka-mode (run-hooks 'sekka-mode-hook)))
1024
1164
 
1025
1165
 
1026
- ;; buffer local $B$J(B sekka-mode $B$r:o=|$9$k4X?t(B
1166
+ ;; buffer local sekka-mode を削除する関数
1027
1167
  (defun sekka-kill-sekka-mode ()
1028
1168
  (let ((buf (buffer-list)))
1029
1169
  (while buf
@@ -1032,9 +1172,9 @@ point $B$+$i9TF,J}8~$KF1<o$NJ8;zNs$,B3$/4V$r4A;zJQ49$7$^$9!#(B
1032
1172
  (setq buf (cdr buf)))))
1033
1173
 
1034
1174
 
1035
- ;; $BA4%P%C%U%!$G(B sekka-input-mode $B$rJQ99$9$k(B
1175
+ ;; 全バッファで sekka-input-mode を変更する
1036
1176
  (defun sekka-input-mode (&optional arg)
1037
- "$BF~NO%b!<%IJQ99(B"
1177
+ "入力モード変更"
1038
1178
  (interactive "P")
1039
1179
  (if (< 0 arg)
1040
1180
  (progn
@@ -1044,7 +1184,7 @@ point $B$+$i9TF,J}8~$KF1<o$NJ8;zNs$,B3$/4V$r4A;zJQ49$7$^$9!#(B
1044
1184
  (setq sekka-mode nil)))
1045
1185
 
1046
1186
 
1047
- ;; input method $BBP1~(B
1187
+ ;; input method 対応
1048
1188
  (defun sekka-activate (&rest arg)
1049
1189
  (sekka-input-mode 1))
1050
1190
  (defun sekka-inactivate (&rest arg)
@@ -1054,15 +1194,15 @@ point $B$+$i9TF,J}8~$KF1<o$NJ8;zNs$,B3$/4V$r4A;zJQ49$7$^$9!#(B
1054
1194
  "" "Roman -> Kanji&Kana"
1055
1195
  nil)
1056
1196
 
1057
- ;; input-method $B$H$7$FEPO?$9$k!#(B
1197
+ ;; input-method として登録する。
1058
1198
  (set-language-info "Japanese" 'input-method "japanese-sekka")
1059
1199
  (setq default-input-method "japanese-sekka")
1060
1200
 
1061
1201
  (defconst sekka-version
1062
- " 0.8.0 " ;;VERSION;;
1202
+ "0.8.1" ;;SEKKA-VERSION
1063
1203
  )
1064
1204
  (defun sekka-version (&optional arg)
1065
- "$BF~NO%b!<%IJQ99(B"
1205
+ "入力モード変更"
1066
1206
  (interactive "P")
1067
1207
  (message sekka-version))
1068
1208