🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fj.editor.xemacs
Article #252

sane-scroll.el 最終版 (was: スクロールの挙動)

#252
From: Seiichi Namba
Date: Thu, 14 Jun 2001 17:12
213 lines
10457 bytes
難波です。

最近は投稿できているようなので Cc: は外してみます。

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

> ありがとうございます。
> ためしてみました。最終行に半行表示があってもなくても、
> この新しい関数ならば中央にカーソルが飛ぶことなく
> スクロールしてくれました。

なるほどそうですか。それはよかったですね。

> 難波さんのおしゃっている"return"に"sane-newline"を割り当てたと
> きのminibufferなどで挙動がおかしくなるというのがどんな場合か
> わかりませんがxemacsで不思議な動作はしていないようでした。

minibuffer では C-m/RET/Return は exit-minibuffer というコマンドになっ
ているはずなのですが、[return] にバインドすると改行が入力されるだけで
minibuffer から出られなくなってしまう、という現象がおきました。*shell* 
バッファでも同じように shell に行が渡らない、という現象がおきました。

何かの関数で、global-map の C-m のキーバインディングを調べて使うように
なっているか、あるいは current buffer のコンテキストが狂っている、と
いったような問題があるのかもしれません。

確認したのは emacs-21 のみで、20.7 や 19.34/19.28 ではどうなるのかは見
ていません。basic.el の my-newline と同じように、C-m のみにバインドす
るようにしたら直りました。

> sane-newline で以下のところを直さないとafter-the-window-pを
> 使用してしまうようでした。
> # これでいいですよね。

その通りです。ファイルを2つ作ってテストしていて、最後に混ぜる時に
間違えて古い方を生かしてしまったようです。

> xemacs-21.1.14 では以下のようになっていました
> ------------------------------------------------------------
> `pos-visible-in-window-p' (buffer: *Hyper Apropos*, mode: Hyper-Apropos)
> 
> 
> Built-in function:
> 
>   arguments: (&optional POS WINDOW)

21.1.14 でもやはり PARTIALLY という引数は無いようですね。そのかわりに 
pos-visible-in-window-safe が使える、というという事なんでしょうかね…

> 更に、pos-visible-in-window-safe という関数が
> ありましたがなにをするものかよく分かりませんでした。
> ------------------------------------------------------------
> `pos-visible-in-window-safe' (buffer: *Hyper Apropos*, mode: Hyper-Apropos)

…safe version というからには、当然、半行表示になっている行は visible とは
判定しないようになっているんではないか、などと考えたのですが、
tar zvxf xemacs-sumo-2000-05-24.tar.gz  xemacs-packages/lisp/edit-utils
して paren.el を読んでみると、

(defsubst pos-visible-in-window-safe (pos)
  "safe version of pos-visible-in-window-p"
  (condition-case nil
      ;; #### - is this needed in XEmacs???
      (pos-visible-in-window-p pos)
      (args-out-of-range nil)))

のような具合で、単に error で止まらないようにしてあるだけのようでした。
事情がよく判りませんが、この位であればわざわざ (require 'paren) せずとも、

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

のかわりに 

(condition-case nil (pos-visible-in-window-p newpt) (args-out-of-range nil))

などとしておいた方がいいのかもしれません。

> しかし、この関数の方に変えても同じように動くようでした。

安全策と考えてこちらをお使いになるのは良いことかもしれません。

たとえば、emacs-21 の場合は、

(pos-visible-in-window-p (+ 300 (point-max)))
(pos-visible-in-window-p -300)

などとしてもエラーにならないのですが、上の "#### - is this needed in XEmacs???"
というコメント(どっちの意味にもとれるんですが、FSF-emacs の paren.el には 
pos-visible-in-window-safe はありません)などからすると、xemacs 特有の
事情があるかもしれない、などとも思われたりもする訳で。

もしお使いになるのであれば、3個所だけなので、たぶん上のように直接書き
変えてしまった方が有利なように思えます。xemacs 起動時に paren.el をロー
ドしたくない、程度の理由ですが。

もう1つは、我々が本件で引数として与えるのは実際に存在する (point) の
値であり、args-out-of-range エラーが起きるようには思えないので、必要な
いのかもしれない、という考えもありそうです。

しばらくお使いになって様子を見てどちらにするか決めてください。

> > (1) 最下行が半行表示になっている。
> > (2) 最下行が半行表示ではない。
> > 
> > の2つの状況で、(move-to-window-line -1) を評価した時、何が起きますか?
> > emacs-21 では (1) の場合は、半行表示の直前の行に移動し、(2) の場合は
> > もちろん完全に表示されている最下行に移動します。
> > 
> 
> 同じことをためしてみたのですが、難波さんがemacsで得た結果と
> 私がxemacsで得た結果は同じでした。

あれ。じゃあ何で (move-to-window-line -2) にしなければ駄目だったんだろうか…。
after-the-window-p() のようなやり方はあまり正式な方法ではないんで、もはや
どうでもいい問題ですが。

そろそろ本当にここらで失礼できそうですね。

最後に sane-scroll.el の全文を貼り直しておきます。xemacs では
(interactive "p") はいずれも (interactive "_p") に変えてください。上の
(condition-case nil (pos-visible-in-window-p newpt) (args-out-of-range nil))
はとりあえず採用していません。

$ cat sane-scroll.el
;; -*- emacs-lisp -*-

;; Fri Jun 15 01:55:46 2001
;; Authour: S.Namba <sn@asahi-net.email.ne.jp>

;; Change (interactive "p") to (interactive "_p") in xemacs

;; Old.
;;(defsubst before-the-window-p (point)
;;  "Test if POINT is off the window, being smaller than window top."
;;  (< point (save-excursion (move-to-window-line 0) (point))))
;;
;;(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 -1) (end-of-line) (point))))
;;
;;(defun sane-next-line (arg)
;;  (interactive "p")
;;  (let ((newpt (save-excursion (line-move arg) (point))))
;;    (while (after-the-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))
;;    (goto-char newpt)
;;    (setq this-command 'previous-line)
;;    ()))

;; New: using `pos-visible-in-window-p',
;; `before-the-window-p' and `after-the-window-p'
;; is not needed anymore.

(defun sane-next-line (arg)
  "Goto next line by ARG steps with scrolling sanely if needed."
  (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)
  "Goto previous line by ARG steps with scrolling back sanely if needed."
  (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)
  "Put newline\(s\) by ARG with scrolling sanely if needed."
  (interactive "p")
  (let ((newpt (save-excursion (newline arg) (point))))
    ;; (while (after-the-window-p newpt) (scroll-up 1))
    (while (pos-visible-in-window-p newpt) (scroll-up 1))
    (goto-char newpt)
    (setq this-command 'newline)
    ()))

;;(defun sane-newline (arg)
;;  "Put newline\(s\) by ARG with scrolling sanely if needed."
;;  (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* ?

-- 
難波清一@東京西東京市 (http://www.asahi-net.or.jp/~pi9s-nnb/)
NAMBA Seiichi <sn@asahi-net.email.ne.jp>
Technical Details
Message-ID: <9gar99$b4m$1@sn.asahi-net.email.ne.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> <864rtk17w4.fsf@thelonious.smoke.or.jp> <xl93d93fjdc.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-14 10:12:17 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
From: Seiichi Namba <sn@asahi-net.email.ne.jp>
Newsgroups: fj.editor.xemacs
Subject: sane-scroll.el 最終版 (was:
  スクロールの挙動)
Date: 15 Jun 2001 02:12:09 +0900
Organization: Smoke
Message-ID: <9gar99$b4m$1@sn.asahi-net.email.ne.jp>
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> <864rtk17w4.fsf@thelonious.smoke.or.jp> <xl93d93fjdc.wl@cal.infonets.hiroshima-u.ac.jp>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 8bit
Lines: 213
NNTP-Posting-Host: g039221.ppp.asahi-net.or.jp
X-Trace: 992538735 news3.asahi-net.or.jp 14357 211.132.39.221
X-Complaints-To: ap-net@asahi-net.or.jp