Konosuke Watanabe
nosuk****@csc*****
2004年 1月 7日 (水) 02:16:23 JST
渡辺です. From: Hiroyuki Komatsu <komat****@taiya*****> Subject: [Anthy-dev 353] Re: anthy-4901 Date: Mon, 05 Jan 2004 11:42:31 -0600 > prime-el ではどのように実装しているかを説明させていただきます。 > 実装のヒントにしていただければうれしいです。 > > > undo の記録は変数 buffer-undo-list に格納されていますので、この変数を > いじってやれば undo を繋げることが可能です。 anthy-buffer-undo-list を > buffer-undo-list を一時的に退避させるバッファローカル変数として使います。 小松さんの助言に倣い,anthy.elに手を加えてundoリストがつなが るようにしてみました.emacs21.3上で動いているように見えます. 場当たり的な実装でかっこわるいんですが,一応,差分を添付しま す. --- Konosuke WATANABE <nosuk****@csc*****> -------------- next part -------------- diff -NaruB anthy-4901.org/src-util/anthy.el anthy-4901/src-util/anthy.el --- anthy-4901.org/src-util/anthy.el 2003-11-24 20:59:35.000000000 +0900 +++ anthy-4901/src-util/anthy.el 2004-01-07 02:00:04.000000000 +0900 @@ -43,6 +43,13 @@ ;;; Code: ;(setq debug-on-error t) +(defvar anthy-buffer-undo-list nil) +(defvar anthy-buffer-undo-list-saved nil) +;; anthy-buffer-undo-listをバッファローカルに設定 +(make-variable-buffer-local 'anthy-buffer-undo-list) + + + (defvar anthy-default-enable-enum-candidate-p t "これを設定すると次候補を数回押した際に候補の一覧から選択するモードになります.") (defvar anthy-personality "" @@ -241,14 +248,12 @@ (defun anthy-enable-preedit-keymap () "キーマップをプリエディットの存在する時のものに切替える" - (buffer-disable-undo) (setcdr (assq 'anthy-minor-mode minor-mode-map-alist) anthy-preedit-keymap)) (defun anthy-disable-preedit-keymap () "キーマップをプリエディットの存在しない時のものに切替える" - (buffer-enable-undo) (setcdr (assq 'anthy-minor-mode minor-mode-map-alist) anthy-mode-map) @@ -421,6 +426,17 @@ anthy-enum-rcandidate-p))) ;; erase old preedit (anthy-erase-preedit) + + ;; 入力キャンセル時にundoリストを繋げる + (if (and (= (length ps) 0) anthy-buffer-undo-list-saved ) + (progn +; (message "enable") + (buffer-enable-undo) + (setq buffer-undo-list anthy-buffer-undo-list) + (setq anthy-buffer-undo-list-saved nil) + )) + + (anthy-disable-preedit-keymap) ;; insert new preedit (setq anthy-preedit-start (point)) @@ -430,7 +446,23 @@ (progn (setq anthy-preedit (concat anthy-preedit anthy-preedit-begin-mark)) - (anthy-insert-preedit-segment anthy-preedit-begin-mark '()))) + (anthy-insert-preedit-segment anthy-preedit-begin-mark '()) + + ;; 入力開始と同時にundoリストを無効化 + (if (not anthy-buffer-undo-list-saved) + (progn + ;(message "disable") + (setq anthy-buffer-undo-list (cdr buffer-undo-list)) + (buffer-disable-undo) + (setq anthy-buffer-undo-list-saved 't) + ) + ;(message "not saved") + ) + + )) + + + ;; 各文節に対して (while ps (let ((cur (car ps))) @@ -491,6 +523,7 @@ ((stat (car repl)) (body (cdr repl)) (commit "") + (commitlen nil) (preedit nil)) ;; 各文節を処理する (while body @@ -514,9 +547,32 @@ ;; コミットされた文節を処理する (if (> (string-width commit) 0) (progn + (setq commitlen (length commit)) + (anthy-erase-preedit) (anthy-disable-preedit-keymap) + + ; 先にコミットさせておく (insert-and-inherit commit) + + ;; コミット時に繋げる + (if anthy-buffer-undo-list-saved + (progn + ;(message "enable") + ; 復帰させる前に,今commitした内容をリストに追加 + (setq anthy-buffer-undo-list + (cons (cons anthy-preedit-start + (+ anthy-preedit-start commitlen)) + anthy-buffer-undo-list)) + (setq anthy-buffer-undo-list (cons nil anthy-buffer-undo-list)) + + (buffer-enable-undo) + + (setq buffer-undo-list anthy-buffer-undo-list) + + (setq anthy-buffer-undo-list-saved nil) + )) + (run-hooks 'anthy-commit-hook) )) (anthy-update-preedit stat preedit)