Article View: fj.editor.xemacs
Article #240Re: スクロールの挙動
From: Seiichi Namba
Date: Tue, 12 Jun 2001 11:17
Date: Tue, 12 Jun 2001 11:17
121 lines
7354 bytes
7354 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:
> > なんか行の数え方が emacs と xemacs では違うような感じになってますね。
> > ひょっとして、xemacs では ウィンドウの一番上の行に行くのは
> > (move-to-window-line 1) なのかしら? それとも半行表示の扱いが違う、
> > とか、そっちの問題かしら?
> >
>
>
> ためしてみましたが、(move-to-window-line 0)で、1番上の行に移動しま
> した。(move-to-window-line 1)だと、上から2番目の行に移動します。
これは普通の emacs と同じですね。じゃあ何故? …何か、
半行表示の時にでる小数点以下の計算誤差か何かが原因ですかね。それが
emacs と xemacs で違う、みたいな?
> 設定して使用したのですが、bufferの最終行で my-newline を
> 実行すると、カーソルの位置が実行する度に一段ずつ上がっていきま
> す。(Windowの中でのカーソルの位置のことで、bufferの行数は増え
> ています)ずっと繰り返していくと最後には1行目と2行目のどちらか
> を行ったりきたりします。(top-edge 1のため起きていると思います。
> )
過激に表示範囲がジャンプする、というのが抑制できているのであれば、
それ以上はあきらめていただくしかないのかもしれません。
> しかし、できればxemacs本体でこのバグを直してほしいとも思ってい
> ます。(他のアプリケーションで問題が発生するかも知れないから)
emacs-19/20/21 でも同じ問題があり、明らかにバグのように思えますね。
> 今は、チョット忙しくてできそうもないですが、時間をつくって
> 英語でメールを書いてみようと思います。そのときには相談すると
> 思います。よろしくお願いします。
私など頼りにしなくても、誠意ある交渉であれば必ず相手に伝わるはずです。
elisp の事をどれだけ知っているか、とか、英語が上手か下手か、などとは一
切関係がないと思いますよ。交渉の過程など知らせていただければ嬉しいですが。
その後、
emacs-21 で、変数設定のみで解決できないか、と少し試してみましたが(
xemacs に同じ変数があるかどうかは確認してません)、
(progn (setq scroll-margin 0)
(setq scroll-step 1)
(setq scroll-down-aggressively 0.01)
(setq scroll-up-aggressively 0.01)
;; (setq scroll-conservatively 8)
(setq scroll-conservatively 1)
)
などとすると半画面スクロールの起きる確率はかなり少なくなるように思いま
した(emacs-20 などよりは良いようです)。しかし、やはり100%確実に動
作しているとは思えません。
また、info を見ても、これら各変数の意味や相互関係は非常に理解しがたい
です(こんなに沢山変数がある必要があるのか? 行きあたりばったりに増設さ
れてきたような感じがする。うまく動いてなくても不思議じゃない、かもしれ
ませんね)。
また emacs-21.0.103 には window-text-height という関数があり、これが実
際の表示行数を返すのかな、と思ったのですが、行間を変えても
(window-text-height) はいつも同じ行数を返しているようです
((1-(window-height)) の値のようだ)。
info や apropos で捜してみても、他にはそれらしい関数はみつかりませんでした。
なお、バッファの終りが見えている時の補正を行なうために、次のようなやり
方も試してみました。scroll-step == 1 相当の動作としてはこれが今のとこ
ろ最も動作の信頼性があるようですが、コメントにあるように
special-display-frame-alist (これも xemacs にあるかどうか知らない)に登
録されている frame の場合は信頼性が落ちます。また、行間が 0 以外の時は
多少誤動作が増えるようです。
(defsubst basic-get-real-window-height ()
"Get `real' window height. Mainly for emacs-21 \(or xemacs maybe\)."
(let ((bn " *window-height*"))
(save-window-excursion
;; Must be `switch-to-buffer' (`set-buffer' is not reliable),
;; but "Cannot switch buffers in a dedicated window" occurs for
;; some buffer. So sometimes weird value returned for buffers
;; eg. listed in `special-display-frame-alist'.
(or
(condition-case nil (switch-to-buffer bn) (error nil))
(set-buffer bn))
(if (= 500 (buffer-size)) ()
(erase-buffer) (insert (make-string 500 ?\n)))
(goto-char 1)
(move-to-window-line -2)))) ;; -2 で少し余裕を取っている
(defun smooth-scroll-up (arg)
"Moves cursor down keeping cursor within 1/3 to 2/3 area of current window.
Scroll the window in need.
It's convenient to bind this command to down arrow key."
(interactive "p")
(let* (;;(height (1- (window-height)))
(height (basic-get-real-window-height))
;; (parity (% height 2))
(top-edge 0)
(btm-edge height)
(c-line (current-line-in-window))
(bob-not-shown ;; var. to duck ding.
(not (pos-visible-in-window-p (point-min)))))
;; 以下同様
本件に関しては、emacs-21 でも オリジナルの smooth-scroll-up/down の動作が
完全ではないので良い方法が見付かれば直したいと思っています。
しかし、emacs-21 でも、オリジナルの smooth-scroll-up/down の仕様では極
端に行間を大きくしないかぎり カーソルの移動範囲が正確にウィンドウ中央の
1/4 ~ 3/4 の範囲に収まらない、という程度の問題にすぎないので、上のような
basic-get-real-window-height() を使うくらいなら、もう少し放っておこうか、
と思っています。もともとの目的が半画面ジャンプをなくそう、というものでは
ないので…。
Technical Details
Message-ID:
<861yoqdk1t.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!newsfeed.rim.or.jp!Q.T.Honey!nf.asahi-net.or.jp!not-for-mailReferences:
<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>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-12 04:17:16 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!newsfeed.rim.or.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> From: Seiichi Namba <sn@asahi-net.email.ne.jp> Date: 12 Jun 2001 20:17:18 +0900 Organization: Smoke In-Reply-To: <xl98ziyg87z.wl@cal.infonets.hiroshima-u.ac.jp> Message-ID: <861yoqdk1t.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: 121 NNTP-Posting-Host: g032090.ppp.asahi-net.or.jp X-Trace: 992344634 news3.asahi-net.or.jp 18684 211.132.32.90 X-Complaints-To: ap-net@asahi-net.or.jp