如何在弹出标记环之前移动到最后一个位置?

时间:2014-08-19 01:11:20

标签: emacs

我经常遇到以下情况:

假设: 我总共有5个标记:当前标记位于5位置,标记环上有4个标记位置:432,{{1} } 分别。我的观点位置很远,比如1

情况: 现在我在100发现错误,所以我 C-u C-SPC 跳转到位置4并修复它。但我忘记保存前一个点位置4。我怎么跳回来?

我知道一个好的做法是在跳跃之前保存点位置。但类似的跳跃经常发生,并且问题发生的次数是1或2次。一旦它发生,如果可以有一个补救措施将会很好,因为它似乎也是一个特殊的位置,(在弹出标记环之前的最后一个位置)。

如果没有补救措施,手动从位置100手动转到4似乎是一次痛苦的旅程,即使它发生频率很低。

3 个答案:

答案 0 :(得分:2)

有几种可能性。

一个是养成使用exchange-point-and-mark(C-x C-x)的习惯。

另一个是建议pop-to-mark-command,因此在移动之前推动(和弹出)标记,例如(使用新的建议系统):

(defun save-mark-before-pop ()
  (push-mark (point) t)
  (pop-mark))

(advice-add 'pop-to-mark-command :before 'save-mark-before-pop)

这仍然需要您完成整个mark-ring,但它应该足以解决问题。

答案 1 :(得分:1)

以下代码将点的当前位置添加到标记环 当你调用 C-u C-SPC 并让你循环 标记环中的先前项目使用 C-SPC (而不是 C-u C-SPC ):

(setq set-mark-command-repeat-pop t)

(defadvice set-mark-command (before record-current-position (arg) activate)
  (when arg (push-mark)))

解释

上面定义的advice告诉Emacs调用执行push-mark命令主体的before函数set-mark-command(但仅当调用set-mark-command时才调用arg前缀push-mark)。

set-mark-command-repeat-pop将标记的当前位置添加到标记环并将标记设置为当前点的位置。

通过将nil设置为非x值,我们告诉Emacs在点击 Cu C-后立即点击 C-SPC 时保持弹出标记SPC

Visual Example

根据您给出的示例,我将在下面包含完整“往返”的可视化,其中:

  • ^:马克之首
  • |:商标的位置
  • 1 2 3 4 5 ... 100 x ^ | :点的位置

我包括这个例子是为了完整性。如果您不关心幕后标记环中的点,标记和位置到底发生了什么,您现在可以停止阅读:)


  1. 情况点击 C-u C-SPC 之前

    advice
  2. 点击 C-u C-SPC 之后的情况

    • 在Emacs评估了上面定义的1 2 3 4 5 ... 100 x ^ | 主体之后:

      5

      如您所见,标记的先前位置(100)已被推到标记环上,标记位于点的当前位置(set-mark-command)。

      < / LI>
    • 在Emacs评估建议命令体(1 2 3 4 5 ... 100 x ^ | )之后:

      100

      标记已经弹出;因为它之前是5,所以点仍然在那个位置。马克再次出现1 2 3 4 5 ... 100 x ^ |

  3. 首次点击 C-SPC 后的情况:

    a
  4. 后续调用 C-SPC ^|1 2 3 4 5 ... 100 x ^ | 1 2 3 4 5 ... 100 x ^ | 1 2 3 4 5 ... 100 ^ | x 1 2 3 4 5 ... 100 | x ^ 1 2 3 4 5 ... 100 x ^ | 的位置:

    {{1}}

答案 2 :(得分:0)

有一个elisp可以做到。

point-undo.el

即使忘记标记点,也可以撤消和重做点。这非常有用。