--- egg-remix.0203.el Mon Oct 30 14:30:41 2000 +++ egg-remix.0204.el Sun Feb 11 13:08:15 2001 @@ -56,6 +56,12 @@ ;; "remix" Egg ReMix モード ;; Change Log: +;; Feb 11 2001: version 0.204 +;; ・font-lock-mode が有効なときに正しくフェンスを編集できない +;; 問題を fix +;; ・フェンスの face 表示に overlay を選択できるようにした +;; (変数 remix-use-overlay を追加) +;; ・fence に使う文字列に remix-fence-* が残っていたのを修正 ;; Oct 30 2000: version 0.203 ;; ・isearch で日本語を入力中に C-g で中断すると、以後の ;; ミニバッファへの入力ができなくなる問題に対応 @@ -236,9 +242,9 @@ ;;;;==== ;;;; Egg-ReMix code ;;;;==== -(defconst remix-version "0.203" +(defconst remix-version "0.204" "Egg ReMix のバージョン") -(defconst remix-version-date "Oct 30 2000" +(defconst remix-version-date "Feb 11 2001" "Egg ReMix の最終更新日") ;;;###autoload (defun remix-version () @@ -291,6 +297,11 @@ 値が non-nil なら、ユーザ辞書にない綴りがシステム辞書にあったときに 自動的にユーザ辞書に追加する") +(defvar remix-use-overlay 10 + "*フェンスの face を overlay で表示するかどうかのフラグ。 +nil ならば text property を使う。 +数値ならばその値を priority とする overlay を使う。") + ;;;;==== ;;;; Egg-ReMix の内部で使う変数 ;;;;==== @@ -384,6 +395,14 @@ egg-conversion-fence-close remix-fence-close egg-conversion-face remix-fence-face)) +;;; remix-use-overlay の妥当性チェック +;;; nil: overlay を使わない +;;; number: overlay の priority にする +(or + (null remix-use-overlay) + (numberp remix-use-overlay) + (setq remix-use-overlay nil)) + ;;; 関数定義 (defun remix-enter/leave-fence (&optional old new) (setq remix-its-fence-mode (remix-in-fence-p)) @@ -712,7 +731,10 @@ (if (remix-in-fence-p) (let ((inhibit-read-only t) (remix-fence-operation t) - (status (get-text-property (point) 'remix-status))) + (status (get-text-property (point) 'remix-status)) + (overlay (get-text-property (point) 'remix-overlay))) + (if overlay + (delete-overlay overlay)) (remix-delete-cursor) (remix-delete-fence) (if key @@ -758,45 +780,58 @@ (eq status 'remix-indictnokana)) seq-before (remix-translate-keyseq seq-before last))) - (cursor (buffer-substring p (1+ p)))) - ;; フェンス内をいったんクリアする - (delete-region p1 p2) + (cursor (buffer-substring p (1+ p))) + (overlay (get-text-property 0 'remix-overlay cursor))) - ;; キーシークェンスが空なら、フェンスを消去してインジケータを更新する - (if (zerop (length (concat seq-before seq-after))) - (remix-delete-fence) - ;; カーソルの手前部分を挿入する - (when tr - (insert tr) - (add-text-properties p1 (point) (list 'intangible 'remix-part-1 - 'read-only t - 'face remix-fence-face))) - (setq p (point)) - ;; カーソルを挿入する - (insert cursor) - ;; カーソルの後ろがあれば挿入する - (if seq-after - (save-excursion - (setq p1 (point)) - (insert seq-after) - (add-text-properties p1 (point) (list 'intangible 'remix-part-2 - 'read-only t - 'face remix-fence-face)))) - - ;; 状態を更新する - (goto-char p) - (if (eq status 'remix-uncertain) - (cond - ((null its-translation-result) - (setq status 'remix-nokanaseq)) - ((equal its-translation-result tr) - (setq status 'remix-kanaseq)))) - (if (eq previous-status 'remix-inedit) - (setq status 'remix-inedit)) - (add-text-properties p (1+ p) (list 'remix-status status))) - (setq current-input-method-title (cdr (or (assq status remix-state-indicator-alist) - (assq 'remix-default remix-state-indicator-alist)))) - (force-mode-line-update))) + ;; font-lock-mode が active だといちいち point が変化するので + ;; フェンスの更新が終わるまで無効にする + ;;;; なぜか combine-after-change-calls が Emacs-21.0.97 では機能しないので + ;;;; let でごまかし + ;; (combine-after-change-calls + (let ((after-change-functions nil)) + ;; フェンス内をいったんクリアする + (delete-region p1 p2) + + ;; キーシークェンスが空なら、フェンスを消去してインジケータを更新する + (if (zerop (length (concat seq-before seq-after))) + (remix-delete-fence) + ;; カーソルの手前部分を挿入する + (when tr + (insert tr) + (add-text-properties p1 (point) (list 'intangible 'remix-part-1 + 'read-only t + 'face its-fence-face))) + (setq p (point)) + ;; カーソルを挿入する + (insert cursor) + (setq p2 (point)) + ;; カーソルの後ろがあれば挿入する + (when seq-after + (insert seq-after) + (add-text-properties p2 (point) (list 'intangible 'remix-part-2 + 'read-only t + 'face its-fence-face)) + (setq p2 (point))) + + ;; overlay の再設定 + (if remix-use-overlay + (move-overlay overlay p1 p2)) + + ;; 状態を更新する + (goto-char p) + (if (eq status 'remix-uncertain) + (cond + ((null its-translation-result) + (setq status 'remix-nokanaseq)) + ((equal its-translation-result tr) + (setq status 'remix-kanaseq)))) + (if (eq previous-status 'remix-inedit) + (setq status 'remix-inedit)) + (add-text-properties p (1+ p) (list 'remix-status status))) + (setq current-input-method-title + (cdr (or (assq status remix-state-indicator-alist) + (assq 'remix-default remix-state-indicator-alist)))) + (force-mode-line-update)))) (defun remix-setup-fence-mode () (let ((open-props '(remix-start t intangible remix-part-1 front-sticky nil)) @@ -810,7 +845,8 @@ ;; Put open-fence before inhibit-read-only to detect read-only (insert (if remix-context its-fence-continue its-fence-open)) (let ((inhibit-read-only t) - (p1 (point))) + (p1 (point)) + overlay) (add-text-properties p0 p1 open-props) (insert its-fence-close) (add-text-properties p1 (point) close-props) @@ -820,6 +856,12 @@ (its-define-select-keys remix-its-mode-map) (goto-char p1) (remix-put-cursor) + (when remix-use-overlay + (setq overlay (make-overlay p1 (1+ p1))) + (overlay-put overlay 'face its-fence-face) + (overlay-put overlay 'evaporate t) + (overlay-put overlay 'priority remix-use-overlay) + (add-text-properties p1 (1+ p1) (list 'remix-overlay overlay))) (if remix-context (add-text-properties p1 (1+ p1) (list 'remix-context remix-context))))))