--- egg-remix.0202.el Mon Oct 30 14:12:29 2000 +++ egg-remix.el Mon Oct 30 14:24:49 2000 @@ -56,6 +56,12 @@ ;; "remix" Egg ReMix モード ;; Change Log: +;; Oct 30 2000: version 0.203 +;; ・isearch で日本語を入力中に C-g で中断すると、以後の +;; ミニバッファへの入力ができなくなる問題に対応 +;; (C-g へ abort する関数をバインドして回避) +;; ・変換モードから C-k でフェンスモードに戻ったときに、フェンスが +;; 正しく作成されない問題を fix ;; Oct 12 2000: version 0.202 ;; ・remix-fence-open, remix-fence-continue, remix-fence-close が ;; 2文字以上のときに正常に動作しない問題に対応 @@ -230,9 +236,9 @@ ;;;;==== ;;;; Egg-ReMix code ;;;;==== -(defconst remix-version "0.202" +(defconst remix-version "0.203" "Egg ReMix のバージョン") -(defconst remix-version-date "Oct 12 2000" +(defconst remix-version-date "Oct 30 2000" "Egg ReMix の最終更新日") ;;;###autoload (defun remix-version () @@ -327,6 +333,7 @@ (define-key map "\C-d" 'remix-delete) (define-key map "\C-e" 'remix-end-of-input-buffer) (define-key map "\C-f" 'remix-forward) + (define-key map "\C-g" 'remix-abort) (define-key map "\C-]" 'remix-cancel-input) (define-key map "\C-h" 'remix-mode-help-command) (define-key map "\C-k" 'remix-kill-line) @@ -363,11 +370,6 @@ (defvar remix-fence-operation nil) (defvar remix-usrdict-modified nil) -;;; フック設定 -(add-hook 'input-method-after-insert-chunk-hook 'remix-delete-cursor) -(add-hook 'egg-enter/leave-fence-hook 'remix-enter/leave-fence) -(add-hook 'kill-emacs-hook 'remix-save-dict) - ;;; remix-remix-fence が non-nil なら、フェンスの外観を ;;; remix のもので初期化する (if remix-remix-fence @@ -477,7 +479,6 @@ (defun remix-cancel-input () "Cancel all of input" (interactive) - (remix-end-of-input-buffer) (if (remix-in-fence-p) (let ((inhibit-read-only t) (p (point))) @@ -681,9 +682,15 @@ (remix-input key))) (defun remix-restart (str set-prop begnning context) - (let ((remix-context context) - p cursor prop) - (setq prop (text-properties-at (point))) + (let* ((remix-context context) + p cursor + (prop (text-properties-at (point))) + (seq (plist-get prop 'remix-keyseq-before)) + (kana (remix-translate-keyseq seq t))) + (setq seq (remix-chop-head-keyseq seq (string-match (concat str "\\'") kana))) + (if (zerop (length seq)) + (setq seq nil)) + (setq prop (plist-put prop 'remix-keyseq-before seq)) (remix-delete-cursor) (remix-setup-fence-mode) (setq p (point)) @@ -695,6 +702,12 @@ (interactive) (remix-exit-mode-internal)) +(defun remix-abort () + "Cancel current input and signal a quit" + (interactive) + (remix-cancel-input) + (signal 'quit nil)) + (defun remix-exit-mode-internal (&optional key) (if (remix-in-fence-p) (let ((inhibit-read-only t) @@ -890,8 +903,7 @@ (insert-file-contents file t) (goto-char (point-max)) ;; 辞書ファイルの末尾が改行ではない場合に備える - (if (/= (point-max) - (save-excursion (beginning-of-line) (point))) + (or (bolp) (insert ?\n))) (message (format "ReMix: 報告: 指定されたシステム辞書 (%s) を読めませんでした" @@ -1014,6 +1026,34 @@ (if (< cutoff len) (substring seq cutoff)))))) +(defun remix-chop-head-keyseq (seq count) + (let ((i 0) + (syl (its-initial-ISYL)) + (its-barf-on-invalid-keyseq nil) + (len (length seq)) + (loop 0) + cursor) + (while (and (< i len) (not (zerop count))) + (let ((key (aref seq i)) + (its-disable-special-action t)) + (setq loop 0 + cursor (its-state-machine syl key + (lambda (newsyl oldsyl cursor) + (its-update-latest-SYL newsyl) + (if (and newsyl + (consp (cdr newsyl)) + (not (its-kst-p (its-get-kst/t newsyl)))) + (setq count (1- count))) + (setq loop (1+ loop)) + cursor))) + (setq i (1+ i)) + (if cursor + (setq syl (its-initial-ISYL)) + (setq syl its-latest-SYL)))) + (if (> loop 1) + (setq i (1- i))) + (substring seq i))) + (defun remix-save-dict () (if (and remix-usrdict-modified (get-buffer remix-usrdictbuf)) @@ -1033,6 +1073,11 @@ (princ "Egg ReMix mode:\n") (princ (documentation 'remix-mode)) (help-setup-xref (cons #'help-xref-mode (current-buffer)) (interactive-p)))) + +;;; フック設定 +(add-hook 'input-method-after-insert-chunk-hook 'remix-delete-cursor) +(add-hook 'egg-enter/leave-fence-hook 'remix-enter/leave-fence) +(add-hook 'kill-emacs-hook 'remix-save-dict) (provide 'egg-remix)