【Emacs】sticky scroll 相当の挙動を実現するには? / How to achieve sticky scroll behavior in Emacs?

VSCodeではsticky scroll が有効になっている。

Emacsで「ほぼ」同様の機能を実現するには

のが一番良さそうである。設定はこんな感じ(主にpython向け):

(add-hook 'emacs-startup-hook #'(lambda ()
                                  (add-hook 'prog-mode-hook #'window-stool-mode)
                                  (setq window-stool-n-from-top 2)
                                  (setq window-stool-n-from-bottom 0)
                                  ))

類似のパッケージは

  • topsyをインストールし、topsy-mode を有効にする qiita.com

もしくは

  • breadcrumb-mode をインストールし、有効にする

  • scroll-conservativelyを1に設定する

ちなみにbreadcrumb-modeの設定:

(breadcrumb-mode +1)

;; 画面の下端で「↓向きに1行移動」したり,上端で「↑向きに1行移動」したりしたときの自動スクロール量を1に設定する.
;; デフォルトは0(無効値)で,半画面分(ウィンドウ高さの50%)自動スクロールする動作になる。
;; 厳密に説明すると、ここで指定した行数だけ移動すると(goto-lineなどの長距離移動を含む)、リセンタリングが発生する。
;; 1に設定すれば、C-nやC-pでの移動ではリセンタリングは発生しないというわけである。
(setq scroll-conservatively 1)

;; また十分大きな値(> 100)にすることで、
;; goto-lineなどによるカーソルの長距離移動を含めてリセンタリングを事実上OFFにできる。
;; どちらが良いかはお好みで。
;; (setq scroll-conservatively 101)

topsyとbreadcrumb-mode、いずれも頭出しの関数名までが表示される。後者は引数を含めた情報までスクロールされない。ゆえに「ほぼ同様」のsticky scroll もどき、といったわけである。

カーソルに追従するスクロールの挙動をVSCodeにさらに近づけてみたい場合は以下の設定を試してみるのも良い。

;; スクロールのマージン
;; 画面スクロールにあたり、ウィンドウの高さがこの行数だけ小さくなるとみなす
(setq scroll-margin 3)

スクロールの挙動/設定について解説した記事は以下:

exlight.net

scroll-marginについて説明した記事は以下:

yohshiy.blog.fc2.com