[Date Prev] [Date Index] [Date Next]
[Thread Prev] [Thread Index] [Thread Next]

[xyzzy:05437] また教えて欲しいことがあります。



亀井さん、xyzzy-MLのみなさん、こんにちは。
 困った時にしか書き込みしなくて、申し訳ありません。また教えて欲しい点が出てきました。
よろしくお願いします。
 文字列の検索の時、最初の検索方向を保存しておき、再検索の時にこの方向に検索を行うよう
にしたいと思い、siteinit.lに次のような変数、関数を追加しました。
*search-dialog-template*はdialogs.lのと同じ、search-dialog1はsearch-dialogの
*regexp-search*を*regexp-search1*に変えて、一行追加しただけです。

(defvar *search-dialog-template*
  '(dialog 0 0 238 83
    (:caption "文字列の検索")
    (:font 9 "MS Pゴシック")
    (:control
     (:static nil "検索(&S):" #x50020000 7 10 24 8)
     (:combobox search nil #x50210842 35 7 140 96)
     (:button case-fold "大文字小文字を区別する(&C)" #x50010003 35 27 98 10)
     (:button word "単語単位で検索する(&W)" #x50010003 35 40 86 10)
     (:button regexp "正規表現(&E)" #x50010003 35 53 53 10)
     (:button wrap "見つからなければ戻って検索(&V)" #x50010003 35 66 110 10)
     (:button backward "上検索(&P)" #x50010000 181 7 50 14)
     (:button forward "下検索(&N)" #x50010001 181 24 50 14)
     (:button IDCANCEL "キャンセル" #x50010000 181 41 50 14))))

(defvar *regexp-search1* nil)
(defvar *search-direction* nil);新設

(defun search-dialog1 ()
  (interactive)
  (multiple-value-bind (result data)
      (dialog-box *search-dialog-template*
		  (list (cons 'search *minibuffer-search-string-history*)
			(cons 'case-fold (null *case-fold-search*))
			(cons 'word *word-search*)
			(cons 'regexp *regexp-search1*)
			(cons 'search (or (selection-start-end (start end)
					    (buffer-substring start end))
					  (if *regexp-search1*
					      *last-search-regexp*
					    *last-search-string*)))
			(cons 'wrap *wrap-search*))
		  '((word :disable (regexp))
		    (search :non-null "検索文字列を入力して" :enable (forward backward))))
    (when result
      (let ((string (cdr (assoc 'search data))))
	(when string
	  (add-history string '*minibuffer-search-string-history*)
	  (setq *case-fold-search* (null (cdr (assoc 'case-fold data))))
	  (setq *word-search* (cdr (assoc 'word data)))
	  (setq *regexp-search1* (cdr (assoc 'regexp data)))
	  (setq *wrap-search* (cdr (assoc 'wrap data)))
	  (setq *search-direction* (eq result 'backward)); search-dialogにこの行を追加
	  (search-command string (eq result 'backward)
			  (and (null *word-search*) *regexp-search1*)
			  t nil))))))

;repeat-search、新設
(defun repeat-search ()
  (interactive)
  (if *search-direction*
      (repeat-backward-search)
    (repeat-forward-search)))

 これで、最初の検索の時にはsearch-dialog1を、再検索の時にはrepeat-searchを使います。
すると、これまで再検索の時にrepeat-forward-searchを使っていた時と少し違った動作を
するようになりました。検索自体は僕が意図したとおりになされます。ところが、これまでは
一度目の検索の時も再検索の時も見つけた検索文字列の背景を緑に変えて、見つけた文字列が
見やすくなっていました。ところが、上記のrepeat-searchを使った再検索では見つかった
文字列の一文字目にカーソルが移動するだけで、文字列の背景色を変えてくれません。
最初の検索では背景色を変えてくれます。最終的には同じrepeat-forward-searchを使っている
のに、なぜこの違いが出てくるのでしょうか。どうしたら、再検索でも文字列の背景を変えて
くれるのでしょう。
 ご教授よろしくお願いします。

------------------------------------------------------------
渡辺 徹        Email   t-watanabe11@xxxxxxxxxxxx

Index Home