sekka 0.8.0 → 0.8.1
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +57 -0
- data/bin/sekka-jisyo +4 -7
- data/emacs/sekka.el +339 -199
- data/lib/sekka/henkan.nnd +18 -3
- data/lib/sekka/jisyo-db.nnd +1 -1
- data/lib/sekka/kvs.rb +13 -0
- data/lib/sekka/roman-lib.nnd +185 -54
- data/lib/sekka/sekkaversion.rb +1 -1
- data/lib/sekkaserver.rb +8 -2
- data/test/approximate-bench.nnd +1 -1
- data/test/azik-verification.nnd +86 -0
- data/test/henkan-main.nnd +62 -23
- data/test/jisyo.nnd +5 -6
- data/test/roman-lib.nnd +13 -12
- data/test/skk-azik-table.nnd +506 -0
- metadata +8 -7
- data/bin/.gitignore +0 -1
data/emacs/sekka.el
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
;; -*- coding:
|
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
|
39
|
+
"SekkaサーバーのURLを指定する。"
|
40
40
|
:type 'string
|
41
41
|
:group 'sekka)
|
42
42
|
|
43
43
|
(defcustom sekka-server-timeout 10
|
44
|
-
"Sekka
|
44
|
+
"Sekkaサーバーと通信する時のタイムアウトを指定する。(秒数)"
|
45
45
|
:type 'integer
|
46
46
|
:group 'sekka)
|
47
47
|
|
48
48
|
(defcustom sekka-stop-chars "(){}<> "
|
49
|
-
"
|
49
|
+
"*漢字変換文字列を取り込む時に変換範囲に含めない文字を設定する"
|
50
50
|
:type 'string
|
51
51
|
:group 'sekka)
|
52
52
|
|
53
53
|
(defcustom sekka-curl "curl"
|
54
|
-
"curl
|
54
|
+
"curlコマンドの絶対パスを設定する"
|
55
55
|
:type 'string
|
56
56
|
:group 'sekka)
|
57
57
|
|
58
58
|
(defcustom sekka-use-viper nil
|
59
|
-
"*Non-nil
|
59
|
+
"*Non-nil であれば、VIPER に対応する"
|
60
60
|
:type 'boolean
|
61
61
|
:group 'sekka)
|
62
62
|
|
63
63
|
(defcustom sekka-realtime-guide-running-seconds 30
|
64
|
-
"
|
64
|
+
"リアルタイムガイド表示の継続時間(秒数)・ゼロでガイド表示機能が無効になる"
|
65
65
|
:type 'integer
|
66
66
|
:group 'sekka)
|
67
67
|
|
68
68
|
(defcustom sekka-realtime-guide-limit-lines 5
|
69
|
-
"
|
69
|
+
"最後に変換した行から N 行離れたらリアルタイムガイド表示が止まる"
|
70
70
|
:type 'integer
|
71
71
|
:group 'sekka)
|
72
72
|
|
73
73
|
(defcustom sekka-realtime-guide-interval 0.2
|
74
|
-
"
|
74
|
+
"リアルタイムガイド表示を更新する時間間隔"
|
75
75
|
:type 'integer
|
76
76
|
:group 'sekka)
|
77
77
|
|
78
78
|
(defcustom sekka-roman-method "normal"
|
79
|
-
"
|
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
|
-
"
|
98
|
+
"リアルタイムガイドのフェイス(装飾、色などの指定)"
|
88
99
|
:group 'sekka)
|
89
100
|
|
90
101
|
|
91
|
-
(defvar sekka-sticky-shift nil "*Non-nil
|
92
|
-
(defvar sekka-mode nil "
|
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 "
|
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
|
-
;;
|
102
|
-
(defvar sekka-skip-chars "a-zA-Z0-9.,@:`\\-+!\\[\\]?;")
|
103
|
-
(defvar sekka-mode-map (make-sparse-keymap) "
|
104
|
-
(defvar sekka-select-mode-map (make-sparse-keymap) "
|
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
|
-
"
|
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
|
-
;;---
|
126
|
-
(defvar sekka-psudo-server nil) ;
|
136
|
+
;;--- デバッグメッセージ出力
|
137
|
+
(defvar sekka-psudo-server nil) ; クライアント単体で仮想的にサーバーに接続しているようにしてテストするモード
|
127
138
|
|
128
|
-
;;---
|
129
|
-
(defvar sekka-debug nil) ;
|
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
|
-
;;;
|
140
|
-
(defvar sekka-
|
141
|
-
|
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-
|
144
|
-
(defvar sekka-
|
145
|
-
(defvar sekka-
|
146
|
-
(defvar sekka-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
(defvar sekka-
|
152
|
-
(defvar sekka-
|
153
|
-
(defvar sekka-
|
154
|
-
(defvar sekka-
|
155
|
-
(defvar sekka-
|
156
|
-
(defvar sekka-
|
157
|
-
(defvar sekka-
|
158
|
-
(defvar sekka-guide-
|
159
|
-
|
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
|
-
;;
|
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
|
-
;;
|
224
|
+
;; 初期化
|
192
225
|
;;
|
193
226
|
(defun sekka-init ()
|
194
|
-
;;
|
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
|
-
;;
|
236
|
+
;; ユーザー語彙のロード + サーバーへの登録
|
204
237
|
(sekka-register-userdict-internal)
|
205
238
|
|
206
|
-
;; Emacs
|
239
|
+
;; Emacs終了時の処理
|
207
240
|
(add-hook 'kill-emacs-hook
|
208
241
|
(lambda ()
|
209
|
-
;;
|
242
|
+
;; 何もすることは無い
|
210
243
|
t))
|
211
|
-
;;
|
244
|
+
;; 初期化完了
|
212
245
|
(setq sekka-init t)))
|
213
246
|
|
214
247
|
|
@@ -232,10 +265,10 @@
|
|
232
265
|
)))
|
233
266
|
|
234
267
|
;;
|
235
|
-
;;
|
268
|
+
;; ローマ字で書かれた文章をSekkaサーバーを使って変換する
|
236
269
|
;;
|
237
|
-
;; arg-alist
|
238
|
-
;;
|
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
|
-
;;
|
247
|
-
"((\"
|
248
|
-
;;"((\"
|
249
|
-
;;
|
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
|
-
;;
|
306
|
+
;; 現在時刻をUNIXタイムを返す(単位は秒)
|
274
307
|
;;
|
275
308
|
(defun sekka-current-unixtime ()
|
276
309
|
(let (
|
@@ -282,13 +315,14 @@
|
|
282
315
|
|
283
316
|
|
284
317
|
;;
|
285
|
-
;;
|
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
|
-
;;
|
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
|
-
;;
|
360
|
+
;; ユーザー語彙をサーバーに再度登録する。
|
327
361
|
;;
|
328
362
|
(defun sekka-register-userdict (&optional arg)
|
329
|
-
"
|
363
|
+
"ユーザー辞書をサーバーに再度アップロードする"
|
330
364
|
(interactive "P")
|
331
365
|
(sekka-register-userdict-internal))
|
332
366
|
|
333
367
|
|
334
368
|
;;
|
335
|
-
;;
|
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
|
350
|
-
|
351
|
-
|
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
|
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
|
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
|
-
;;
|
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
|
-
;;
|
428
|
+
;; リージョンをローマ字漢字変換する関数
|
382
429
|
(defun sekka-henkan-region (b e)
|
383
|
-
"
|
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
|
-
;;
|
441
|
+
;; 変換結果の保持
|
395
442
|
sekka-henkan-kouho-list henkan-list
|
396
|
-
;;
|
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
|
-
;;
|
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
|
477
|
+
;; undo 情報の制御
|
431
478
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
432
|
-
;; undo buffer
|
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
|
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
|
-
;;
|
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
|
-
;;
|
502
|
+
;; 現在の変換エリアの表示を行う
|
456
503
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
457
504
|
(defun sekka-get-display-string ()
|
458
|
-
;;
|
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
|
517
|
+
;; UNDO抑制開始
|
471
518
|
(sekka-disable-undo)
|
472
519
|
|
473
520
|
(delete-region b e)
|
474
521
|
|
475
|
-
;;
|
522
|
+
;; リスト初期化
|
476
523
|
(setq sekka-markers '())
|
477
524
|
|
478
525
|
(setq sekka-last-fix "")
|
479
526
|
|
480
|
-
;;
|
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
|
-
;;
|
542
|
+
;; 確定文字列の作成
|
496
543
|
(setq sekka-last-fix insert-word)
|
497
544
|
|
498
|
-
;;
|
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
|
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
|
559
|
+
;; UNDO再開
|
513
560
|
(sekka-enable-undo)))
|
514
561
|
|
515
562
|
|
516
563
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
517
|
-
;;
|
564
|
+
;; 変換候補選択モード
|
518
565
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
519
566
|
(let ((i 0))
|
520
567
|
(while (<= i ?\177)
|
@@ -537,14 +584,14 @@
|
|
537
584
|
|
538
585
|
|
539
586
|
|
540
|
-
;;
|
587
|
+
;; 変換を確定し入力されたキーを再入力する関数
|
541
588
|
(defun sekka-kakutei-and-self-insert (arg)
|
542
|
-
"
|
589
|
+
"候補選択を確定し、入力された文字を入力する"
|
543
590
|
(interactive "P")
|
544
591
|
(sekka-select-kakutei)
|
545
592
|
(setq unread-command-events (list last-command-event)))
|
546
593
|
|
547
|
-
;;
|
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
|
-
;;
|
602
|
+
;; 候補選択を確定する
|
556
603
|
(defun sekka-select-kakutei ()
|
557
|
-
"
|
604
|
+
"候補選択を確定する"
|
558
605
|
(interactive)
|
559
|
-
;;
|
606
|
+
;; 候補番号リストをバックアップする。
|
560
607
|
(setq sekka-cand-cur-backup sekka-cand-cur)
|
561
|
-
;;
|
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
|
-
;;
|
623
|
+
;; 候補選択をキャンセルする
|
576
624
|
(defun sekka-select-cancel ()
|
577
|
-
"
|
625
|
+
"候補選択をキャンセルする"
|
578
626
|
(interactive)
|
579
|
-
;;
|
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
|
-
;;
|
635
|
+
;; 前の候補に進める
|
586
636
|
(defun sekka-select-prev ()
|
587
|
-
"
|
637
|
+
"前の候補に進める"
|
588
638
|
(interactive)
|
589
|
-
;;
|
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
|
-
;;
|
645
|
+
;; 次の候補に進める
|
596
646
|
(defun sekka-select-next ()
|
597
|
-
"
|
647
|
+
"次の候補に進める"
|
598
648
|
(interactive)
|
599
|
-
;;
|
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
|
-
;;
|
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
|
-
;;
|
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:
|
674
|
+
(message "Sekka: 漢字の候補はありません。"))
|
625
675
|
((eq _type 'h)
|
626
|
-
(message "Sekka:
|
676
|
+
(message "Sekka: ひらがなの候補はありません。"))
|
627
677
|
((eq _type 'k)
|
628
|
-
(message "Sekka:
|
678
|
+
(message "Sekka: カタカナの候補はありません。"))
|
629
679
|
((eq _type 'l)
|
630
|
-
(message "Sekka:
|
680
|
+
(message "Sekka: 半角の候補はありません。"))
|
631
681
|
((eq _type 'z)
|
632
|
-
(message "Sekka:
|
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
|
-
"
|
688
|
+
"漢字候補に強制的に切りかえる"
|
639
689
|
(interactive)
|
640
690
|
(sekka-select-by-type 'j))
|
641
691
|
|
642
692
|
(defun sekka-select-hiragana ()
|
643
|
-
"
|
693
|
+
"ひらがな候補に強制的に切りかえる"
|
644
694
|
(interactive)
|
645
695
|
(sekka-select-by-type 'h))
|
646
696
|
|
647
697
|
(defun sekka-select-katakana ()
|
648
|
-
"
|
698
|
+
"カタカナ候補に強制的に切りかえる"
|
649
699
|
(interactive)
|
650
700
|
(sekka-select-by-type 'k))
|
651
701
|
|
652
702
|
(defun sekka-select-hankaku ()
|
653
|
-
"
|
703
|
+
"半角候補に強制的に切りかえる"
|
654
704
|
(interactive)
|
655
705
|
(sekka-select-by-type 'l))
|
656
706
|
|
657
707
|
(defun sekka-select-zenkaku ()
|
658
|
-
"
|
708
|
+
"半角候補に強制的に切りかえる"
|
659
709
|
(interactive)
|
660
710
|
(sekka-select-by-type 'z))
|
661
711
|
|
712
|
+
|
662
713
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
663
|
-
;;
|
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
|
-
"
|
667
|
-
|
812
|
+
"ローマ字漢字変換をする。
|
813
|
+
・カーソルから行頭方向にローマ字列が続く範囲でローマ字漢字変換を行う。"
|
668
814
|
(interactive)
|
669
815
|
; (print last-command) ; DEBUG
|
670
816
|
|
671
817
|
(cond
|
672
|
-
;;
|
818
|
+
;; タイマーイベントを設定しない条件
|
673
819
|
((or
|
674
820
|
sekka-timer
|
675
821
|
(> 1 sekka-realtime-guide-running-seconds)
|
676
822
|
))
|
677
823
|
(t
|
678
|
-
;;
|
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
|
-
;;
|
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
|
-
;;
|
843
|
+
;; 最後に変換した行番号の更新
|
698
844
|
(setq sekka-last-lineno (line-number-at-pos (point)))
|
699
845
|
|
700
846
|
(cond
|
701
847
|
(sekka-select-mode
|
702
|
-
;;
|
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
|
-
;;
|
856
|
+
;; カーソル直前が alphabet だったら
|
711
857
|
(let ((end (point))
|
712
858
|
(gap (sekka-skip-chars-backward)))
|
713
859
|
(when (/= gap 0)
|
714
|
-
;;
|
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
|
-
;;
|
733
|
-
;;
|
734
|
-
(when (
|
735
|
-
|
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
|
-
;;
|
884
|
+
|
885
|
+
;; 表示状態を候補選択モードに切替える。
|
745
886
|
(sekka-display-function
|
746
|
-
(marker-position sekka-
|
747
|
-
(marker-position sekka-
|
748
|
-
t))))
|
749
|
-
)))
|
887
|
+
(marker-position (car sekka-markers))
|
888
|
+
(marker-position (cdr sekka-markers))
|
889
|
+
t)))))))
|
750
890
|
|
751
891
|
|
752
892
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
753
|
-
;;
|
893
|
+
;; キャピタライズ/アンキャピタライズ変換
|
754
894
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
755
895
|
(defun sekka-capitalize-trans ()
|
756
|
-
"
|
757
|
-
|
896
|
+
"キャピタライズ変換を行う
|
897
|
+
・カーソルから行頭方向にローマ字列を見つけ、先頭文字の大文字小文字を反転する"
|
758
898
|
(interactive)
|
759
899
|
|
760
900
|
(cond
|
761
901
|
(sekka-select-mode
|
762
|
-
;;
|
902
|
+
;; 候補選択モードでは反応しない。
|
763
903
|
;; do nothing
|
764
904
|
)
|
765
905
|
((eq (sekka-char-charset (preceding-char)) 'ascii)
|
766
|
-
;;
|
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
|
-
;;
|
912
|
+
;; 意味のある入力が見つかったので変換する
|
773
913
|
(let* (
|
774
914
|
(b (+ end gap))
|
775
915
|
(e end)
|
@@ -784,36 +924,36 @@
|
|
784
924
|
))
|
785
925
|
|
786
926
|
|
787
|
-
;;
|
927
|
+
;; 全角で漢字以外の判定関数
|
788
928
|
(defun sekka-nkanji (ch)
|
789
929
|
(and (eq (sekka-char-charset ch) 'japanese-jisx0208)
|
790
|
-
(not (string-match "[
|
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
|
-
;;
|
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
|
941
|
+
;; auto-fill-mode が有効になっている場合改行があってもskipを続ける
|
802
942
|
(concat sekka-skip-chars "\n")
|
803
|
-
;; auto-fill-mode
|
943
|
+
;; auto-fill-modeが無効の場合はそのまま
|
804
944
|
sekka-skip-chars))
|
805
945
|
|
806
|
-
;;
|
946
|
+
;; マークされている位置を求める。
|
807
947
|
(pos (or (and (markerp (mark-marker)) (marker-position (mark-marker)))
|
808
948
|
1))
|
809
949
|
|
810
|
-
;;
|
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
|
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
|
-
;;
|
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
|
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
|
-
;;
|
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
|
-
"
|
907
|
-
sekka-mode
|
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
|
-
;;
|
1055
|
+
;; 残り回数のデクリメント
|
916
1056
|
(setq sekka-timer-rest (- sekka-timer-rest 1))
|
917
1057
|
|
918
|
-
;;
|
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
|
-
;;
|
1073
|
+
;; 上下スペースが無い または 変換対象が無しならガイドは表示しない。
|
934
1074
|
(overlay-put sekka-guide-overlay 'before-string "")
|
935
|
-
;;
|
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
|
975
|
-
;;
|
976
|
-
;; {
|
977
|
-
;;
|
1114
|
+
;; sekka-mode の状態変更関数
|
1115
|
+
;; 正の引数の場合、常に sekka-mode を開始する
|
1116
|
+
;; {負,0}の引数の場合、常に sekka-mode を終了する
|
1117
|
+
;; 引数無しの場合、sekka-mode をトグルする
|
978
1118
|
|
979
|
-
;; buffer
|
1119
|
+
;; buffer 毎に sekka-mode を変更する
|
980
1120
|
(defun sekka-mode (&optional arg)
|
981
|
-
"Sekka mode
|
982
|
-
|
1121
|
+
"Sekka mode は ローマ字から直接漢字変換するための minor mode です。
|
1122
|
+
引数に正数を指定した場合は、Sekka mode を有効にします。
|
983
1123
|
|
984
|
-
Sekka
|
985
|
-
point
|
1124
|
+
Sekka モードが有効になっている場合 \\<sekka-mode-map>\\[sekka-rK-trans] で
|
1125
|
+
point から行頭方向に同種の文字列が続く間を漢字変換します。
|
986
1126
|
|
987
|
-
|
988
|
-
|
989
|
-
|
1127
|
+
同種の文字列とは以下のものを指します。
|
1128
|
+
・半角カタカナとsekka-stop-chars に指定した文字を除く半角文字
|
1129
|
+
・漢字を除く全角文字"
|
990
1130
|
(interactive "P")
|
991
1131
|
(sekka-mode-internal arg nil))
|
992
1132
|
|
993
|
-
;;
|
1133
|
+
;; 全バッファで sekka-mode を変更する
|
994
1134
|
(defun global-sekka-mode (&optional arg)
|
995
|
-
"Sekka mode
|
996
|
-
|
1135
|
+
"Sekka mode は ローマ字から直接漢字変換するための minor mode です。
|
1136
|
+
引数に正数を指定した場合は、Sekka mode を有効にします。
|
997
1137
|
|
998
|
-
Sekka
|
999
|
-
point
|
1138
|
+
Sekka モードが有効になっている場合 \\<sekka-mode-map>\\[sekka-rK-trans] で
|
1139
|
+
point から行頭方向に同種の文字列が続く間を漢字変換します。
|
1000
1140
|
|
1001
|
-
|
1002
|
-
|
1003
|
-
|
1141
|
+
同種の文字列とは以下のものを指します。
|
1142
|
+
・半角カタカナとsekka-stop-chars に指定した文字を除く半角文字
|
1143
|
+
・漢字を除く全角文字"
|
1004
1144
|
(interactive "P")
|
1005
1145
|
(sekka-mode-internal arg t))
|
1006
1146
|
|
1007
1147
|
|
1008
|
-
;; sekka-mode
|
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
|
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
|
-
;;
|
1175
|
+
;; 全バッファで sekka-input-mode を変更する
|
1036
1176
|
(defun sekka-input-mode (&optional arg)
|
1037
|
-
"
|
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
|
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
|
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
|
-
"
|
1202
|
+
"0.8.1" ;;SEKKA-VERSION
|
1063
1203
|
)
|
1064
1204
|
(defun sekka-version (&optional arg)
|
1065
|
-
"
|
1205
|
+
"入力モード変更"
|
1066
1206
|
(interactive "P")
|
1067
1207
|
(message sekka-version))
|
1068
1208
|
|