[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: isearch-forward vs. long lines
- From: Hideyuki SHIRAI (白井秀行) <shirai@xxxxxxxxxxx>
- Date: Thu, 12 Jun 2008 18:40:44 +0900 (JST)
- X-ml-name: emacs-w3m
- X-mail-count: 10229
- References: <87ej76r1vn.fsf@xxxxxxxxxxx> <b4miqwg4843.fsf@xxxxxxx> <b4mbq28481l.fsf@xxxxxxx>
白井です。
# 結構忙しくって反応遅いですが、作者なので ^^;;;
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)