我经常遇到以下情况:
假设:
我总共有5个标记:当前标记位于5
位置,标记环上有4个标记位置:4
,3
,2
,{{1} } 分别。我的观点位置很远,比如1
。
情况:
现在我在100
发现错误,所以我 C-u C-SPC 跳转到位置4
并修复它。但我忘记保存前一个点位置4
。我怎么跳回来?
我知道一个好的做法是在跳跃之前保存点位置。但类似的跳跃经常发生,并且问题发生的次数是1或2次。一旦它发生,如果可以有一个补救措施将会很好,因为它似乎也是一个特殊的位置,(在弹出标记环之前的最后一个位置)。
如果没有补救措施,手动从位置100
手动转到4
似乎是一次痛苦的旅程,即使它发生频率很低。
答案 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
根据您给出的示例,我将在下面包含完整“往返”的可视化,其中:
^
:马克之首|
:商标的位置1 2 3 4 5 ... 100
x ^ |
:点的位置我包括这个例子是为了完整性。如果您不关心幕后标记环中的点,标记和位置到底发生了什么,您现在可以停止阅读:)
情况在点击 C-u C-SPC 之前:
advice
在点击 C-u C-SPC 之后的情况。
在Emacs评估了上面定义的1 2 3 4 5 ... 100
x ^
|
主体之后:
5
如您所见,标记的先前位置(100
)已被推到标记环上,标记位于点的当前位置(set-mark-command
)。
在Emacs评估建议命令体(1 2 3 4 5 ... 100
x ^ |
)之后:
100
标记已经弹出;因为它之前是5
,所以点仍然在那个位置。马克再次出现1 2 3 4 5 ... 100
x ^ |
。
首次点击 C-SPC 后的情况:
a
后续调用 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)