🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fj.editor.xemacs
Article #248

Re: スクロールの挙動

#248
From: Seiichi Namba
Date: Wed, 13 Jun 2001 19:45
125 lines
7148 bytes
The following message is a courtesy copy of an article
that has been posted to fj.editor.xemacs as well.

難波です。

IMAI Hidetoshi <hidepin@infonets.hiroshima-u.ac.jp> さん writes:

> 上記のように、問題がないと書いたのですが、1点問題がありました。
> それは、ほとんどの場合最終行の次の行が半分くらいwindowの一番し
> たに見えています。この時には、うまく行くのですが、たまに最終行
> が丁度、windowの一番下と一致することがあります。(つまり次の行
> が全く見えない)この時には、カーソルが画面の中央に飛んでしまい
> ます。そこで下記のように、move-to-window-line の値を変更して
> したから2行目と比較することで飛ぶことがなくなりました。

どうも最下行が半行表示の場合の挙動がやはり emacs-21 とは異なるようです
ね。

> (defsubst after-the-window-p (point)
> 	   "Test if POINT is off the window, being larger than window bottom."
> 	   (> point (save-excursion (move-to-window-line -2) (end-of-line) (point))))
> 
> # なぜか上に移動するときにはこんな動きはしないので
> # 上にカーソルを動かすときの move-to-window-line の
> # 値は変更していません。

minibuffer の挙動がおかしかったので、いろいろいじっている
うちに結局こうなりました。

(defun sane-next-line (arg)
  (interactive "p")
  (let ((newpt (save-excursion (line-move arg) (point))))
    ;; (while (after-the-window-p newpt) (scroll-up 1))
    (while (null (pos-visible-in-window-p newpt)) (scroll-up 1))
    (goto-char newpt)
    (setq this-command 'next-line)
    ()))

(defun sane-previous-line (arg)
  (interactive "p")
  (let ((newpt (save-excursion (line-move (- arg)) (point))))
    ;; (while (before-the-window-p newpt) (scroll-down 1))
    (while (null (pos-visible-in-window-p newpt)) (scroll-down 1))
    (goto-char newpt)
    (setq this-command 'previous-line)
    ()))

;; 元にもどした。
(defun sane-newline (arg)
  (interactive "p")
  (let ((newpt (save-excursion (newline arg) (point))))
    (while (after-the-window-p newpt) (scroll-up 1))
    (goto-char newpt)
    (setq this-command 'newline)
    ()))

;;(defun sane-newline (arg)
;;  (interactive "p")
;;  (cond ((string-match  "^ \\*Minibuf" (buffer-name))
;;         (newline arg))
;;        (t (let ((newpt (save-excursion (newline arg) (point))))
;;             (while (after-the-window-p newpt) (scroll-up 1))
;;             (goto-char newpt))))
;;  (setq this-command 'newline)
;;  ())

(byte-compile 'sane-previous-line)
(byte-compile 'sane-next-line)
(byte-compile 'sane-newline)

(global-set-key [up] 'sane-previous-line)
(global-set-key [down] 'sane-next-line)
(global-set-key "\C-m" 'sane-newline) ;; こっちだけで良いようだ。
;; (global-set-key [return] 'sane-newline) ;; This ruins minibuf/*shell* ?

どうやら、うちの emacs-21 では、(global-set-key [return]'sane-newline)
とするとminibuffer や *shell* バッファで Return キーを押したときの挙動
がおかしくなってしまうようでした。

それと、 before-the-window-p(), after-the-window-p() の2つの関数(イ
ンライン)は不要になりました。pos-visible-in-window-p() というプリミティブ
があったのをすっかり忘れていました。

xemacs ではテストしてません。また、ご指摘の半行表示に関する問題がこの
新しいテスト

(pos-visible-in-window-p newpt)

でどう出てくるかがよく判りません。

emacs-21 の場合、pos-visible-in-window-p() の引数は次のような構成になっ
ていて、半行表示の場合の挙動も指定できるようになっています。しかし、
xemacs-21.1.10 の C ソースを眺めた限りでは、この PARTIALLY という引数
はないようです。

pos-visible-in-window-p is a built-in function.
(pos-visible-in-window-p &optional POS WINDOW PARTIALLY)

Return t if position POS is currently on the frame in WINDOW.
Return nil if that position is scrolled vertically out of view.
If a character is only partially visible, nil is returned, unless the
optional argument PARTIALLY is non-nil.
POS defaults to point in WINDOW; WINDOW defaults to the selected window.

もっと新しい xemacs では同じようになっているのかもしれませんが、もし半
行表示に関する問題が出てしまった場合、調整のしようがないかもしれません。
その場合は昨日お送りした内容のものを使うしかないのかもしれません。

emacs-21 では上のコードで充分なのですが、どうもお書きになっている
挙動では pos-visible-in-window-p を使う方法では駄目のような気もする。

お書きになっている半行表示と move-to-window-line の関係がちょっと異常
な感じもするので、お書きになっている通りだとすると、あるいは xemacs 固
有のバグなのかもしれません。確認したいのですが、

(1) 最下行が半行表示になっている。
(2) 最下行が半行表示ではない。

の2つの状況で、(move-to-window-line -1) を評価した時、何が起きますか?
emacs-21 では (1) の場合は、半行表示の直前の行に移動し、(2) の場合は
もちろん完全に表示されている最下行に移動します。

-- 
難波清一@東京西東京市 (http://www.asahi-net.or.jp/~pi9s-nnb/)
NAMBA Seiichi <sn@asahi-net.email.ne.jp>
Technical Details
Message-ID: <864rtk17w4.fsf@thelonious.smoke.or.jp>
Path: arc1-ca.pugleaf.net!archiver1.google.com!newsfeed.google.com!newsfeed.stanford.edu!newsfeed.mesh.ad.jp!newsfeed.media.kyoto-u.ac.jp!Q.T.Honey!nf.asahi-net.or.jp!not-for-mail
References: <xl9d78jgki9.wl@cal.infonets.hiroshima-u.ac.jp> <9fj2mh$8o1$1@sn.asahi-net.email.ne.jp> <xl94rtuomm1.wl@cal.infonets.hiroshima-u.ac.jp> <9fk0do$48j$1@sn.asahi-net.email.ne.jp> <xl9snhehw1z.wl@cal.infonets.hiroshima-u.ac.jp> <9fkvf1$fu9$1@sn.asahi-net.email.ne.jp> <xl9puchj0a5.wl@cal.infonets.hiroshima-u.ac.jp> <9fler4$sia$1@sn.asahi-net.email.ne.jp> <9flg0i$sia$2@sn.asahi-net.email.ne.jp> <xl9k82ptqrw.wl@cal.infonets.hiroshima-u.ac.jp> <xl9vgm7sib2.wl@cal.infonets.hiroshima-u.ac.jp> <xl9u21rs9d8.wl@cal.infonets.hiroshima-u.ac.jp> <86zobjgds2.fsf@thelonious.smoke.or.jp> <xl98ziyg87z.wl@cal.infonets.hiroshima-u.ac.jp> <861yoqdk1t.fsf@thelonious.smoke.or.jp> <xl9wv6hit9t.wl@cal.infonets.hiroshima-u.ac.jp> <9g5qgq$co6$1@sn.asahi-net.email.ne.jp> <864rtl58lq.fsf@thelonious.smoke.or.jp> <xl9ofrsg2fr.wl@cal.infonets.hiroshima-u.ac.jp> <xl97kyghelk.wl@cal.infonets.hiroshima-u.ac.jp>

Show Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS
X-Google-Thread: 1107f7,bc01201f0ce88c8c
X-Google-Attributes: gid1107f7,public
X-Google-ArrivalTime: 2001-06-13 12:45:44 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!newsfeed.google.com!newsfeed.stanford.edu!newsfeed.mesh.ad.jp!newsfeed.media.kyoto-u.ac.jp!Q.T.Honey!nf.asahi-net.or.jp!not-for-mail
Originator: sn@thelonious.smoke.or.jp
Newsgroups: fj.editor.xemacs
Subject: Re: スクロールの挙動
References: <xl9d78jgki9.wl@cal.infonets.hiroshima-u.ac.jp> <9fj2mh$8o1$1@sn.asahi-net.email.ne.jp> <xl94rtuomm1.wl@cal.infonets.hiroshima-u.ac.jp> <9fk0do$48j$1@sn.asahi-net.email.ne.jp> <xl9snhehw1z.wl@cal.infonets.hiroshima-u.ac.jp> <9fkvf1$fu9$1@sn.asahi-net.email.ne.jp> <xl9puchj0a5.wl@cal.infonets.hiroshima-u.ac.jp> <9fler4$sia$1@sn.asahi-net.email.ne.jp> <9flg0i$sia$2@sn.asahi-net.email.ne.jp> <xl9k82ptqrw.wl@cal.infonets.hiroshima-u.ac.jp> <xl9vgm7sib2.wl@cal.infonets.hiroshima-u.ac.jp> <xl9u21rs9d8.wl@cal.infonets.hiroshima-u.ac.jp> <86zobjgds2.fsf@thelonious.smoke.or.jp> <xl98ziyg87z.wl@cal.infonets.hiroshima-u.ac.jp> <861yoqdk1t.fsf@thelonious.smoke.or.jp> <xl9wv6hit9t.wl@cal.infonets.hiroshima-u.ac.jp> <9g5qgq$co6$1@sn.asahi-net.email.ne.jp> <864rtl58lq.fsf@thelonious.smoke.or.jp> <xl9ofrsg2fr.wl@cal.infonets.hiroshima-u.ac.jp> <xl97kyghelk.wl@cal.infonets.hiroshima-u.ac.jp>
From: Seiichi Namba <sn@asahi-net.email.ne.jp>
Date: 14 Jun 2001 04:45:15 +0900
Organization: Smoke
In-Reply-To: <xl97kyghelk.wl@cal.infonets.hiroshima-u.ac.jp>
Message-ID: <864rtk17w4.fsf@thelonious.smoke.or.jp>
User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.0.103
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp
Posted-To: fj.editor.xemacs
Lines: 125
NNTP-Posting-Host: h200147.ppp.asahi-net.or.jp
X-Trace: 992461542 news3.asahi-net.or.jp 14358 61.114.200.147
X-Complaints-To: ap-net@asahi-net.or.jp