2

これは、Cu C-space でマーク リングを使用する方法に関する質問ではありません。

私が望むのは、ロケーション履歴を一歩一歩逆方向にナビゲートすることです。「ステップ」とは、バッファ内で単一のアトミックカーソルが移動することを意味します。たとえば、カーソルが行の途中にあり、Cf を 3 回発行してカーソルを 3 文字進めてから、Ce を発行して行末にジャンプします。ここで、最初に Ce を「取り消し」、次に 3 つ前の Cf を「元に戻す」ことで戻りたいと思います。それで、何かキーを押すと、Ce が発行された場所にカーソルが移動し、次に 1 文字戻ります。これは、バッファ内でカーソルが移動するたびに mark を押してから Cu C スペースを使用するようなものですが、自動的にノイズが少なくなります。

Emacsでそれを行う方法は?

4

2 に答える 2

3

EmacsWiki にはいくつかの代替手段があります: quick-jumppoint-undojump-to-prev-posgoto-last-point

于 2012-11-26T15:33:34.473 に答える
3

デフォルトでは、Emacs はこれらの動きをどこにも記録しません。そのため、必要なことを行うには、バッファー位置を記録する必要があります。何かのようなもの

(defvar my-positions-history nil)
(make-variable-buffer-local 'my-positions-history)
(add-hook 'post-command-hook 'my-record-positions)
(defun my-record-positions ()
  (unless (and my-positions-history
               (equal (point) (marker-position (car my-positions-history))))
    (push (point-marker) my-positions-history)))

これにより多数のマーカーが作成され、Emacs が大幅に遅くなる可能性があることに注意してください。(point)代わりに を使用すると(point-marker)この問題は解決しますが、これらの位置はバッファーへの変更を追跡しないため、このモーションを実行した後にバッファーが変更された場合、元の場所に戻らない可能性があります。

次に、次のようなコマンドを追加できます

(defun my-undo-movement ()
  (interactive)
  (while (and my-positions-history
               (equal (point) (marker-position (car my-positions-history))))
    (pop my-positions-history))
  (when my-positions-history
    (goto-char (pop my-positions-history))))
于 2012-11-26T14:18:54.000 に答える