Thread View: fj.editor.xemacs
30 messages
30 total messages
Started by IMAI Hidetoshi
Tue, 05 Jun 2001 12:48
スクロールの挙動
Author: IMAI Hidetoshi
Date: Tue, 05 Jun 2001 12:48
Date: Tue, 05 Jun 2001 12:48
33 lines
2477 bytes
2477 bytes
今井@広島大学です 先月以下のような質問をしたのですが、 やはりうまく行かないのでもう一度質問させてください。 (スレッドが切れてしまって申し訳ありません。) ------------------------------------------------------------ FreeBSD4.3 で xemacs-21.1.14 を使用しています。 デフォルトでは、テキストの末尾で "↓" を押すと半ページスクロー ルします。 この挙動が気味が悪いので、一行ずつスクロールする方法を、 google などで検索したところ以下のオプションを見つけました。 (setq scroll-step 1) 確に、数十行スクロールさせるには一行ずつスクロールするのですが そのまま連続でスクロールさせると、なぜか途中で一行ずつではなく 半ページスクロールすることがあります。 この挙動は、仕様なのでしょうか? それとも回避する方法があるのならば教えてください。 ------------------------------------------------------------ 前回、c-quick, basic.el を教えていただいたのですが、 http://primeserver.fujitsu.com/jp/ds90/freesoft/gnu-v20l10-src.html http://www.asahi-net.or.jp/~pi9s-nnb/basic4d.tar.gz どちらも、Ctrl-Space で "Mark Set" してから リージョンが指定で きません。 なにかいい方法があれば教えてください。お願いします。
Re: スクロールの挙動
Author: Seiichi Namba
Date: Tue, 05 Jun 2001 16:51
Date: Tue, 05 Jun 2001 16:51
22 lines
1835 bytes
1835 bytes
難波です。 IMAI Hidetoshi <hidepin@infonets.hiroshima-u.ac.jp> さん writes: > 前回、c-quick, basic.el を教えていただいたのですが、 > > http://primeserver.fujitsu.com/jp/ds90/freesoft/gnu-v20l10-src.html > http://www.asahi-net.or.jp/~pi9s-nnb/basic4d.tar.gz > > どちらも、Ctrl-Space で "Mark Set" してから リージョンが指定で > きません。 > なにかいい方法があれば教えてください。お願いします。 c-quick.el も basic.el の smooth-scroll-up/down も mark に関しては何も 処理していないと思うので、「リージョンが指定できない」というのは解せな いように思います。 具体的に「このような動作を期待している」が「こうしかならない」という ように書いてみていただけますか。 手元では、C-SPC した後、smooth-scroll-down して先に進み、C-x C-x すれば 元の位置に戻るので、動作は正常に思えます。
Re: スクロールの挙動
Author: IMAI Hidetoshi
Date: Tue, 05 Jun 2001 17:36
Date: Tue, 05 Jun 2001 17:36
95 lines
4808 bytes
4808 bytes
今井です。
At 06 Jun 2001 01:51:29 +0900,
Seiichi Namba wrote:
>
> 難波です。
>
> c-quick.el も basic.el の smooth-scroll-up/down も mark に関しては何も
> 処理していないと思うので、「リージョンが指定できない」というのは解せな
> いように思います。
>
> 具体的に「このような動作を期待している」が「こうしかならない」という
> ように書いてみていただけますか。
>
> 手元では、C-SPC した後、smooth-scroll-down して先に進み、C-x C-x すれば
> 元の位置に戻るので、動作は正常に思えます。
編集したいファイルを開き、C-SPC でマークをする。
C-n で "smooth-scroll-down" を数回実行する。
このあと、C-w で kill-region を実行したい。
という作業をしたいのですが、kill-regionできません。
.emacsに書き加えた、basic.el の一部を添付します。
よろしくお願いします。
;--------------------------------------------------
;scrollの設定
;--------------------------------------------------
(defun current-line-in-window ()
"Returns line count of current line in current window. No arg."
(save-excursion
;; goto bol not to count \n at eol of this line...
(beginning-of-line)
(count-lines (point)
(save-excursion (move-to-window-line 0)
(point)))))
(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)))
(parity (% height 2))
(top-edge (/ (1- height) 4))
(btm-edge (+ (1+ parity) (* top-edge 3)))
(c-line (current-line-in-window))
(bob-not-shown;; var. to duck ding.
(not (pos-visible-in-window-p (point-min)))))
;; Old code.
;; (bob-not-shown (if (/= (point-min) ;; var. to duck ding.
;; (save-excursion
;; (move-to-window-line 0)
;; (point))) t nil)))
(if
;; Case cursor is within central area:
(or (and (> arg 0)
(<= c-line btm-edge)
(< (- btm-edge c-line) arg))
(and (< arg 0)
(>= c-line top-edge)
;;(< (- c-line top-edge) (- arg)) ;; old code for next line.
(> (- top-edge c-line) arg)
bob-not-shown))
(scroll-up arg)
;; else if cursor is in peripheral area:
;; re-calibrating cursor to central area.
(progn
(if (and (> arg 0)
(> c-line btm-edge))
(scroll-up (+ arg (- c-line btm-edge))))
(if (and (< arg 0)
(< c-line top-edge)
bob-not-shown)
(scroll-up (+ arg (- c-line top-edge))))))
(line-move arg)
(setq this-command 'next-line)))
(defun smooth-scroll-down (arg)
"Moves cursor up keeping cursor within 1/3 to 2/3 area of current wind
ow.
Scroll the window in need.
It's convenient to bind this command to up arrow key."
(interactive "p")
(smooth-scroll-up (- arg))
(setq this-command 'previous-line))
(global-set-key "\C-p" 'smooth-scroll-down)
(global-set-key [up] 'smooth-scroll-down)
(global-set-key "\C-n" 'smooth-scroll-up)
(global-set-key [down] 'smooth-scroll-up)
Re: スクロールの挙動
Author: Seiichi Namba
Date: Wed, 06 Jun 2001 01:18
Date: Wed, 06 Jun 2001 01:18
43 lines
2544 bytes
2544 bytes
難波です。 IMAI Hidetoshi <hidepin@infonets.hiroshima-u.ac.jp> さん writes: > 編集したいファイルを開き、C-SPC でマークをする。 > C-n で "smooth-scroll-down" を数回実行する。 > このあと、C-w で kill-region を実行したい。 > > という作業をしたいのですが、kill-regionできません。 mule-2.3 (@19.34) を使い、 $ emacs -q & として起動して > .emacsに書き加えた、basic.el の一部を添付します。 > よろしくお願いします。 お書きになったコードを評価して C-SPC C-n C-n C-w を実行しましたが異常は認められませんでした。 $ emacs -q & と起動してこの部分のみを別ファイルに保存し、それを M-x load-file RET してテストしてみて下さい。もしそれで問題が出なければ、.emacs の他の部 分に問題があると思われます(逆に .emacs から件の個所を消してみて同じか どうか調べてもいいでしょう)。 たとえば C-w が kill-region にバインドされていないとか? これは C-h c C-w や C-h k C-w で調べられると思います。 -q オプションを使うこと、意図した関数が実際に実行されているかどうかを 調べるのは重要です。 それとも xemacs ってそんなに違うんだろうか…。 PS. 前のスレッドでは画面の端までカーソルを動かせるようにした smooth-scroll-down/up を投稿したのですが、そちらは届いていますか。手元 の機械ではexpire してしまっており、昨夜確認したところログも残していない のでちょっと気になりました。
Re: スクロールの挙動
Author: IMAI Hidetoshi
Date: Wed, 06 Jun 2001 08:06
Date: Wed, 06 Jun 2001 08:06
51 lines
3079 bytes
3079 bytes
今井です。 いつもありがとうございます。 At 06 Jun 2001 10:18:40 +0900, Seiichi Namba wrote: > > 難波です。 > > IMAI Hidetoshi <hidepin@infonets.hiroshima-u.ac.jp> さん writes: > > $ emacs -q & > > と起動してこの部分のみを別ファイルに保存し、それを M-x load-file RET > してテストしてみて下さい。もしそれで問題が出なければ、.emacs の他の部 > 分に問題があると思われます(逆に .emacs から件の個所を消してみて同じか > どうか調べてもいいでしょう)。 > > たとえば C-w が kill-region にバインドされていないとか? > これは C-h c C-w や C-h k C-w で調べられると思います。 > > -q オプションを使うこと、意図した関数が実際に実行されているかどうかを > 調べるのは重要です。 > > それとも xemacs ってそんなに違うんだろうか…。 早速やってみました。 $ xemacs -q M-x load-file (リターン) hogehoge (このhogehogeは以前添付した関数を保存したもの) C-SPC C-n C-n すでにここでリージョンが表示されません。 更に C-w とすると、 "The region is not active now" となりやはり、リージョンが選択できないようです。 xemacs と emacs では違いが大きいということですか? > > PS. > 前のスレッドでは画面の端までカーソルを動かせるようにした > smooth-scroll-down/up を投稿したのですが、そちらは届いていますか。手元 > の機械ではexpire してしまっており、昨夜確認したところログも残していない > のでちょっと気になりました。 以前、いただいたものもためして見たのですが、 動きがおかしかったので、元に戻しました。
Re: スクロールの挙動
Author: Seiichi Namba
Date: Wed, 06 Jun 2001 10:08
Date: Wed, 06 Jun 2001 10:08
81 lines
4295 bytes
4295 bytes
難波です。
IMAI Hidetoshi <hidepin@infonets.hiroshima-u.ac.jp> さん writes:
> M-x load-file (リターン)
> hogehoge (このhogehogeは以前添付した関数を保存したもの)
>
> C-SPC C-n C-n
C-SPC の操作と同時にエコー領域には "Mark set" と表示される
はずなんですが、それは出ますか。たぶんその xemacs にも *Messages*
というバッファがあると思うので、C-x 4 b などで *Messages* バッファを
表示させつつ確認してください。あるいは
C-h c C-SPC
とした時に
C-SPC runs the command set-mark-command
と表示されますか(まさか xemacs のコマンド名変ってないよな)。これが出
ないとなると、このメッセージ通り
> "The region is not active now"
マークが置かれていないんじゃないかしら。C-SPC C-n C-n C-x C-x しても、
C-SPC した位置には戻れないんですよね?
やはり、c-quick.el や smooth-scroll-up/down 以前の問題のように思えます。
当然ながら、単に xemacs -q して smooth-scroll-up/down も何もロードしない
状態でも同じ問題が起きていると思うのですが、違いますか?
(この点はぜひご返事ください。自分の作ったものが関係しているので気になります)
xemacs は X クライアントとして動かしているんですよね?
とりあえず、xev を使って、Control_L とか space キーがちゃんと入力され
ているかどうかを確認してみるんでしょうかねえ。なんか C-SPC が emacs に
ちゃんと入力されていないように思えます。
ここから先は xemacs/FreeBSD に詳しい方でないと無理かもしれません。
emacs で C-SPC が入らない、という状態になった事が無いので、今はこれ以上は
よく判りません。
そういや遠い昔に C-M- とか S-M- とかのコンビネーションが FreeBSD のコ
ンソールから入らなかったんで何かセットアップした記憶がありますが、
C-SPC は何もしなくても入ったように思うなあ。まして X クライアントとし
て動かしているのであれば、たぶん大丈夫だと思うんですが、ちなみに X
のバージョンは何ですか(X の問題としてもあまり聞いたことが無いような気
がするんだけど)。
> すでにここでリージョンが表示されません。
emacs では transient-mark-mode などを設定していない限り指定した範囲は
特別表示されません。この点は今は問題にしなくていいでしょう。
また、たとえ、transient-mark-mode を使ったとしても手元では
smooth-scroll-up/down は意図した通りに動きます。
smooth-scroll-up/down は要するに手で
scroll-up()
line-move() (next-line の要部)
を呼ぶのと同じ処理、および
(setq this-command 'next-line)
を実行しているだけのものです。このような処理で mark-ring が壊れるとは
思えないんですが xemacs では何か起きるのでしょうかねえ。
> 以前、いただいたものもためして見たのですが、
> 動きがおかしかったので、元に戻しました。
どっちがどっちだかこのご説明ではよく判りませんが、前の記事にお書きになって
いるように basic.el のバージョンに戻した、ということですね。
--
難波清一@東京西東京市 (http://www.asahi-net.or.jp/~pi9s-nnb/)
NAMBA Seiichi <sn@asahi-net.email.ne.jp>
Re: $B%9%/%m!<%k$N5sF0(B
Author: Takao Ono
Date: Wed, 06 Jun 2001 10:52
Date: Wed, 06 Jun 2001 10:52
34 lines
3003 bytes
3003 bytes
$B>.Ln(B@$BL>8E20Bg3X(B $B$G$9(B. c-quick $B$O;H$C$F$$$J$$$s$G$9$,(B xemacs $B$r;H$C$F$$$k<T$H$7$F(B, emacs $B$H$N0c$$$r=R$Y$?$$$H;W$$$^$9(B. <9fkvf1$fu9$1@sn.asahi-net.email.ne.jp>$B$N5-;v$K$*$$$F(B sn@asahi-net.email.ne.jp$B$5$s$O=q$-$^$7$?!#(B sn> C-SPC $B$NA`:n$HF1;~$K%(%3!<NN0h$K$O(B "Mark set" $B$HI=<($5$l$k(B sn> $B$O$:$J$s$G$9$,!"$=$l$O=P$^$9$+!#$?$V$s$=$N(B xemacs $B$K$b(B *Messages* sn> $B$H$$$&%P%C%U%!$,$"$k$H;W$&$N$G!"(BC-x 4 b $B$J$I$G(B *Messages* $B%P%C%U%!$r(B sn> $BI=<($5$;$D$D3NG'$7$F$/$@$5$$!#$"$k$$$O(B $B<j85$N(B xemacs-21.4.2 $B$G$O(B, $B%P%C%U%!(B' *Message-Log*' $B$K$O(B "Mark set" $B$NI=<($O=P$^$;$s(B. $B%P%C%U%!(B' *Echo Area*' $B$r$*;H$$$/$@$5$$(B. # $B$"$($F(B ' $B$G%P%C%U%!L>$r$/$/$C$?$N$O(B, $B$3$l$i$,6uGr$G;O$^$k$+$i$G(B # $B$9(B. sn> C-SPC runs the command set-mark-command sn> $B$HI=<($5$l$^$9$+!J$^$5$+(B xemacs $B$N%3%^%s%IL>JQ$C$F$J$$$h$J!K!#(B $B$3$l$OJQ$o$C$F$$$^$;$s(B. sn> $B$H$j$"$($:!"(Bxev $B$r;H$C$F!"(BControl_L $B$H$+(B space $B%-!<$,$A$c$s$HF~NO$5$l(B sn> $B$F$$$k$+$I$&$+$r3NG'$7$F$_$k$s$G$7$g$&$+$M$(!#$J$s$+(B C-SPC $B$,(B emacs $B$K(B sn> $B$A$c$s$HF~NO$5$l$F$$$J$$$h$&$K;W$($^$9!#(B C-SPC $B$,F~$i$J$$$H$9$k$H(B, C-@ $B$O$I$&$G$7$g$&$+(B? sn> > $B$9$G$K$3$3$G%j!<%8%g%s$,I=<($5$l$^$;$s!#(B sn> emacs $B$G$O(B transient-mark-mode $B$J$I$r@_Dj$7$F$$$J$$8B$j;XDj$7$?HO0O$O(B sn> $BFCJLI=<($5$l$^$;$s!#$3$NE@$O:#$OLdBj$K$7$J$/$F$$$$$G$7$g$&!#(B xemacs $B$G$O%G%U%)%k%H$G(B transient-mark-mode $B$K$J$C$F$$$^$9$N$G(B, $B$3$3$G%j!<%8%g%s$,I=<($5$l$J$$$H$9$k$HK\Ev$K%^!<%/$5$l$F$$$J$$$N(B $B$+$b$7$l$^$;$s(B. -- $BL>8E20Bg3X(B $B9)3XIt(B $BEE;R9)3X2J(B $BJ?ED8&5f<<(B $B>.Ln(B $B9'CK(B
Re: スクロールの挙動
Author: IMAI Hidetoshi
Date: Wed, 06 Jun 2001 11:49
Date: Wed, 06 Jun 2001 11:49
115 lines
5872 bytes
5872 bytes
今井です。 At 06 Jun 2001 19:08:33 +0900, Seiichi Namba wrote: > > 難波です。 > > C-SPC の操作と同時にエコー領域には "Mark set" と表示される > はずなんですが、それは出ますか。たぶんその xemacs にも *Messages* > というバッファがあると思うので、C-x 4 b などで *Messages* バッファを > 表示させつつ確認してください。あるいは > > C-h c C-SPC > > とした時に > > C-SPC runs the command set-mark-command > > と表示されますか(まさか xemacs のコマンド名変ってないよな)。これが出 > ないとなると、このメッセージ通り > > > "The region is not active now" > > マークが置かれていないんじゃないかしら。C-SPC C-n C-n C-x C-x しても、 > C-SPC した位置には戻れないんですよね? > > やはり、c-quick.el や smooth-scroll-up/down 以前の問題のように思えます。 > > 当然ながら、単に xemacs -q して smooth-scroll-up/down も何もロードしない > 状態でも同じ問題が起きていると思うのですが、違いますか? > (この点はぜひご返事ください。自分の作ったものが関係しているので気になります) > いろいろありがとうございます。 残念ながら、マークはちゃんとできているようです。 私の説明が不足していました。 C-SPC C-f C-f だとちゃんとリージョンが表示されますし、C-w で削除することが できます。 smooth-scroll-up/down を使った場合に、リージョンが表示されませ んし、C-w で削除することができません。 というわけで、ちゃんと "Mark set" と表示されますし "C-SPC runs the command set-mark-command" と表示されます。 なにもロードしない場合ですと、C-n は next-line C-p は previous-line に割り当てられています。 私の考えでは、emacs,mule と xemacs の関数でことなる点があるの ではと思っています。 (lisp に詳しくないので自信はないですが) > > xemacs は X クライアントとして動かしているんですよね? > > とりあえず、xev を使って、Control_L とか space キーがちゃんと入力され > ているかどうかを確認してみるんでしょうかねえ。なんか C-SPC が emacs に > ちゃんと入力されていないように思えます。 > 一応これも確認しましたが問題ありません。 > ここから先は xemacs/FreeBSD に詳しい方でないと無理かもしれません。 > > emacs で C-SPC が入らない、という状態になった事が無いので、今はこれ以上は > よく判りません。 > > そういや遠い昔に C-M- とか S-M- とかのコンビネーションが FreeBSD のコ > ンソールから入らなかったんで何かセットアップした記憶がありますが、 > C-SPC は何もしなくても入ったように思うなあ。まして X クライアントとし > て動かしているのであれば、たぶん大丈夫だと思うんですが、ちなみに X > のバージョンは何ですか(X の問題としてもあまり聞いたことが無いような気 > がするんだけど)。 > デフォルトの状態で C-SPC が入力できますし、上の方に書いた通り C-f もしくは, next-line などではちゃんと マークもリージョンも 指定できるので X は関係ないとおもいます。 > > すでにここでリージョンが表示されません。 > > emacs では transient-mark-mode などを設定していない限り指定した範囲は > 特別表示されません。この点は今は問題にしなくていいでしょう。 > また、たとえ、transient-mark-mode を使ったとしても手元では > smooth-scroll-up/down は意図した通りに動きます。 > > smooth-scroll-up/down は要するに手で > > scroll-up() > line-move() (next-line の要部) > > を呼ぶのと同じ処理、および > > (setq this-command 'next-line) > > を実行しているだけのものです。このような処理で mark-ring が壊れるとは > 思えないんですが xemacs では何か起きるのでしょうかねえ。 > > > 以前、いただいたものもためして見たのですが、 > > 動きがおかしかったので、元に戻しました。 > > どっちがどっちだかこのご説明ではよく判りませんが、前の記事にお書きになって > いるように basic.el のバージョンに戻した、ということですね。 > その通りです。 説明がわかりにくく申し訳ありません。 最後に、自分のマシンに mule をインストールしてどうなるか ためしてみましたが、mule だと、上記の不具合はでませんでした。
Re: スクロールの挙動
Author: IMAI Hidetoshi
Date: Wed, 06 Jun 2001 12:05
Date: Wed, 06 Jun 2001 12:05
29 lines
2699 bytes
2699 bytes
今井です。 At 6 Jun 2001 10:52:12 GMT, Takao Ono wrote: > > 小野@名古屋大学 です. > > c-quick は使っていないんですが xemacs を使っている者として, emacs > との違いを述べたいと思います. > > C-SPC が入らないとすると, C-@ はどうでしょうか? C-SPC でも、 C-@でもどちらでも "Mark Set" はできます。 ただ、他の記事で書いてある通り smooth-scroll-down/up を 使うとリージョンが表示されなくなってしまいます。 > > sn> > すでにここでリージョンが表示されません。 > sn> emacs では transient-mark-mode などを設定していない限り指定した範囲は > sn> 特別表示されません。この点は今は問題にしなくていいでしょう。 > xemacs ではデフォルトで transient-mark-mode になっていますので, > ここでリージョンが表示されないとすると本当にマークされていないの > かもしれません. 確かに、mule ならばデフォルトではリージョンが表示されませんで したが xemacs ならば next-line などを使った場合は ちゃんとリージョンが可視化されていました。
Re: スクロールの挙動
Author: Akihiro Arisawa
Date: Wed, 06 Jun 2001 14:28
Date: Wed, 06 Jun 2001 14:28
29 lines
2889 bytes
2889 bytes
>>>>> In <xl9n17lizju.wl@cal.infonets.hiroshima-u.ac.jp> >>>>> IMAI Hidetoshi <hidepin@infonets.hiroshima-u.ac.jp> wrote: > 確かに、mule ならばデフォルトではリージョンが表示されませんで > したが xemacs ならば next-line などを使った場合は > ちゃんとリージョンが可視化されていました。 XEmacs のデフォルトでは `zmacs-regions' は t なのですが、この場合はほ とんどのコマンドを実行後に region 指定が deactive となります。 (setq zmacs-regions nil) とすると、smooth-scroll-up/down を実行後も region 指定は active なままと思います。 ;; かわりにリージョンがハイライト表示されなくなりますが。 zmacs-regions を t のまま使いたい場合は、smooth-scroll-up/down の最後 で (setq zmacs-region-stays t) を評価するようにすると良いと思います。 original をそのまま使うならば、.emacs 等で以下のように設定してはどうで しょうか。 (defadvice smooth-scroll-up (after zmacs activate) (setq zmacs-region-stays t)) (defadvice smooth-scroll-down (after zmacs activate) (setq zmacs-region-stays t)) 詳細は `zmacs-regions' の DOCSTRING 等を参照ください。 -- 有沢 明宏
Re: スクロールの挙動
Author: Seiichi Namba
Date: Wed, 06 Jun 2001 14:31
Date: Wed, 06 Jun 2001 14:31
84 lines
4649 bytes
4649 bytes
難波です。
IMAI Hidetoshi <hidepin@infonets.hiroshima-u.ac.jp> さん writes:
> というわけで、ちゃんと
> "Mark set" と表示されますし
> "C-SPC runs the command set-mark-command" と表示されます。
>
> なにもロードしない場合ですと、C-n は next-line C-p は previous-line
> に割り当てられています。
>
> 私の考えでは、emacs,mule と xemacs の関数でことなる点があるの
> ではと思っています。
> (lisp に詳しくないので自信はないですが)
手元の cdrom に xemacs-21.1.10 があったので make して試してみました
(20.4 以来初)。
症状を確認しました。ずいぶん違うんだなあ。
対策その1としては、C-w する前に C-x C-x C-x C-x と C-x を4発打つ、
というのを発見しました。これは現実的ではありませんね。だけどこれが有効、
というところからして emacs ユーザには不思議。
対策その2。おそらく xemacs 的な正しいやり方ではないと思うのですが、
(defun goddamn-xemacs-line-move (arg)
(let (cmd)
(cond ((< arg 0) (setq cmd 'previous-line
arg (- arg)))
(t (setq cmd 'next-line)))
(while (> arg 0)
(call-interactively cmd)
(setq arg (1- arg)))))
を書き足して、smooth-scroll-up 中に1個所ある
(line-move arg) を
(goddamn-xemacs-line-move arg)
に書き換えてください。
対策その3。transient-mark-mode (と云わないのかもしれないが)を解除する、
というのもあるのかしら? でも、ソースディレクトリで src/xemacs を動か
しただけなので何だかやり方が判りません。そもそも transient という単語
すらapropos に掛からない。ソースディレクトリもやけに小さいようだったの
で、展開すべきものを全部開いてなかったのかもしれません。
> > emacs では transient-mark-mode などを設定していない限り指定した範囲は
> > 特別表示されません。この点は今は問題にしなくていいでしょう。
> > また、たとえ、transient-mark-mode を使ったとしても手元では
> > smooth-scroll-up/down は意図した通りに動きます。
> >
> > smooth-scroll-up/down は要するに手で
> >
> > scroll-up()
> > line-move() (next-line の要部)
> >
> > を呼ぶのと同じ処理、および
> >
> > (setq this-command 'next-line)
> >
> > を実行しているだけのものです。このような処理で mark-ring が壊れるとは
> > 思えないんですが xemacs では何か起きるのでしょうかねえ。
mark の扱いに関してはずいぶん違うようですね。本当に interactively に
next-line を呼ぶしか方法がないんでしょうか? だとしたらプログラマとしては
なんか非常に面倒に感じてしまうな(たぶん、もっと xemacs 的な正しい方法が
あるんでしょうね)。ひょっとして、
(setq this-command 'next-line)
では不十分、というそっちの問題だったのかしら…?。
2個の mule と emacs-20, 21 を入れてあって、これ以上 emacs を増やした
くないのと、もはや私には今更xemacs に手を出すメリットが無さそうなので
(21 もある事だし)、xemacs の話題に口を狭むのは以後遠慮する事といたしま
す。この位のちょっとことでもずいぶん違うので、自分の書くものについても
全て xemacs では動きません、というニュアンスで話すことにします。
--
難波清一@東京西東京市 (http://www.asahi-net.or.jp/~pi9s-nnb/)
NAMBA Seiichi <sn@asahi-net.email.ne.jp>
Re: スクロールの挙動
Author: Seiichi Namba
Date: Wed, 06 Jun 2001 14:50
Date: Wed, 06 Jun 2001 14:50
33 lines
2460 bytes
2460 bytes
難波です。 Seiichi Namba <sn@asahi-net.email.ne.jp> さん writes: > 対策その2。おそらく xemacs 的な正しいやり方ではないと思うのですが、 > mark の扱いに関してはずいぶん違うようですね。本当に interactively に > next-line を呼ぶしか方法がないんでしょうか? だとしたらプログラマとしては > なんか非常に面倒に感じてしまうな(たぶん、もっと xemacs 的な正しい方法が > あるんでしょうね)。ひょっとして、 xemacs-21.1.10 の simple.el の next-line() を読み、 (interactive "_p") などと書いてあるのに気がつきました。もしかしてこれ…? xemacs-21.1.10-info.tar.gz 読んでみよう…。あ、これかな。 ううむ。カーソル移動系は全部こう書くの? …という訳で、smooth-scroll-up の先頭を (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") : こう直せば良いようです。 c-quick の方も (interactive) が書いてある移動系のコマンドは全部 "_p" とか "_P" に すれば良いのかもしれません。
Re: スクロールの挙動
Author: Seiichi Namba
Date: Wed, 06 Jun 2001 15:00
Date: Wed, 06 Jun 2001 15:00
21 lines
2200 bytes
2200 bytes
難波です。
Seiichi Namba <sn@asahi-net.email.ne.jp> さん writes:
> xemacs-21.1.10-info.tar.gz 読んでみよう…。あ、これかな。
> ううむ。カーソル移動系は全部こう書くの?
xemacs は xemacs-20.4 か、その少し前に使ってたことがあって、
smooth-scroll-up/down はその頃は basic.el のままで動いてたように
記憶するんですが、こうなったのは最近なんでしょうか。
有沢さんのお書きになっている zmacs-region-stays については、
件の info の Using `interactive' の個所に
If the first character in the string is `_', then this command will
not cause the region to be deactivated when it completes; that is,
`zmacs-region-stays' will be set to `t' when the command exits
successfully.
と書いてありました。(interactive "_p") というのは 有沢さんの defadvice とほぼ
同じ効果と考えてよいのでしょうかね。
Re: スクロールの挙動
Author: IMAI Hidetoshi
Date: Wed, 06 Jun 2001 18:19
Date: Wed, 06 Jun 2001 18:19
96 lines
5519 bytes
5519 bytes
今井です
難波さん、有沢さん、小野さん ありがとうございます。
有沢さんのやり方、難波さんのやり方のどちらでも、
smooth-scroll-up/down でマークしてからリージョンを
囲えることを確認しました。
修正したファイルは以下の様なものです。
------------------------------------------------------------
(defun current-line-in-window ()
"Returns line count of current line in current window. No arg."
(save-excursion
;; goto bol not to count \n at eol of this line...
(beginning-of-line)
(count-lines (point)
(save-excursion (move-to-window-line 0)
(point)))))
(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)))
(parity (% height 2))
(top-edge (/ (1- height) 4))
(btm-edge (+ (1+ parity) (* top-edge 3)))
(c-line (current-line-in-window))
(bob-not-shown;; var. to duck ding.
(not (pos-visible-in-window-p (point-min)))))
(if
;; Case cursor is within central area:
(or (and (> arg 0)
(<= c-line btm-edge)
(< (- btm-edge c-line) arg))
(and (< arg 0)
(>= c-line top-edge)
;;(< (- c-line top-edge) (- arg)) ;; old code for next line.
(> (- top-edge c-line) arg)
bob-not-shown))
(scroll-up arg)
;; else if cursor is in peripheral area:
;; re-calibrating cursor to central area.
(progn
(if (and (> arg 0)
(> c-line btm-edge))
(scroll-up (+ arg (- c-line btm-edge))))
(if (and (< arg 0)
(< c-line top-edge)
bob-not-shown)
(scroll-up (+ arg (- c-line top-edge))))))
(line-move arg)
(setq this-command 'next-line)))
(defun smooth-scroll-down (arg)
"Moves cursor up 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 up arrow key."
(interactive "_p")
(smooth-scroll-up (- arg))
(setq this-command 'previous-line))
;カーソルの移動方法を変更する
(global-set-key "\C-p" 'smooth-scroll-down)
(global-set-key [up] 'smooth-scroll-down)
(global-set-key "\C-n" 'smooth-scroll-up)
(global-set-key [down] 'smooth-scroll-up)
------------------------------------------------------------
以前にカーソルをwindowの端まで移動できるようにするには
------------------------------------------------------------
(top-edge (/ (1- height) 4))
(btm-edge (+ (1+ parity) (* top-edge 3)))
------------------------------------------------------------
を
------------------------------------------------------------
(top-edge 0)
(btm-edge (- height 2))
------------------------------------------------------------
にすれば良いと教えていただいたのですが
こちらがまだうまく行きません。
ここで、top-edgeでカーソルの上限を、btm-edgeでカーソルの下限を
きめているだけだと思うのです。
ですから、下のように書き直すことで
カーソルの上限を一番上に、カーソルの下限をしたから2行目に
変更できると思ったのですが、実際にsmooth-scroll-up/down
を実行するとすぐにカーソルが、windowの中央に飛んでしまいます。
(つまり、xemacsの C-p C-n のデフォルトの動作をしてしまう。)
一応 (top-edge 1) とすることで上に移動するときは、上から2行目
まではカーソルが移動できるようになったのですが、下に移動すると
きはどのようにしても、カーソルが中央に飛んでしまいます。
もし、カーソルが window の一番上、一番下まで移動できる方法があ
れば教えてください。お願いします。
Re: スクロールの挙動
Author: IMAI Hidetoshi
Date: Fri, 08 Jun 2001 04:32
Date: Fri, 08 Jun 2001 04:32
101 lines
6064 bytes
6064 bytes
今井です。 難波さんのニュースサーバーの調子が悪いらしく直接メールを いただきました。 環境: xemacs-21.1.14 On 07 Jun 2001 12:18:55 +0900, Seiichi Namba <sn@asahi-net.email.ne.jp> wrote: > 難波です。 > > 基本的には、こう > > (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 (window-height)) ;; ここも変えた。 > (parity (% height 2)) > (top-edge 0) > (btm-edge (- height 2)) ;; 本当は minibuffer があるかどうかも調べる。 > (c-line (current-line-in-window)) > (bob-not-shown ;; var. to duck ding. > (not (pos-visible-in-window-p (point-min))))) > : > > することで手元の emacs-21.0.103 では期待した通りになります。 ためしてみましたが、スクロールさせるとかなりの確率で windowの中央までジャンプしてしまいます。 > > ただし、emacs-21 では、frame-parameters の line-spacing (xemacs ではこ > のプロパティの名前は違うかもしれません)が nil (or 0) になっている時し > かうまくいきません。 > > つまり、この修正を書いた記事に述べたと思いますが、emacs-21 では > (window-height) の返り値が > (line-spacing . 3) のように frame-parameters を変更している時には実態と異なる > 値になっているので、この分の修正を行なう必要があるようです。 > > emacs-21 も xemacs も文字の描画については似たような(実際のコーディン > グは違うとしても)方式となっていると思うので、行間を変えている場合は同 > じ問題が起きるかもしれません。 > > (原因がこれだとして) > 対処方法としては let() で作っている height という変数の値を実際に > ウィンドウが表示している行数に合わせることが考えられます。 > > (前の記事にもこういうのを書いたような記憶あるんですが)、 > > (defun goddamn-emacs-get-window-height () > (count-lines > (save-excursion (move-to-window-line 0) (point)) > (save-excursion (move-to-window-line -1) (point)))) > > というのを作り(これは凄く効率悪そう。xemacs や emacs-21 にはこういう > 事をする関数がちゃんとあるかもしれません。)、 > > (let* (;;(height (window-height)) > (height (goddamn-emacs-get-window-height)) > (parity (% height 2)) > (top-edge 0) > (btm-edge height) ;; もはや minibuffer などの行数引く必要なし。 > (c-line (current-line-in-window)) > (bob-not-shown ;; var. to duck ding. > (not (pos-visible-in-window-p (point-min))))) > : 勉強不足で意味が理解できない点が多いですが、 実際にためしてみました。 しかし、やはり上記の場合と同じ結果になりました。 動きを目で見る限り、一番上もしくは下の行が半行しか表示されて いないときにカーソルが中央までジャンプするみたいです。 もしかしたら、簡単な解決方法は、windowの大きさ、もしくは文字の 大きさ行間を pixel単位で変更して半行表示されないようにすればい いのかもしれません。 > > edebug の使い方を覚えて、変数の値を確認(C-x C-e など)しつつ、1ステッ > プづつ実行してみると、関数やコマンドの動きがよく判ります。この件 > の場合はたぶん問題点がどこにあるのかすぐにつきとめることができると > 思います。 > > (defun smooth-scroll-up (arg) > > が表示されている次の行あたりに移動して、M-x edebug-defun RET し、 > 他のフレームで smooth-scroll-up を実行させるといいでしょう。 > smooth-scroll-up が表示されているバッファで SPC を押していけば > 実行が進みます。edebug は info で少し調べてからの方がいいかな。 > > なお、この記事は xemacs 使わずに書いてます(昨夜もう xemacs のソースは > 消してしまったので)ので、実態と違うこと書いてたらご容赦。 edebugについて調べてみましたが、これは mule の関数の様でした。 おそらく、xemacs は debug を使うみたいです。 土、日、月は用事があるので、アドバイスどうり火曜日に調べてみよ うと思います。
Re: スクロールの挙動
Author: IMAI Hidetoshi
Date: Fri, 08 Jun 2001 07:45
Date: Fri, 08 Jun 2001 07:45
231 lines
11013 bytes
11013 bytes
今井です。 もう一通メールをいただきましたので ニュースに流します。 On Fri, 08 Jun 2001 15:36:00 +0900, Seiichi Namba <sn@asahi-net.email.ne.jp> wrote: > -------- > 難波です。 > > In message <20010608132708A.hidepin@infonets.hiroshima-u.ac.jp>, > IMAI Hidetoshi writes: > > 今井です。 > > いろいろ考えて下さってありがとうございます。 > > この内容のニュースはまだ、私のところに届いていませんでした。 > > この返信と同じものをニュースにも流しておきます。 > > ニュースの方はまだ到着していないようなので直接返信しておきます。 > この内容もニュースに流しておきます。 他にも悩んでいる人がいれば僕みたいに大変役に立つと思います。 > > ためしてみましたが、スクロールさせるとかなりの確率で > > windowの中央までジャンプしてしまいます。 > > 「かなりの確率で」というと、うまくいくことの方が多い、ということですか。 ごくたまにうまく行くだけで、ほとんどの場合はwindowの中央にカー ソルが移動します。 > > その後調べてみたところ、 > > (move-to-window-line -1) > > などと呼ぶと、この関数は実際にそのウィンドウが表示している正味の行数 > (emacs-21 の場合は画面端で半行表示されている行数は含まない)を返している > ことに気が付きました。そこで、次のようにしたらどうですか > (goddamn-emacs-get-window-height を使うのと同趣ですが少し簡単にしただけ)。 > > (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") ;; xemacs では (interactive "_p") とする。 > (let* ((height (save-excursion (move-to-window-line -1))) > (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))))) > (if > ;; Case cursor is within central area: > (or (and (> arg 0) > (<= c-line btm-edge) > (< (- btm-edge c-line) arg)) > (and (< arg 0) > (>= c-line top-edge) > ;;(< (- c-line top-edge) (- arg)) ;; old code for next line. > (> (- top-edge c-line) arg) > bob-not-shown)) > (scroll-up arg) > ;; else if cursor is in peripheral area: > ;; re-calibrating cursor to central area. > (progn > (if (and (> arg 0) > (> c-line btm-edge)) > (scroll-up (+ arg (- c-line btm-edge)))) > (if (and (< arg 0) > (< c-line top-edge) > bob-not-shown) > (scroll-up (+ arg (- c-line top-edge)))))) > (line-move arg) > (setq this-command 'next-line))) > > これだと、emacs-21 の場合は、行間の設定によっては画面下に1行余して > スクロールする時がありますが、半画面スクロールは起きません。 > > なお、あらかじめ (move-to-window-line -1) を評価して、ウィンドウの表示 > 行数の数字としてそれらしい値が返っているかどうかは確認してください。 > xemacs でも同じかどうかよく判らないので(もしそうでなければ、 > 先のメール、本メールで書いている方法は使えません)。 > (move-to-window-line -1) これは xemacs でも使えました。 > で、「確率」の話ですが、 > このやり方では、 (btm-edge (- height 1)) のように、もっと余裕を > 持たせておく位しか対処の方法がありません。つまり、 > > > 動きを目で見る限り、一番上もしくは下の行が半行しか表示されて > > いないときにカーソルが中央までジャンプするみたいです。 > > もしかしたら、簡単な解決方法は、windowの大きさ、もしくは文字の > > 大きさ行間を pixel単位で変更して半行表示されないようにすればい > > いのかもしれません。 > > 今のアルゴリズムでは(たとえば)端が半行表示かどうかを見ていないので。 > ここまで計算に入れるのであれば、pixel 単位で事を運ぶしか方法がないでしょ > う。また、お話の様子ではemacs-21 と xemacs では、C-n (デフォルトの > next-line)で画面端の半行表示に入った時の挙動が違うような感じがしますね。 > emacs-21 では半行だけスクロールアップしてその行が全部表示され、そこで > もう1度 C-n した時初めて半画面スクロールが起きます。 > > 今の smooth-scroll-up の枠組みを利用するのであれば、また「かなりの確率で」 > 起きる、というか、たまにしか起きない半画面スクロールを防止するのであれば、 > > (btm-edge (- height 1)) > > のように小さめにとっておくしか無いでしょう。半画面スクロールで眼が追い > つかなくなる、という事は少なくともなくなるので、この位で我慢しておいた > らどうですか。 いろいろためした結果 ------------------------------------------------------------ (top-edge 0) (btm-edge height) ------------------------------------------------------------ では、かなりの確率で(下にスクロールする場合はほとんど) windowの中央にカーソルが飛んでしまいます。 ------------------------------------------------------------ (top-edge 1) (btm-edge (- height 2)) ------------------------------------------------------------ 私の環境では、今のところ上のように変更することで 中央に飛ばずにスクロールしてくれます。 # いろいろためして見たのですが newline を行ったときも # カーソルが中央に飛んでしまいます。 # 少し気持ち悪いですが、なにかを書き加えるときはこの方が # 便利かも知れません。 > > あるいはカーソルが画面の端まで行きませんが、私の smooth-scroll-up をそ > のままお使いいただくのでも、半画面スクロールは絶対に起きないはずです > (行間を極端に大きくしない限り)。 > 実は、この smooth-scroll-up/down でも結構快適に使えています。 しかし、今回の変更で希望にかなり近づいたので 変更後の smooth-scroll-up/down を使用しようと思います。 > もっと手を抜くのであれば、(scroll-step 1) だけで、たまに起きてしまう > 半画面スクロールは我慢する、というのでもいいかもしれない。 > 実際使ってみるとたまに違う動きをされると かなり気になると思います。 > もし、これでは我慢がならん、ということであれば、pixel 単位の計算をし、 > ということはフォントの高さなども計算し、さらに半行表示を検出し、それを > 補正し、pixel 単位で scroll させるコマンドを書くしかありませんが、そこ > まで血道をあげる価値があるかどうか、という気がします。 > > ただし、scroll-step を 1 にしても(あるいは scroll-conservatively を t > にしても)半画面スクロールが(たまに)起きるというのは *明らかにバグ* だと > 思うので、xemacs/emacs の開発チームと闘争して直させる、というのはもち > ろん解決方法としては正道だと思います。 > 正道はどのような手順を踏めばいいものでしょうか? この話ですと、解決方法を持っていかないと相手にされないような 気がします。 xemacs/emacs の開発チームに報告という形でれんらくをとることはできないものなのでしょうか? (できれば、日本語で。) > また、半画面スクロールも慣れればそうおかしなものでもありませんよ。 > (考え方を変えて)画面の真中を見てればいいのですから。 > > > edebugについて調べてみましたが、これは mule の関数の様でした。 > > おそらく、xemacs は debug を使うみたいです。 > > あれ? xemacs のソースには edebug も付いてきているようでしたが、標準で > は推奨されていないんでしょうかね。 > FreeBSD 4.3 の ports でとってきた xemacs-21.1.14.tar.gz を調べましたが edebug はないようでした。 grep で検索すると 幾らか引っ掛かりましたが プログラムではないようでした。 > PS1. > (move-to-window-line -1) はバッファの終りがウィンドウの表示範囲内にある時は > ウィンドウの行数単位の高さとは違う値を出してきます。この補正をやるべきですが > 上の改造版 smooth-scroll-up ではそれがありません。この部分はおまかせします。 > たとえば症状としては、バッファの終りで呼ぶと、scroll-up が起きてしまう、という > のがこの問題に該当するものと思われます。 確かに そのような動作を確認しました。 ただscroll-upより移動する行数が多いようです。 (3行くらいです。) > > PS2. > 本件に少し関連すると思いますが、C-x 3 M-x follow-mode RET というのは xemacs > でも使えますか。C-p,C-n,C-v,M-v などの際のバッファの見せ方を調節する > ものですが、もしかしたらご不便のうちのある部分は解消できるのかもしれません。 > > ともあれ、ご健闘を祈ります。 C-x 3 で window を縦に二つに分割できました。 ただ、follow-mode はないようでした。 この、モードをよぶためになにか .emacs に記述する必要は ありますか? 今回の変更で、かなり満足できるものになりました。 普段の使用には、問題ないように思えます。 ありがとうございました。 幾らか残った問題を解決する方法があれば またよろしくお願いします。
Re: スクロールの挙動
Author: Seiichi Namba
Date: Fri, 08 Jun 2001 16:03
Date: Fri, 08 Jun 2001 16:03
141 lines
7896 bytes
7896 bytes
The following message is a courtesy copy of an article
that has been posted to fj.editor.xemacs as well.
難波です。今朝書いた別スレッドの記事は出ていっているようなので
ニュースに書いてみます。念のため Cc: 付き。
IMAI Hidetoshi <hidepin@infonets.hiroshima-u.ac.jp> さん writes:
> ごくたまにうまく行くだけで、ほとんどの場合はwindowの中央にカー
> ソルが移動します。
コードの効率としてはこの方
> > (let* ((height (save-excursion (move-to-window-line -1)))
が goddamn-emacs-get-window-height よりもよさそうですよね。
> いろいろためした結果
> ------------------------------------------------------------
> (top-edge 0)
> (btm-edge height)
> ------------------------------------------------------------
> では、かなりの確率で(下にスクロールする場合はほとんど)
> windowの中央にカーソルが飛んでしまいます。
>
> ------------------------------------------------------------
> (top-edge 1)
> (btm-edge (- height 2))
> ------------------------------------------------------------
なんか行の数え方が emacs と xemacs では違うような感じになってますね。
ひょっとして、xemacs では ウィンドウの一番上の行に行くのは
(move-to-window-line 1) なのかしら? それとも半行表示の扱いが違う、
とか、そっちの問題かしら?
> # いろいろためして見たのですが newline を行ったときも
> # カーソルが中央に飛んでしまいます。
> # 少し気持ち悪いですが、なにかを書き加えるときはこの方が
> # 便利かも知れません。
これについては、basic.el に my-newline というのが入ってます。
smooth-scroll-up/down の姉妹品のような、似たような考えです。カーソルが
あまり下の方にある場合は数行のスクロールが起きますが、普通にウィンドウ
の中程から書き足していく時は1行づつスクロールするはずです。短いからこ
こに貼っておきます。Freemacs なんて懐かしい。
;;;
;;; my-newline, inspired from Freemacs.
;;; You don't need to fix skk.el.
;;; Thu Jun 18 17:25:58 1992
;;;
(defun my-newline (arg)
"Moves cursor down keeping cursor within 2/3 area from the top of the current window.
Scroll the window in need."
(interactive "p")
(if (> arg 0)
(progn
(newline arg)
(forward-line (- arg))
(smooth-scroll-up arg))))
smooth-scroll-up 呼んでますが、改造版の smooth-scroll-up との相性は調
べていません。が、使えそうな気はします。かなり画面の下にあっても1行ス
クロールになるんじゃないかしら?
私はこれは C-m にバインドしています。(interactive "_p") は同様に直して
下さい。
> > もし、これでは我慢がならん、ということであれば、pixel 単位の計算をし、
> > ということはフォントの高さなども計算し、さらに半行表示を検出し、それを
> > 補正し、pixel 単位で scroll させるコマンドを書くしかありませんが、そこ
> > まで血道をあげる価値があるかどうか、という気がします。
> >
> > ただし、scroll-step を 1 にしても(あるいは scroll-conservatively を t
> > にしても)半画面スクロールが(たまに)起きるというのは *明らかにバグ* だと
> > 思うので、xemacs/emacs の開発チームと闘争して直させる、というのはもち
> > ろん解決方法としては正道だと思います。
> >
> 正道はどのような手順を踏めばいいものでしょうか?
> この話ですと、解決方法を持っていかないと相手にされないような
> 気がします。
いや、正道、というのはそういう意味ではなくて。要するに、本件のように
info に書いてある動作ができる確率がそんなに高くない、というのはバグで
しょうなあ、という程度の意味でしかありません。
バグレポートの「正道」というのも特にないでしょう。丁重、常識的、かつ的
確に起きていることを相手に伝えられるのであれば直してもらえるのではない
でしょうか。
上の「闘争」というのもあまり言葉がよくありませんが、コンピュータの振舞
いを文章で説明して相手に判らせるのはそう簡単ではない(たとえば、xemacs
+ smooth-scroll-up/down の組合せの問題が私に伝わるまで、というのはそう
簡単にはいってませんよね?)ので、その点、大変かもしれませんけどね…、と
いう程度の意味に読んでください。
> xemacs/emacs の開発チームに報告という形でれんらくをとることはできないものなのでしょうか?
> (できれば、日本語で。)
要するに、ご自分でパッチを書けない、とか、英語が下手だとかの懸念と、こ
のバグを直して欲しい、という熱意のどっちが勝つか、という問題ではないで
すかね。
> FreeBSD 4.3 の ports でとってきた xemacs-21.1.14.tar.gz
> を調べましたが edebug はないようでした。
> grep で検索すると 幾らか引っ掛かりましたが
> プログラムではないようでした。
そうですか。21.1.10 には何か入ってたような気がしたんですが、
私の見間違いかな…。
> > PS1.
> > (move-to-window-line -1) はバッファの終りがウィンドウの表示範囲内にある時は
> > ウィンドウの行数単位の高さとは違う値を出してきます。この補正をやるべきですが
> > 上の改造版 smooth-scroll-up ではそれがありません。この部分はおまかせします。
> > たとえば症状としては、バッファの終りで呼ぶと、scroll-up が起きてしまう、という
> > のがこの問題に該当するものと思われます。
>
> 確かに そのような動作を確認しました。
> ただscroll-upより移動する行数が多いようです。
> (3行くらいです。)
うちの emacs-21 では1行づつだったと思いますが、top-edge と btm-edge
を補正されているのでその関係でしょうかね。
> > PS2.
> > 本件に少し関連すると思いますが、C-x 3 M-x follow-mode RET というのは xemacs
> > でも使えますか。C-p,C-n,C-v,M-v などの際のバッファの見せ方を調節する
> > ものですが、もしかしたらご不便のうちのある部分は解消できるのかもしれません。
> >
> > ともあれ、ご健闘を祈ります。
>
> C-x 3 で window を縦に二つに分割できました。
> ただ、follow-mode はないようでした。
> この、モードをよぶためになにか .emacs に記述する必要は
> ありますか?
follow-mode は emacs-19.34 あたりから存在するようです。19.34, 20.7, 21.0.103
では特に .emacs の設定は必要ないですね。
Re: スクロールの挙動
Author: IMAI Hidetoshi
Date: Mon, 11 Jun 2001 18:52
Date: Mon, 11 Jun 2001 18:52
130 lines
7393 bytes
7393 bytes
今井です。 At 09 Jun 2001 01:03:09 +0900, Seiichi Namba wrote: > > The following message is a courtesy copy of an article > that has been posted to fj.editor.xemacs as well. > > 難波です。今朝書いた別スレッドの記事は出ていっているようなので > ニュースに書いてみます。念のため Cc: 付き。 > > > いろいろためした結果 > > ------------------------------------------------------------ > > (top-edge 0) > > (btm-edge height) > > ------------------------------------------------------------ > > では、かなりの確率で(下にスクロールする場合はほとんど) > > windowの中央にカーソルが飛んでしまいます。 > > > > ------------------------------------------------------------ > > (top-edge 1) > > (btm-edge (- height 2)) > > ------------------------------------------------------------ > > なんか行の数え方が emacs と xemacs では違うような感じになってますね。 > ひょっとして、xemacs では ウィンドウの一番上の行に行くのは > (move-to-window-line 1) なのかしら? それとも半行表示の扱いが違う、 > とか、そっちの問題かしら? > ためしてみましたが、(move-to-window-line 0)で、1番上の行に移動しま した。(move-to-window-line 1)だと、上から2番目の行に移動します。 > > # いろいろためして見たのですが newline を行ったときも > > # カーソルが中央に飛んでしまいます。 > > # 少し気持ち悪いですが、なにかを書き加えるときはこの方が > > # 便利かも知れません。 > > これについては、basic.el に my-newline というのが入ってます。 > smooth-scroll-up/down の姉妹品のような、似たような考えです。カーソルが > あまり下の方にある場合は数行のスクロールが起きますが、普通にウィンドウ > の中程から書き足していく時は1行づつスクロールするはずです。短いからこ > こに貼っておきます。Freemacs なんて懐かしい。 > > ;;; > ;;; my-newline, inspired from Freemacs. > ;;; You don't need to fix skk.el. > ;;; Thu Jun 18 17:25:58 1992 > ;;; > > (defun my-newline (arg) > "Moves cursor down keeping cursor within 2/3 area from the top of the current window. > Scroll the window in need." > (interactive "p") > (if (> arg 0) > (progn > (newline arg) > (forward-line (- arg)) > (smooth-scroll-up arg)))) > > smooth-scroll-up 呼んでますが、改造版の smooth-scroll-up との相性は調 > べていません。が、使えそうな気はします。かなり画面の下にあっても1行ス > クロールになるんじゃないかしら? > > 私はこれは C-m にバインドしています。(interactive "_p") は同様に直して > 下さい。 > 設定して使用したのですが、bufferの最終行で my-newline を 実行すると、カーソルの位置が実行する度に一段ずつ上がっていきま す。(Windowの中でのカーソルの位置のことで、bufferの行数は増え ています)ずっと繰り返していくと最後には1行目と2行目のどちらか を行ったりきたりします。(top-edge 1のため起きていると思います。 ) > いや、正道、というのはそういう意味ではなくて。要するに、本件のように > info に書いてある動作ができる確率がそんなに高くない、というのはバグで > しょうなあ、という程度の意味でしかありません。 > > バグレポートの「正道」というのも特にないでしょう。丁重、常識的、かつ的 > 確に起きていることを相手に伝えられるのであれば直してもらえるのではない > でしょうか。 > > 上の「闘争」というのもあまり言葉がよくありませんが、コンピュータの振舞 > いを文章で説明して相手に判らせるのはそう簡単ではない(たとえば、xemacs > + smooth-scroll-up/down の組合せの問題が私に伝わるまで、というのはそう > 簡単にはいってませんよね?)ので、その点、大変かもしれませんけどね…、と > いう程度の意味に読んでください。 > > > xemacs/emacs の開発チームに報告という形でれんらくをとることはできないものなのでしょうか? > > (できれば、日本語で。) > > 要するに、ご自分でパッチを書けない、とか、英語が下手だとかの懸念と、こ > のバグを直して欲しい、という熱意のどっちが勝つか、という問題ではないで > すかね。 > 難波さんのおかげで今のところ、ほぼ満足いく動作を得ることが できています。 しかし、できればxemacs本体でこのバグを直してほしいとも思ってい ます。(他のアプリケーションで問題が発生するかも知れないから) 今は、チョット忙しくてできそうもないですが、時間をつくって 英語でメールを書いてみようと思います。そのときには相談すると 思います。よろしくお願いします。 > > > PS2. > > > 本件に少し関連すると思いますが、C-x 3 M-x follow-mode RET というのは xemacs > > > でも使えますか。C-p,C-n,C-v,M-v などの際のバッファの見せ方を調節する > > > ものですが、もしかしたらご不便のうちのある部分は解消できるのかもしれません。 > > > > > > ともあれ、ご健闘を祈ります。 > > > > C-x 3 で window を縦に二つに分割できました。 > > ただ、follow-mode はないようでした。 > > この、モードをよぶためになにか .emacs に記述する必要は > > ありますか? > > follow-mode は emacs-19.34 あたりから存在するようです。19.34, 20.7, 21.0.103 > では特に .emacs の設定は必要ないですね。 mule をインストールしたら、follow.elがいっしょにインストールさ れたので、load-fileで読んでみました。 すると、一応follow-modeになったようです
Re: スクロールの挙動
Author: 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() を使うくらいなら、もう少し放っておこうか、
と思っています。もともとの目的が半画面ジャンプをなくそう、というものでは
ないので…。
Re: スクロールの挙動
Author: IMAI Hidetoshi
Date: Tue, 12 Jun 2001 15:59
Date: Tue, 12 Jun 2001 15:59
186 lines
10065 bytes
10065 bytes
今井です。 At 12 Jun 2001 20:17:18 +0900, Seiichi Namba wrote: > > The following message is a courtesy copy of an article > that has been posted to fj.editor.xemacs as well. > > 難波です。 > > > 設定して使用したのですが、bufferの最終行で my-newline を > > 実行すると、カーソルの位置が実行する度に一段ずつ上がっていきま > > す。(Windowの中でのカーソルの位置のことで、bufferの行数は増え > > ています)ずっと繰り返していくと最後には1行目と2行目のどちらか > > を行ったりきたりします。(top-edge 1のため起きていると思います。 > > ) > > 過激に表示範囲がジャンプする、というのが抑制できているのであれば、 > それ以上はあきらめていただくしかないのかもしれません。 > あまりにもこれは使いにくいので、今はmy-newlineの使用を やめています。 > > しかし、できればxemacs本体でこのバグを直してほしいとも思ってい > > ます。(他のアプリケーションで問題が発生するかも知れないから) > > emacs-19/20/21 でも同じ問題があり、明らかにバグのように思えますね。 > > > 今は、チョット忙しくてできそうもないですが、時間をつくって > > 英語でメールを書いてみようと思います。そのときには相談すると > > 思います。よろしくお願いします。 > > 私など頼りにしなくても、誠意ある交渉であれば必ず相手に伝わるはずです。 > elisp の事をどれだけ知っているか、とか、英語が上手か下手か、などとは一 > 切関係がないと思いますよ。交渉の過程など知らせていただければ嬉しいですが。 > 実は、難波さんが以前おっしゃった、xemacsの場合は (interactive "p") → (interactive "_p") にしないと、リージョンがうまく指定できないという 問題解決方法のことを思い出して、c-quick の中身を書き換えて使用 してみました。 すると、画面のスクロールはスムーズで、(一番最後の行までカーソ ルはちゃんと移動する)今の所、中央に飛ぶことはないです。 これにも、気になる問題点があります。 ●"newline"がないため、bufferの最終行で改行すると、画面の中央にカーソルが飛んでしまう。 ●bufferの最終行で C-n (c-quick-move-down)を実行すると、カーソ ルのWindowでの位置が一段ずつ上がっていき最終的には一番上にきて しまう。 この二つの問題点があるのですが、これが今のところ快適に 使えることがわかりましたのでこれでしばらく過ごしてみようと 思います。 私は、c-quickのソースが結構長く、使用しない関数が多いような気 がするのでできるだけ削ろうとおもいます。 理由は、 ●メモリを無駄な関数の分も使用してしまってもったいない ●起動時間が多くかかってしまう。 と思っているからです。 実際は、これらの問題は考える必要はあるのでしょうか アドバイスお願いします。 > > > その後、 > 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 を見ても、これら各変数の意味や相互関係は非常に理解しがたい > です(こんなに沢山変数がある必要があるのか? 行きあたりばったりに増設さ > れてきたような感じがする。うまく動いてなくても不思議じゃない、かもしれ > ませんね)。 > 自分でこれらの関数について調べてみました。 "scroll-margin"についてですが、これは、windowの上端、下端から 何行離れていたら画面をスクロールするか設定する関数だと思います。 これは、難波さん作成された関数の"top-edge"、"btm-edge"にあたる ものだと私は解釈しています。これと、"scroll-step"を組み合わせ れば "smooth-scroll-up/down"と同じ動作ができると思ったのですが "C-h a scroll-margin" を実行したところ xemacsにはこの関数が ないようでした。"scroll-down-aggressively" "scroll-up-aggressively"も同様にありませんでした。 "scroll-conservatively"に関しては、いくら引数を変えてもスクロー ルの動作が変化しませんでした 。 > また 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() を使うくらいなら、もう少し放っておこうか、 > と思っています。もともとの目的が半画面ジャンプをなくそう、というものでは > ないので…。 ありがとうございます。これも使用してみましたが ------------------------------------------------------------ (top-edge 0) (btm-edge height) ------------------------------------------------------------ を ------------------------------------------------------------ (top-edge 1) (btm-edge (- height 2) ------------------------------------------------------------ のようにしないとほとんどの場合、カーソルが画面の中央に飛んでし まいます。 もう一つ気になった点は、スクロールの動作が遅いという点です。 なぜかはわからないのですが、スクロールの途中でたびたび止ります。 止っている時間は1秒にも満たないと思いますが、結構気になりまし た。
Re: スクロールの挙動
Author: Seiichi Namba
Date: Tue, 12 Jun 2001 19:28
Date: Tue, 12 Jun 2001 19:28
152 lines
8572 bytes
8572 bytes
難波です。 IMAI Hidetoshi <hidepin@infonets.hiroshima-u.ac.jp> さん writes: > これにも、気になる問題点があります。 > > ●"newline"がないため、bufferの最終行で改行すると、画面の中央にカーソルが飛んでしまう。 > ●bufferの最終行で C-n (c-quick-move-down)を実行すると、カーソ > ルのWindowでの位置が一段ずつ上がっていき最終的には一番上にきて > しまう。 ええと、my-newline でも何でも材料は沢山ある訳ですから、後は ご自分で研究して使いやすいものをお作りになるのがよろしいでしょう。 scroll-step の問題が長年にわたって放置されていることからみると、おそら く、ユーザの大半はデフォルトのままの挙動で満足しているか、ごくたまに scroll-step の設定が無視される程度のことは大して問題にしていないのだ と思います。 いわば、この問題は多くのユーザにとってはとるに足らないものであって、 本当にこの問題にこだわるのであれば、ご自分で研鑽を積んで満足のいくもの を書くしかないように思います。 本当にコンピュータを使って幸福に暮らそうと思うのであれば、結局は満足の 行くものを自分で書く以外に方法はありません。 > 私は、c-quickのソースが結構長く、使用しない関数が多いような気 > がするのでできるだけ削ろうとおもいます。 > 理由は、 > > ●メモリを無駄な関数の分も使用してしまってもったいない > > ●起動時間が多くかかってしまう。 > > と思っているからです。 > 実際は、これらの問題は考える必要はあるのでしょうか > アドバイスお願いします。 考え方しだいですね。私は今は dired-dd と MonK、自分用の FEP である lkk 以外はバイトコンパイルすらしていません。一方で、数100行程度の ~/.emacs すらバイトコンパイルしないと気が済まない、という人も居る訳で…。 参考までに私の考え方を少し書けば…。 たとえば、10年も使ってれば ~/elisp/ の下の *.el の総行数/ワード/文 字数は 22033 85251 770585 total この位になります。全部をロードしてはいないと思いますが。.emacs だけでも 2500 行くらいはあります。 それでも、昨年あたりから、~/elisp の下では、上記のもの以外はバイトコン パイルは止めました。コンピュータが充分速くなったのと、emacs の種類が多 くて面倒なこと、elisp ではバイトコンパイルしないと使いものにならない、 というものは全体の数%もないように思われること、などが理由です。使う emacs を1個か2個に絞れるようになったらまたバイトコンパイルしようかな、 とは思いますが。 起動時間は確かに emacs -q の時と違います。計ったことは無いですが30秒 から1分くらいです。それでも、どうせ emacs は朝1回立ち上げるだけだし、 トイレでも行ってれば良い訳で。 basic.el や c-quick.el (ただしこれは改行多いです)はそれ程短かいもので はありませんが、かといって巨大なものでもありません。バイトコンパイルす れば 30k くらいのものでしょう。 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND sn 32749 0.3 15.3 22272 19632 tty1 S Jun12 1:28 /usr/local/emacs-21.0/bin/emacs 全体が使うメモリの量からすると大したもんではないような気がする。emacs -q で起動したって 10M 位は喰う訳ですし、今のコンピュータなら大した事ないし、 今や X や netscape などに比べれば行儀良くて可愛いもんです。 「無駄な関数」といっても、M-x command-apropos RET して表示される 関数のうち、ご自分がお使いになっているコマンドはどの位ありますか。 もちろん、この表示には実際にロードされていないものも含まれますが。 …そんな訳で、私の場合は、c-quick に余計なものが入っている、というのは 大して気にするべき問題ではないように思っていますが、もちろん考え方しだ いな訳ですね。 また、私の場合、人様から戴いた物件は、余程の事が無い限り直接いじりませ ん。それは失礼だと思っているとかそういう問題では全くなくて、emacs の 場合は hook だの eval-after-load だのといったしくみがあるので殆どその 必要がないからです。いじってしまうと差分やパッチを作るのが面倒、という のもありますが。まして使わない関数/変数が入っている程度では改造しませ ん。同じように動く保証もないし。 > "scroll-up-aggressively"も同様にありませんでした。 aggressively の方は、emacs-21 特有かもしれません。で、まだどうもちゃんと 機能してないような気がする。 > "scroll-conservatively"に関しては、いくら引数を変えてもスクロー > ルの動作が変化しませんでした 。 お使いの xemacs では元々そういう変数がないのかもしれませんね。そういう 場合でも setq はできる訳で。 > ありがとうございます。これも使用してみましたが > ------------------------------------------------------------ > (top-edge 0) > (btm-edge height) > ------------------------------------------------------------ > を > ------------------------------------------------------------ > (top-edge 1) > (btm-edge (- height 2) > ------------------------------------------------------------ > のようにしないとほとんどの場合、カーソルが画面の中央に飛んでし > まいます。 どうもこの差が気になりますが、行間を空けているかどうかとかその あたりの問題も関係あるのかもしれません。 > もう一つ気になった点は、スクロールの動作が遅いという点です。 basic-get-real-window-height() が遅いんでしょうね。キー押しっぱなしの 時は、1行スクロールするごとに別のバッファを見にいってる訳ですから、速 く動く訳がない。window-height の値を変数にキャッシュしておくような方法 を考えれば多少は改善できるかもしれませんが(これは途中まで書いたが、ユー ザがウィンドウをリサイズする場合も考えると労力ほどの効果はないような気 もした)。 それでも… > なぜかはわからないのですが、スクロールの途中でたびたび止ります。 > 止っている時間は1秒にも満たないと思いますが、結構気になりまし > た。 emacs-21 で celeron 500A というのだったかな、そういう CPU ですが、うち ではあれでキー押しっぱなしにしても体感速度は大して変りません(もちろん バイトコンパイルなし)。あるいは、遅いのは xemacs 特有の問題かもしれま せんね(何か別の設定を行なう必要があるのかもしれない)。 バイトコンパイルすれば多少は改善されるかもしれませんが、本件のように細 かい問題に血道を上げるのであれば、ビルトインの関数が無い以上、ある程度 は仕方のない問題かもしれません。 C ソースや window.el などを研究して、C プリミティブの関数を書くなり、 pixel 単位の計算をする方法にすれば良くなるかもしれませんが、本件に関し ては私はそこまでする価値がないと思っているので、期待しないで下さい。 よく考えてみると、今井さんにとっては結局は、scroll-step に関するバグを 修正してもらうのが一番簡単ではないでしょうかね。筋としても一番通ってる ように思えます。 本件に関しては、そろそろ失礼しようと思います。 ご健闘を祈ります。
Re: スクロールの挙動
Author: IMAI Hidetoshi
Date: Tue, 12 Jun 2001 20:42
Date: Tue, 12 Jun 2001 20:42
71 lines
4715 bytes
4715 bytes
今井です。 At 13 Jun 2001 04:28:14 +0900, Seiichi Namba wrote: > > 難波です。 > > IMAI Hidetoshi <hidepin@infonets.hiroshima-u.ac.jp> さん writes: > > scroll-step の問題が長年にわたって放置されていることからみると、おそら > く、ユーザの大半はデフォルトのままの挙動で満足しているか、ごくたまに > scroll-step の設定が無視される程度のことは大して問題にしていないのだ > と思います。 > > いわば、この問題は多くのユーザにとってはとるに足らないものであって、 > 本当にこの問題にこだわるのであれば、ご自分で研鑽を積んで満足のいくもの > を書くしかないように思います。 > > 本当にコンピュータを使って幸福に暮らそうと思うのであれば、結局は満足の > 行くものを自分で書く以外に方法はありません。 私も、scroll-stepの問題がそのままになっているのは、 ほとんどの人がデフォルトの動作のまま使用しているから ではないかと考えていました。 "あとは、自分で何とかする"というのはその通りだとおもいます。 今回は、難波さんの優しさでいろいろ教えていただいていますので 自分で問題を解決しようと思います > > > 私は、c-quickのソースが結構長く、使用しない関数が多いような気 > > がするのでできるだけ削ろうとおもいます。 > > 理由は、 > > > > ●メモリを無駄な関数の分も使用してしまってもったいない > > > > ●起動時間が多くかかってしまう。 > > > > と思っているからです。 > > 実際は、これらの問題は考える必要はあるのでしょうか > > アドバイスお願いします。 略 > …そんな訳で、私の場合は、c-quick に余計なものが入っている、というのは > 大して気にするべき問題ではないように思っていますが、もちろん考え方しだ > いな訳ですね。 > > また、私の場合、人様から戴いた物件は、余程の事が無い限り直接いじりませ > ん。それは失礼だと思っているとかそういう問題では全くなくて、emacs の > 場合は hook だの eval-after-load だのといったしくみがあるので殆どその > 必要がないからです。いじってしまうと差分やパッチを作るのが面倒、という > のもありますが。まして使わない関数/変数が入っている程度では改造しませ > ん。同じように動く保証もないし。 納得致しました。その通りだと思います。 > よく考えてみると、今井さんにとっては結局は、scroll-step に関するバグを > 修正してもらうのが一番簡単ではないでしょうかね。筋としても一番通ってる > ように思えます。 > > 本件に関しては、そろそろ失礼しようと思います。 > ご健闘を祈ります。 長い間お付き合いいただいてありがとうございます。 教えていただいたことすべてを理解しているわけではないので しばらく時間を書けて調べて行きたいと思います
Re: スクロールの挙動
Author: Seiichi Namba
Date: Wed, 13 Jun 2001 04:04
Date: Wed, 13 Jun 2001 04:04
125 lines
6961 bytes
6961 bytes
The following message is a courtesy copy of an article
that has been posted to fj.editor.xemacs as well.
難波です。
もう失礼する、と書いたのですが、前の記事は言葉が足りないところがあるの
で最後に多少補足しておきます。
Seiichi Namba <sn@asahi-net.email.ne.jp> writes:
> 本当にコンピュータを使って幸福に暮らそうと思うのであれば、結局は満足の
> 行くものを自分で書く以外に方法はありません。
こだわるところ、というのは人によって大きく違うと思うので、人様から戴い
たり買ってきたりしたもので満足できないという事は往々にしてある訳で、そ
うした場合、最終的には問題の個所を解決する方策は自分自身で作るしかない、
と思っています。私の web ページに置いてあるものは殆どそのようにして出来
た産物です。
たとえば、大多数の方々は skk なら skk で満足されているのだろうが、私の
場合は幸福に暮らすためには自分で代替物を書くより他になかった訳。
> たとえば、10年も使ってれば ~/elisp/ の下の *.el の総行数/ワード/文
> 字数は
>
> 22033 85251 770585 total
>
> この位になります。全部をロードしてはいないと思いますが。.emacs だけでも
> 2500 行くらいはあります。
.emacs は実際には数個のファイルに分かれていて、新しい設定を書き足すた
めのファイルを勘定し忘れていました。数え直したら .emacs 相当の部分は
4000 行位ありました。
> basic.el や c-quick.el (ただしこれは改行多いです)はそれ程短かいもので
> はありませんが、かといって巨大なものでもありません。バイトコンパイルす
> れば 30k くらいのものでしょう。
basic.el は 12k くらいしかありませんね。c-quick と2つを混ぜて書いてしま
いました。
> USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
> sn 32749 0.3 15.3 22272 19632 tty1 S Jun12 1:28 /usr/local/emacs-21.0/bin/emacs
>
> 全体が使うメモリの量からすると大したもんではないような気がする。emacs -q
> で起動したって 10M 位は喰う訳ですし、今のコンピュータなら大した事ないし、
> 今や X や netscape などに比べれば行儀良くて可愛いもんです。
demacs と 386 のCPUを使っていた時は、skk と .emacs をダンプしたバイナリ
を作ったりしていた事もありますが、その頃に比べれば数 10kb くらいの elisp
ファイルなど屁でもない、という感じでしょうか。
> せんね(何か別の設定を行なう必要があるのかもしれない)。
たとえば、再表示などに関して xemacs 特有の設定があるのかもしれない、
という事を考えていました。
PS.
なお、ウィンドウ外へのカーソル移動の時1行だけスクロールさせるという目
的に関して smooth-scroll-up/down の基本的な枠組を(改造して)利用す
るのはあまり適していないのではないか、と思います。というのは
smooth-scroll-up/down は「行」を対象とした処理だからです。
「ウィンドウ外へのカーソル移動の時1行だけスクロールさせる」には、「そ
の移動でウィンドウ外へカーソル(point)が出るかどうか」を調べ、「出るな
らスクロールする」、というようなアルゴリズムを使えば良いですね。
今頃になって申しわけないですが、そういうシンプルな作りであれば、
(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)
()))
(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)
()))
(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 [return] 'sane-newline)
こんな感じでご希望には沿うような気がします(結局書いちゃった)。
c-quick 全体よりは短かいですから使えればいいかもしれませんね。
境界条件などは大してチェックしていないので、実地テスト(<, > などのテス
トで良いかどうか)はお任せします。(interactive "_p") は直してください。
また、関数に分けてあるところをマージすれば多少は最適化はできると思いま
す。そのへんもご希望があれば試してみてください。
c-quick.el は昔にダウンロードしただけで、あまり研究していないのですが、
たぶん、同じような考えを使っていると思います。
--
難波清一@東京西東京市 (http://www.asahi-net.or.jp/~pi9s-nnb/)
NAMBA Seiichi <sn@asahi-net.email.ne.jp>
Re: スクロールの挙動
Author: Seiichi Namba
Date: Wed, 13 Jun 2001 04:33
Date: Wed, 13 Jun 2001 04:33
38 lines
3018 bytes
3018 bytes
The following message is a courtesy copy of an article
that has been posted to fj.editor.xemacs as well.
難波です。
Seiichi Namba <sn@asahi-net.email.ne.jp> writes:
> (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)
> ()))
失礼。このままでは mini-buffer にファイル名などを入れる時に問題が
出るかもしれません。まだ原因をはっきり握めていませんが、
(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)
())
などとするんでしょうかね。" *Minibuf" というミニバッファの名前が
xemacs でも同じかどうかよく判りませんが。
newline というのはあまりいじ らない方がいいのかもしれません。
また、
(global-set-key "\C-m" 'sane-newline)
なども足しておいた方がいいかもしれません。
Re: スクロールの挙動
Author: IMAI Hidetoshi
Date: Wed, 13 Jun 2001 09:21
Date: Wed, 13 Jun 2001 09:21
91 lines
5534 bytes
5534 bytes
今井です。 At 13 Jun 2001 13:04:01 +0900, Seiichi Namba wrote: > > The following message is a courtesy copy of an article > that has been posted to fj.editor.xemacs as well. > > 難波です。 > > もう失礼する、と書いたのですが、前の記事は言葉が足りないところがあるの > で最後に多少補足しておきます。 > ありがとうございます。 参考になりました。 > > > PS. > なお、ウィンドウ外へのカーソル移動の時1行だけスクロールさせるという目 > 的に関して smooth-scroll-up/down の基本的な枠組を(改造して)利用す > るのはあまり適していないのではないか、と思います。というのは > smooth-scroll-up/down は「行」を対象とした処理だからです。 > > 「ウィンドウ外へのカーソル移動の時1行だけスクロールさせる」には、「そ > の移動でウィンドウ外へカーソル(point)が出るかどうか」を調べ、「出るな > らスクロールする」、というようなアルゴリズムを使えば良いですね。 > 今頃になって申しわけないですが、そういうシンプルな作りであれば、 > > (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) > ())) > > (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) > ())) > > (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 [return] 'sane-newline) > > こんな感じでご希望には沿うような気がします(結局書いちゃった)。 > > c-quick 全体よりは短かいですから使えればいいかもしれませんね。 > > 境界条件などは大してチェックしていないので、実地テスト(<, > などのテス > トで良いかどうか)はお任せします。(interactive "_p") は直してください。 わざわざ新しい関数を書いていただいてありがとうございます。 ためしてみましたが、以前私のc-quickに対してあげた問題点が 両方解決できていました。まだ、ほとんど、使用していないですが この二つの問題点が解決したこの新しい関数が 私の希望に一番添うものになりました。 もし、私の様なスクロールを望む人がいるならばこの関数を進めよう と思います。 ●"newline"がないため、bufferの最終行で改行すると、画面の中央にカーソルが飛んでしまう。 ●bufferの最終行で C-n (c-quick-move-down)を実行すると、カーソ ルのWindowでの位置が一段ずつ上がっていき最終的には一番上にきて しまう。
Re: スクロールの挙動
Author: IMAI Hidetoshi
Date: Wed, 13 Jun 2001 10:13
Date: Wed, 13 Jun 2001 10:13
34 lines
3774 bytes
3774 bytes
今井です。 > わざわざ新しい関数を書いていただいてありがとうございます。 > ためしてみましたが、以前私のc-quickに対してあげた問題点が > 両方解決できていました。まだ、ほとんど、使用していないですが > この二つの問題点が解決したこの新しい関数が > 私の希望に一番添うものになりました。 > もし、私の様なスクロールを望む人がいるならばこの関数を進めよう > と思います。 > > ●"newline"がないため、bufferの最終行で改行すると、画面の中央にカーソルが飛んでしまう。 > > ●bufferの最終行で C-n (c-quick-move-down)を実行すると、カーソ > ルのWindowでの位置が一段ずつ上がっていき最終的には一番上にきて > しまう。 > > 上記のように、問題がないと書いたのですが、1点問題がありました。 それは、ほとんどの場合最終行の次の行が半分くらいwindowの一番し たに見えています。この時には、うまく行くのですが、たまに最終行 が丁度、windowの一番下と一致することがあります。(つまり次の行 が全く見えない)この時には、カーソルが画面の中央に飛んでしまい ます。そこで下記のように、move-to-window-line の値を変更して したから2行目と比較することで飛ぶことがなくなりました。 (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 の # 値は変更していません。
Re: スクロールの挙動
Author: Seiichi Namba
Date: Wed, 13 Jun 2001 19:45
Date: Wed, 13 Jun 2001 19:45
125 lines
7148 bytes
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>
Re: スクロールの挙動
Author: IMAI Hidetoshi
Date: Thu, 14 Jun 2001 10:25
Date: Thu, 14 Jun 2001 10:25
173 lines
8815 bytes
8815 bytes
今井です At 14 Jun 2001 04:45:15 +0900, Seiichi Namba wrote: > > 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: > > 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 キーを押したときの挙動 > がおかしくなってしまうようでした。 > ありがとうございます。 ためしてみました。最終行に半行表示があってもなくても、 この新しい関数ならば中央にカーソルが飛ぶことなく スクロールしてくれました。 難波さんのおしゃっている"return"に"sane-newline"を割り当てたと きのminibufferなどで挙動がおかしくなるというのがどんな場合か わかりませんがxemacsで不思議な動作はしていないようでした。 > それと、 before-the-window-p(), after-the-window-p() の2つの関数(イ > ンライン)は不要になりました。pos-visible-in-window-p() というプリミティブ > があったのをすっかり忘れていました。 > sane-newline で以下のところを直さないとafter-the-window-pを 使用してしまうようでした。 # これでいいですよね。 ------------------------------------------------------------ (while (after-the-window-p newpt) (scroll-up 1)) ------------------------------------------------------------ ↓ ------------------------------------------------------------ (while (null (pos-visible-in-window-p newpt)) (scroll-up 1)) ------------------------------------------------------------ > 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 では同じようになっているのかもしれませんが、もし半 > 行表示に関する問題が出てしまった場合、調整のしようがないかもしれません。 > その場合は昨日お送りした内容のものを使うしかないのかもしれません。 > xemacs-21.1.14 では以下のようになっていました ------------------------------------------------------------ `pos-visible-in-window-p' (buffer: *Hyper Apropos*, mode: Hyper-Apropos) Built-in function: arguments: (&optional POS WINDOW) Return t if position POS is currently on the frame in WINDOW. Returns nil if that position is scrolled vertically out of view. POS defaults to point in WINDOW's buffer; WINDOW, to the selected window. ------------------------------------------------------------ 更に、pos-visible-in-window-safe という関数が ありましたがなにをするものかよく分かりませんでした。 ------------------------------------------------------------ `pos-visible-in-window-safe' (buffer: *Hyper Apropos*, mode: Hyper-Apropos) Compiled Lisp function, (loaded from "paren"): arguments: (pos) safe version of pos-visible-in-window-p ------------------------------------------------------------ しかし、この関数の方に変えても同じように動くようでした。 > emacs-21 では上のコードで充分なのですが、どうもお書きになっている > 挙動では pos-visible-in-window-p を使う方法では駄目のような気もする。 > > お書きになっている半行表示と move-to-window-line の関係がちょっと異常 > な感じもするので、お書きになっている通りだとすると、あるいは xemacs 固 > 有のバグなのかもしれません。確認したいのですが、 > > (1) 最下行が半行表示になっている。 > (2) 最下行が半行表示ではない。 > > の2つの状況で、(move-to-window-line -1) を評価した時、何が起きますか? > emacs-21 では (1) の場合は、半行表示の直前の行に移動し、(2) の場合は > もちろん完全に表示されている最下行に移動します。 > 同じことをためしてみたのですが、難波さんがemacsで得た結果と 私がxemacsで得た結果は同じでした。
sane-scroll.el 最終版 (was: スクロールの挙動)
Author: Seiichi Namba
Date: Thu, 14 Jun 2001 17:12
Date: Thu, 14 Jun 2001 17:12
213 lines
10457 bytes
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>
Re: sane-scroll.el 最終版 (was: スクロールの挙動)
Author: Seiichi Namba
Date: Fri, 15 Jun 2001 05:03
Date: Fri, 15 Jun 2001 05:03
62 lines
4081 bytes
4081 bytes
難波です。
Seiichi Namba <sn@asahi-net.email.ne.jp> writes:
> 最後に sane-scroll.el の全文を貼り直しておきます。xemacs では
> (interactive "p") はいずれも (interactive "_p") に変えてください。上の
> (condition-case nil (pos-visible-in-window-p newpt) (args-out-of-range nil))
> はとりあえず採用していません。
まだ気に入らないので直しました。C-u -3 C-p などというマイナス方向の操
作(需要は稀だと思いますが)がうまく動いていませんでした。
after-window-p などを使わなくなったので要部を共有して対応しました。
昨日のものは sane-newline の条件判定が何故か逆になっていたのでこれも修
正しました。
$ cat sane-scroll.el
;; -*- emacs-lisp -*-
;; Fri Jun 15 01:55:46 2001
;; Fri Jun 15 13:52:22 2001
;; Authour: S.Namba <sn@asahi-net.email.ne.jp>
;; Conceived because (setq scroll-step 1) (or equiv.) handling is
;; wrong in all variants of emacs.
;; Change (interactive "p") to (interactive "_p") in xemacs
(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 (null (pos-visible-in-window-p newpt))
(if (< arg 0) (scroll-down 1) (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")
(sane-next-line (- arg))
(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 (null (pos-visible-in-window-p newpt)) (scroll-up 1))
(goto-char newpt)
(setq this-command 'newline)
()))
(global-set-key [up] 'sane-previous-line)
(global-set-key [down] 'sane-next-line)
(global-set-key "\C-m" 'sane-newline)
--
難波清一@東京西東京市 (http://www.asahi-net.or.jp/~pi9s-nnb/)
NAMBA Seiichi <sn@asahi-net.email.ne.jp>
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads