emacs:スクロール/ページアップ/ダウン後に最後の位置に戻る方法


14

発行した後、scroll-upまたはscroll-downemacsで、ポイントを以前の位置に戻す簡単な方法はありますか(マークリングに追加することを忘れていた場合)。

または、スクロール動作を変更して、上にスクロールしてから下にスクロールする(またはその逆)ことでポイントを元の位置に戻す方法はありますか(マークリングを妨げることなく)?(たとえば、スクロールによりポイントを正確にx行移動します。xは画面の高さです)

私はemacsに慣れる過程にあり、これは最も一般的な呪いを引き起こす状況の1つです:マークリングに行を追加することを忘れずにスクロールしてコードの別の部分を表示し、試してみるのは痛いです私が取り組んでいたコード行を再配置するために。そのため、技術的な解決策を求めていますが、経験豊富なユーザーがこの問題をどのように回避するかについても興味があります。マークを設定すること、ウィンドウを分割して見回すこと、または他のパターンを使用することを覚えていることに慣れていますか?

ありがとう

回答:


13
(setq scroll-preserve-screen-position t)

この設定では、ページを上下に移動すると、カーソルは元の行に戻ります。また、Emacsバージョン23以降の元の列を保持します。

あなたは好むかもしれないし好まないかもしれない

(setq scroll-preserve-screen-position 'always)

元の位置がまだ表示されている場合、バッファ内のカーソル位置を保持するのではなく、スクロール時にカーソルの画面位置を常に保持します。


2
私からも感謝します!(何年も!)何年もの間、スクロールする前に「<>」と入力してきましたが、検索対象を戻すだけです。
Jロバート

私にとって、これはscroll-up-line(スクロールホイールで使用するものです)画面の上部または下部にヒットしたときにカーソルを1文字前方に移動させます。
asmeurer

@asmeurer私はこれを観察しません。initファイルに何か変なものがあるか、Emacsのバージョンにバグがあるはずです。
ジル「SO-悪であるのをやめる」

ええ、私はこれを投稿した後にそれを理解しました。emacs.stackexchange.com/questions/12439/…で新しい質問を開きました
-asmeurer

これはあるべきだと思う(setq scroll-preserve-screen-position 'always)。それ以外の場合は、C-v M-v開始位置にポイントを戻しません。(2番目のポイント位置は最初のスクリーンに表示されるため、ポイントは戻りません。)
ウィルフレッドヒューズ

6

うまくいくことがわかったのはgoto-last-change.el、を使用して、最後に編集した場所に戻ることです。私はバインディングが好きです:

(require 'goto-last-change) ;; download this package and install in load-path
(global-set-key (kbd "C-x C-\\") 'goto-last-change)

2
同様に、追加のパッケージを必要としない:(C-_ C-f C-_元に戻す、移動、元に戻す)。
ジル「SO-悪であるのをやめる」

1
@Gilles確かに、その後、アンドゥスタックはさらに2つの要素によって成長しました。:)
トレイジャクソン

1

あなたが説明する問題をどのように回避するかについてのあなたの質問に答えて(コードの他の場所を見てから、私が働いていたポイントに戻る)...

通常、他の場所を簡単に見る必要がある場合、画面を分割します。その後、で元の画面に戻ることができC-x o、分割せC-x 1ずに通常に戻ります。

また、前方および後方のi-searchを使用して、コード内の特定の関心ポイントを見つけます。私が探しているものを知っているとき、それはコードをナビゲートするためのかなり効率的な方法だと思います。


0

現在の位置から数行だけスクロールしている場合、これを使用して、ポイントを移動せずにウィンドウをスクロールできます。

(defun scroll-in-place (scroll-up)
  "Scroll window up (or down) without moving point (if possible).

SCROLL-Up is non-nil to scroll up one line, nil to scroll down."
  (interactive)
  (let ((pos (point))
        (col (current-column))
        (up-or-down (if scroll-up 1 -1)))
    (scroll-up up-or-down)
    (if (pos-visible-in-window-p pos)
        (goto-char pos)
      (if (or (eq last-command 'next-line)
              (eq last-command 'previous-line))
          (move-to-column temporary-goal-column)
        (move-to-column col)
        (setq temporary-goal-column col))
      (setq this-command 'next-line))))

;;;; ------------------------------------------------------------------------
(defun scroll-up-in-place ()
  "Scroll window up without moving point (if possible)."
  (interactive)
  (scroll-in-place t))

;;;; ------------------------------------------------------------------------
(defun scroll-down-in-place ()
  "Scroll window up without moving point (if possible)."
  (interactive)
  (scroll-in-place nil))

(global-set-key (read-kbd-macro "M-<down>") 'scroll-up-in-place)
(global-set-key (read-kbd-macro "M-<up>") 'scroll-down-in-place)

ファイルのまったく別のセクション(またはまったく別のファイル)に移動する場合、breadcrumb同様のことを行う他のパッケージがたくさんありますが、時々使用します。

コードの2つの領域を同時に視覚的に確認する必要がある場合は、フレームを水平に2つのウィンドウに分割し、完了したら2番目のウィンドウを破棄します。

ただし、ほとんどの場合、2つのフレームを使用します。1つは現在の作業フレームで、もう1つは参照ファイルで、同じファイルまたは他のファイルをジャンプするために使用します。


移動することなく、現在のポイントの上または下を表示するだけでよい場合は、をサイクルできますC-l
asmeurer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.