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

Re: isearch-forward vs. long lines



白井です。

# 結構忙しくって反応遅いですが、作者なので ^^;;;

From: Katsumi Yamaoka <yamaoka@xxxxxxx> さん曰く
Subject: [emacs-w3m:10227] Re: isearch-forward vs. long lines
Message-ID: <b4mbq28481l.fsf@xxxxxxx>
Date: Wed, 11 Jun 2008 18:47:50 +0900

> > (defadvice w3m-auto-show (around work-for-isearch activate)
> >   "Make it work while isearch."
> >   (let ((w3m-current-position (list nil
> > 				    (point-min-marker)
> > 				    (point-max-marker))))
> >     ad-do-it))
>
> > But this is no more than a workaround.  Someone has to review
> > what `w3m-current-position' means and fix it properly.  I'll
> > explain it in Japanese in another message...
>
> w3m バッファ上で行なう isearch の行き先が現在位置とは違う行にあっ
> て、しかも window の外にある場合に `w3m-auto-show' が hscroll し
> てくれないので見えませんというお話。今まで isearch の問題だと思っ
> ていたんですが、ちょっと追いかけてみると `w3m-current-position'
> が示す位置の外に isearch の行き先があるせいだとわかりました。こ
> れは作者さまにお出ましいただけないと無理かな、と。^^;;

もう 6年前のことのことなのでまったく覚えていないのだけど、以下の
関数をじーーと見て少し思い出してきました。

(defun w3m-auto-show ()
  "Scroll horizontally so that the point is visible."
  (when (and truncate-lines
	     w3m-auto-show
	     (not w3m-horizontal-scroll-done)
	     (not (and (eq last-command this-command)
		       (or (eq (point) (point-min))
			   (eq (point) (point-max)))))
	     (markerp (nth 1 w3m-current-position))
	     (markerp (nth 2 w3m-current-position))
	     (>= (point) (marker-position (nth 1 w3m-current-position)))
	     (<= (point) (marker-position (nth 2 w3m-current-position))))
    (w3m-horizontal-on-screen))
  (setq w3m-horizontal-scroll-done nil))

なにかのコマンドで行が変わったときは、横スクロールでの追従を止め
ている(これが isearch での NG につながる)のは、

(1) 長い行の一番右側をスクロールした状態で表示している。
(2) next-line で一行下に移動したら、その行が短くて point() が
    column=0 の位置だった。
(3) 「行が変わったら横スクロールは追従しない」というルールが無かっ
    たら、column=0 を表示するために横スクロールしない状態になっ
    ちゃう。

という問題に対処したからだったような気がします。

『行が変わった』ことが何に起因したか判定できないと、(3) の問題が
起きちゃうので、うーーむ、難しいかも。

(or (isearch か?) ;; 他のコマンドもあるし
    (and (>= (point) (marker-position (nth 1 w3m-current-position)))
	 (<= (point) (marker-position (nth 2 w3m-current-position)))))

な感じだろうけど。

まぁ、isearch だけ特別扱いするなら、各自の責任で↓とするというも
のありますが。。これも、なんだかなぁ。。。

(defvar original-auto-hscroll-mode nil)
(make-variable-buffer-local 'original-auto-hscroll-mode)
(defadvice isearch-mode (before auto-hscroll-mode activate)
  (when (eq major-mode 'w3m-mode)
    (setq original-auto-hscroll-mode
	  (cond ((boundp 'auto-hscroll-mode)
		 auto-hscroll-mode)
		((boundp 'automatic-hscrolling)
		 automatic-hscrolling)
		((boundp 'auto-show-mode)
		 auto-show-mode)
		((boundp 'hscroll-mode)
		 hscroll-mode)))
    (when (boundp 'auto-hscroll-mode)
      (set (make-local-variable 'auto-hscroll-mode) t))
    (when (boundp 'automatic-hscrolling)
      (set (make-local-variable 'automatic-hscrolling) t))
    (when (boundp 'auto-show-mode)
      (set (make-local-variable 'auto-show-mode) t))
    (when (boundp 'hscroll-mode)
      (set (make-local-variable 'hscroll-mode) t))))

(defadvice isearch-done (after auto-hscroll-mode activate)
  (when (eq major-mode 'w3m-mode)
    (when (boundp 'auto-hscroll-mode)
      (set (make-local-variable 'auto-hscroll-mode)
	   original-auto-hscroll-mode))
    (when (boundp 'automatic-hscrolling)
      (set (make-local-variable 'automatic-hscrolling)
	   original-auto-hscroll-mode))
    (when (boundp 'auto-show-mode)
      (set (make-local-variable 'auto-show-mode)
	   original-auto-hscroll-mode))
    (when (boundp 'hscroll-mode)
      (set (make-local-variable 'hscroll-mode)
	   original-auto-hscroll-mode))))

-- 
白井秀行 (mailto:shirai@xxxxxxxxxxx)