emacs/sekka.el in sekka-0.8.7 vs emacs/sekka.el in sekka-0.8.8

- old
+ new

@@ -234,31 +234,19 @@ (defvar sekka-use-fence t) (defvar sekka-use-color nil) (defvar sekka-init nil) + ;; ;; 初期化 ;; (defun sekka-init () - ;; 最初の n 件のリストを取得する - (defun sekka-take (arg-list n) - (let ((lst '())) - (dotimes (i n (reverse lst)) - (let ((item (nth i arg-list))) - (when item - (push item lst)))))) - (when (not sekka-init) ;; ユーザー語彙のロード + サーバーへの登録 (sekka-register-userdict-internal) - - ;; Emacs終了時の処理 - (add-hook 'kill-emacs-hook - (lambda () - ;; 何もすることは無い - t)) + ;; 初期化完了 (setq sekka-init t))) (defun sekka-construct-curl-argstr (arg-alist) @@ -571,16 +559,16 @@ ;; カーソル前の文字種を返却する関数 (eval-and-compile (if (>= emacs-major-version 20) - (progn - (defalias 'sekka-char-charset (symbol-function 'char-charset)) - (when (and (boundp 'byte-compile-depth) - (not (fboundp 'char-category))) - (defalias 'char-category nil))) ; for byte compiler + (defun sekka-char-charset (ch) + (let ((result (char-charset ch))) + (sekka-debug-print (format "sekka-char-charset:1(%s) => %s\n" ch result)) + result)) (defun sekka-char-charset (ch) + (sekka-debug-print (format "sekka-char-charset:2(%s) => %s\n" ch (char-category))) (cond ((equal (char-category ch) "a") 'ascii) ((equal (char-category ch) "k") 'katakana-jisx0201) ((string-match "[SAHK]j" (char-category ch)) 'japanese-jisx0208) (t nil) )) )) @@ -622,56 +610,76 @@ (annotation (cadr kouho))) (sekka-debug-print (format "word:[%d] %s(%s)\n" sekka-cand-cur word annotation)) word)) (defun sekka-display-function (b e select-mode) - (setq sekka-henkan-separeter (if sekka-use-fence " " "")) - (when sekka-henkan-kouho-list - ;; UNDO抑制開始 - (sekka-disable-undo) - - (delete-region b e) + (let ((insert-word (sekka-get-display-string)) + (word (buffer-substring-no-properties b e))) + (cond + ((and (not select-mode) + (string-equal insert-word word)) + ;; sekka-markersの更新 + (setq sekka-fence-start (progn + (goto-char b) + (point-marker))) + (setq sekka-fence-end (progn + (goto-char e) + (point-marker))) + (setq sekka-markers + (cons sekka-fence-start sekka-fence-end)) - ;; リスト初期化 - (setq sekka-markers '()) + ;; 確定文字列の作成 + (setq sekka-last-fix insert-word) + + (sekka-debug-print (format "don't touch:[%s] point:%d-%d\n" insert-word (marker-position sekka-fence-start) (marker-position sekka-fence-end)))) - (setq sekka-last-fix "") + (t + (setq sekka-henkan-separeter (if sekka-use-fence " " "")) + (when sekka-henkan-kouho-list + ;; UNDO抑制開始 + (sekka-disable-undo) + + (delete-region b e) - ;; 変換したpointの保持 - (setq sekka-fence-start (point-marker)) - (when select-mode (insert "|")) - - (let* ( - (start (point-marker)) - (_cur sekka-cand-cur) - (_len sekka-cand-len) - (insert-word (sekka-get-display-string))) - (progn - (insert insert-word) - (message (format "[%s] candidate (%d/%d)" insert-word (+ _cur 1) _len)) - (let* ((end (point-marker)) - (ov (make-overlay start end))) - - ;; 確定文字列の作成 - (setq sekka-last-fix insert-word) - - ;; 選択中の場所を装飾する。 - (when select-mode - (overlay-put ov 'face 'default) - (overlay-put ov 'face 'highlight)) - (setq sekka-markers (cons start end)) - (sekka-debug-print (format "insert:[%s] point:%d-%d\n" insert-word (marker-position start) (marker-position end)))))) + ;; リスト初期化 + (setq sekka-markers '()) - ;; fenceの範囲を設定する - (when select-mode (insert "|")) - (setq sekka-fence-end (point-marker)) + (setq sekka-last-fix "") + + ;; 変換したpointの保持 + (setq sekka-fence-start (point-marker)) + (when select-mode (insert "|")) - (sekka-debug-print (format "total-point:%d-%d\n" - (marker-position sekka-fence-start) - (marker-position sekka-fence-end))) - ;; UNDO再開 - (sekka-enable-undo))) + (let* ( + (start (point-marker)) + (_cur sekka-cand-cur) + (_len sekka-cand-len)) + (progn + (insert insert-word) + (message (format "[%s] candidate (%d/%d)" insert-word (+ _cur 1) _len)) + (let* ((end (point-marker)) + (ov (make-overlay start end))) + + ;; 確定文字列の作成 + (setq sekka-last-fix insert-word) + + ;; 選択中の場所を装飾する。 + (when select-mode + (overlay-put ov 'face 'default) + (overlay-put ov 'face 'highlight)) + (setq sekka-markers (cons start end)) + (sekka-debug-print (format "insert:[%s] point:%d-%d\n" insert-word (marker-position start) (marker-position end)))))) + + ;; fenceの範囲を設定する + (when select-mode (insert "|")) + (setq sekka-fence-end (point-marker)) + + (sekka-debug-print (format "total-point:%d-%d\n" + (marker-position sekka-fence-start) + (marker-position sekka-fence-end))) + ;; UNDO再開 + (sekka-enable-undo)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 変換候補選択モード ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -961,14 +969,19 @@ ;; 変換履歴操作関数 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun sekka-history-gc () ;; sekka-history-stack中の無効なマークを持つエントリを削除する + (sekka-debug-print (format "sekka-history-gc before len=%d\n" (length sekka-history-stack))) + (let ((temp-list '())) (mapcar (lambda (alist) (let ((markers (sekka-assoc-ref 'markers alist nil))) + (sekka-debug-print (format "markers=%S\n" markers)) + (sekka-debug-print (format "marker-position car=%d\n" (marker-position (car markers)))) + (sekka-debug-print (format "marker-position cdr=%d\n" (marker-position (cdr markers)))) (when (and (marker-position (car markers)) ;; 存在するバッファを指しているか (marker-position (cdr markers))) (if (= (marker-position (car markers)) (marker-position (cdr markers))) ;; マークの開始と終了が同じ位置を指している場合は、 @@ -977,18 +990,21 @@ (set-marker (car markers) nil) (set-marker (cdr markers) nil)) (push alist temp-list))))) sekka-history-stack) + (sekka-debug-print (format "sekka-history-gc temp-list len=%d\n" (length temp-list))) + ;; temp-list から limit 件数だけコピーする (setq sekka-history-stack '()) (mapcar (lambda (alist) (when (< (length sekka-history-stack) sekka-history-stack-limit) (push alist sekka-history-stack))) - (reverse temp-list)))) + (reverse temp-list))) + (sekka-debug-print (format "sekka-history-gc after len=%d\n" (length sekka-history-stack)))) ;;確定ヒストリから、指定_pointに変換済の単語が埋まっているかどうか調べる ;; t か nil を返す。 ;; また、_load に 真を渡すと、見付かった情報で、現在の変換候補変数にロードしてくれる。 @@ -1058,11 +1074,13 @@ (defun sekka-rK-trans () "ローマ字漢字変換をする。 ・カーソルから行頭方向にローマ字列が続く範囲でローマ字漢字変換を行う。" (interactive) ; (print last-command) ; DEBUG + (sekka-debug-print "sekka-rK-trans()") + (cond ;; タイマーイベントを設定しない条件 ((or sekka-timer (> 1 sekka-realtime-guide-running-seconds) @@ -1090,18 +1108,20 @@ ;; 最後に変換した行番号の更新 (setq sekka-last-lineno (line-number-at-pos (point))) (cond (sekka-select-mode + (sekka-debug-print "<<sekka-select-mode>>\n") ;; 候補選択モード中に呼出されたら、keymapから再度候補選択モードに入る (funcall (lookup-key sekka-select-mode-map sekka-rK-trans-key))) (t (cond ((eq (sekka-char-charset (preceding-char)) 'ascii) + (sekka-debug-print (format "ascii? (%s) => t\n" (preceding-char))) ;; カーソル直前が alphabet だったら (let ((end (point)) (gap (sekka-skip-chars-backward))) (when (/= gap 0) ;; 意味のある入力が見つかったので変換する @@ -1122,10 +1142,11 @@ (when (not (sekka-include-typep 'j)) (sekka-add-new-word))) ))))) ((sekka-kanji (preceding-char)) + (sekka-debug-print (format "sekka-kanji(%s) => t\n" (preceding-char))) ;; カーソル直前が 全角で漢字以外 だったら候補選択モードに移行する。 ;; また、最後に確定した文字列と同じかどうかも確認する。 (when (sekka-history-search (point) t) ;; 直前に変換したfenceの範囲に入っていたら、候補選択モードに移行する。 @@ -1134,13 +1155,17 @@ ;; 表示状態を候補選択モードに切替える。 (sekka-display-function (marker-position (car sekka-markers)) (marker-position (cdr sekka-markers)) - t))))))) + t))) + (t + (sekka-debug-print (format "<<OTHER:non-ascii,non-kanji>> (%s)\n" (preceding-char)))))))) + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; キャピタライズ/アンキャピタライズ変換 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun sekka-capitalize-trans () "キャピタライズ変換を行う @@ -1274,11 +1299,11 @@ (sekka-guide-overlay ;; 残り回数のデクリメント (setq sekka-timer-rest (- sekka-timer-rest 1)) ;; カーソルがsekka-realtime-guide-limit-lines をはみ出していないかチェック - (sekka-debug-print (format "sekka-last-lineno [%d] : current-line" sekka-last-lineno (line-number-at-pos (point)))) + (sekka-debug-print (format "sekka-last-lineno [%d] : current-line\n" sekka-last-lineno (line-number-at-pos (point)))) (when (< 0 sekka-realtime-guide-limit-lines) (let ((diff-lines (abs (- (line-number-at-pos (point)) sekka-last-lineno)))) (when (<= sekka-realtime-guide-limit-lines diff-lines) (setq sekka-timer-rest 0)))) @@ -1316,10 +1341,15 @@ (current-buffer)) (overlay-put sekka-guide-overlay 'before-string mess)))) (overlay-put sekka-guide-overlay 'face 'sekka-guide-face)))) +(defun sekka-stop-realtime-guide () + (when (eq this-command 'keyboard-quit) + (setq sekka-timer-rest 0))) + + ;;; ;;; human interface ;;; (define-key sekka-mode-map sekka-rK-trans-key 'sekka-rK-trans) (define-key sekka-mode-map "\M-j" 'sekka-capitalize-trans) @@ -1365,10 +1395,12 @@ (sekka-mode-internal arg t)) ;; sekka-mode を変更する共通関数 (defun sekka-mode-internal (arg global) + (sekka-debug-print "sekka-mode-internal :1\n") + (or (local-variable-p 'sekka-mode (current-buffer)) (make-local-variable 'sekka-mode)) (if global (progn (setq-default sekka-mode (if (null arg) (not sekka-mode) @@ -1376,13 +1408,19 @@ (sekka-kill-sekka-mode)) (setq sekka-mode (if (null arg) (not sekka-mode) (> (prefix-numeric-value arg) 0)))) (when sekka-sticky-shift (add-hook 'sekka-mode-hook 'sekka-sticky-shift-init-function)) - (when sekka-mode (run-hooks 'sekka-mode-hook))) + (when sekka-mode (run-hooks 'sekka-mode-hook)) + (sekka-debug-print "sekka-mode-internal :2\n") + ;; Ctrl-G押下時、リアルタイムガイドをOFFにするhook + (add-hook 'post-command-hook 'sekka-stop-realtime-guide) + (add-hook 'pre-command-hook 'sekka-stop-realtime-guide)) + + ;; buffer local な sekka-mode を削除する関数 (defun sekka-kill-sekka-mode () (let ((buf (buffer-list))) (while buf (set-buffer (car buf)) @@ -1415,10 +1453,10 @@ ;; input-method として登録する。 (set-language-info "Japanese" 'input-method "japanese-sekka") (setq default-input-method "japanese-sekka") (defconst sekka-version - "0.8.7" ;;SEKKA-VERSION + "0.8.8" ;;SEKKA-VERSION ) (defun sekka-version (&optional arg) "入力モード変更" (interactive "P") (message sekka-version))