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))