大きなファイルが短時間ぶら下がってスクロールしないようにするにはどうすればよいですか?(たとえば、ページキーを保持する)


9

デフォルト設定(emacs -Q)を使用しても、大きなCファイルはEmacsでのスクロールに時間がかかる場合があることを発見しました。

たとえば、大きなファイルを開いたままにしPage-Downます。1〜2ページ下にスクロールし、1〜2秒間ハングします。リリースすると、ドキュメントがかなり下にスクロールします(20ページ程度)。*

Emacsの動作が不安定にならないことを知っpage downています。すばやくタップした場合、Emacsは何とか追いついて、以前のようにハングしません。

Emacsに一度に複数のイベントを処理させず、代わりにイベント間で再描画させることは可能ですか?

または、どういうわけか、多くのイベントを処理しようとしている間にハングするのではなく、応答性が向上しますか?


* この場合の実際の速度低下は、構文の強調表示が原因です。これは、ドキュメント全体を1回スクロールすると、その後すべてのスクロールが高速になるためです。フォントロックに関連するさまざまなオプションを調査しましたが、フォントロックのデフォルトは妥当であり、それらを微調整しても問題は解決されないと結論付けました。質問。


1
それは正常に聞こえません。原因を突き止めるためのテストをしましたか?それはあなたのemacs設定に関連しているかもしれません(それemacs -Qを除外するためにテストする)、またはあなたのディスクが非常に遅いかもしれません。構文の強調表示やその他の役立つ動作をオフにしてみることもできます(バッファーを基本モードに切り替えます)。
db48x 2017年

1
デフォルト設定では、emacs -Q、編集された質問を意味しました。スローダウンは間違いなく構文の強調表示です。ただし、再描画の前にすべてのイベントを処理しようとするemacsによって、状況はさらに悪化しました。
ideasman42

回答:


10

お気づきのように、これは基本的に、何らかの理由で再表示が遅すぎる場合に発生します。一般的なケース(「非常に遅い」の場合)でできることは多くありませんが、「少しだけ遅すぎる」場合は、そのうちの1つ(または両方)を試すことができます。 2つのうち1つのみ):

(setq jit-lock-defer-time 0)
(setq fast-but-imprecise-scrolling t)

Emacs-25では両方とも新しいことに注意してください。


2
変数のdoc-stringは、fast-but-imprecise-scrollingnil以外の場合、スクロール操作を高速化します。」おそらく、この例は非nil値を反映する必要があるため、スクロールを高速化します。
弁護士リスト2017年

2
  1. できることの1つは、キーを押し続けて繰り返し呼び出すのではなく、数値のプレフィックス引数をscrollコマンドに渡すことです。

    たとえば、<next>キー(別名PageDown)を使用している場合、それが呼び出すコマンドはですscroll-up-command。そしてC-h f scroll-up-command、数値の接頭辞argはその数の行をスクロールするように言っていることを伝えます。

    例:バッファーに50,000行あり、カーソルがその先頭(最初の行)にあるとします。これを行うC-u 25000 <next>と、バッファを半分下にスクロールします(25,000行)。

    一時停止しますが、少し短くなります。

  2. もう1つの可能性は、特定の数の大きなEmacsモノによって下に移動することです。バッファーが^L(Control-L、フォームフィード)文字を使用してテキストのセクションを区切る場合、にforward-pageバインドされているなどのページナビゲーションコマンドを使用できますC-x ]。この場合も、数値のプレフィックス引数を渡して、一度に多くのページを進めることができます。^L文字がない場合は、forward-paragraphC-<down>)またはforward-line接頭辞argを付けた別のモーションコマンドを使用できます。

  3. 同様に、コマンドgoto-lineM-g M-g)を使用して特定の行番号に移動できます。(大きな数字をwhat-line選びます。)コマンドは、現在の行番号が何であるかを通知します(モード行に表示することもできます)。(M->は、バッファーの最後に移動しM-x what-lineます。そこには、行の数がすべて表示されます。)

  4. (スキミングに関するコメントの後に、これが表示されるまで追加されます。)ナビゲーションにはインクリメンタル検索を使用してください。C-sまたは(正規表現検索の場合)を使用して、スクロールしたい場所の近くを前方に検索しますC-M-s

    ライブラリIsearch +を使用している場合は、任意の述語をオンザフライで検索に組み込むこともできます。

    つまり、パターンマッチングのみを使用して検索する必要はありません。たとえば、(1)コメントブロック全体または完全なswitchステートメントを選択するパターンに一致するように検索したり、(2)一致に特定のサイズ(文字数)が必要であったりするように検索できます。

    Isearch +を使用すると、複数のパターンへの一致を検索したり、別のパターン(距離が文字、単語、セックス、リスト、文で測定されます)への指定された距離(「近く」)の距離内の1つのパターンへの一致を検索したりできます。 ..)


1
ドキュメントをジャンプしたり、ページを下に移動したり、マウスホイールを使用したりする方法に精通しているのは、主にファイルを読み飛ばす方法です(たとえば、大きなswitchステートメントの大きなコメントブロックにヒットするまで、下にスクロールする場合があります)。本をめくるのと同等のデジタル:))
ideasman42 '13 / 03/17

1

これは弱いソリューションなので、これを投稿しますが、何もしないよりはましです。

すべてのemacs動作を変更する代わりに、すべての操作の後に強制的に再描画する関数を作成することができます。これにより、ハングアップを回避し、ページのアップ/ダウンとマウスホイールに対するスクロールの応答性を高めます。

(global-set-key [next]
 (lambda () (interactive)
   (condition-case nil (scroll-up)
     (end-of-buffer (goto-char (point-max))))
   (redisplay)))

(global-set-key [prior]
 (lambda () (interactive)
   (condition-case nil (scroll-down)
     (beginning-of-buffer (goto-char (point-min))))
   (redisplay)))

(global-set-key (kbd "<mouse-4>")
 (lambda () (interactive) (scroll-down mouse-wheel-scroll-amount) (redisplay)))
(global-set-key (kbd "<mouse-5>")
 (lambda () (interactive) (scroll-up mouse-wheel-scroll-amount) (redisplay)))

これはEmacsがキーリピートよりも遅れる傾向があることに注意してください。したがって、キーを離すと、スクロールは思ったよりもさらに進みます:-(
Stefan

確かに、実際には私はこのような問題を見つけません。
ideasman42 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.