![Emacs:如何重新标记先前标记的区域](https://linux22.com/image/1323789/Emacs%EF%BC%9A%E5%A6%82%E4%BD%95%E9%87%8D%E6%96%B0%E6%A0%87%E8%AE%B0%E5%85%88%E5%89%8D%E6%A0%87%E8%AE%B0%E7%9A%84%E5%8C%BA%E5%9F%9F.png)
使用 Emacs 时,我通常需要对同一区域执行多项操作(通常很大但不是明确定义的对象,例如“整个部分”、“整个段落”)。目前,我必须手动标记该区域,执行第一个操作,然后返回并重新标记该区域,执行第二个操作,然后重复...这非常麻烦。我想知道是否有任何快捷方式可以重新标记先前标记的区域?或者某种方法可以保持区域标记,直到我告诉 Emacs 取消标记。
答案1
下面的脚本片段将把 key-chords F6
、C-F6
、绑定C-S-F6
到管理器标记(对阵马克)。标记随着您更改它们周围和之间的文本,移动、缩小和增大。您可以使用任何您喜欢的键。将代码放入您的~/.emacs
配置文件中。
- 首先建立初始区域(标记点)的边界。
- 然后按下
F6
将标记设置到该区域的边界。 - 做任何你需要做的事...
C-F6
根据需要 按“重复”*“执行...”重新建立修改区域的边界- 使用完毕后,
C-S-F6
清除区域标记。
(global-set-key (kbd "<f6>") 'set-markers-for-region)
(defun set-markers-for-region ()
(interactive)
(make-local-variable 'm1)
(make-local-variable 'm2)
(setq m1 (copy-marker (mark)))
(setq m2 (copy-marker (point))))
(global-set-key (kbd "<C-f6>") 'set-region-from-markers)
(defun set-region-from-markers ()
(interactive)
(set-mark m1)
(goto-char m2))
(global-set-key (kbd "<C-S-f6>") 'unset-region-markers)
(defun unset-region-markers ()
(interactive)
(set-marker m1 nil)
(set-marker m2 nil))
答案2
如果该区域刚刚被取消标记(Emacs 称之为“停用”),C-xC-x将会重新标记(又称“重新激活”)它。
答案3
不幸的是,Emacs 没有区域历史记录功能。有一个函数pop-mark
,可以将标记恢复到从变量中获取的先前位置mark-ring
,但它不会设置点,因此对于恢复旧区域毫无用处。如果你擅长Emacs-Lisp,您可以set-mark
使用维护区域环(类似于变量mark-ring
)的代码来建议函数。然后,您可以实现一个pop-region
行为类似于的函数pop-mark
。
答案4
常见的工作流程是narrow-to-region
( C-x n n
),然后在可见区域执行任务。完成后,widen
( ) 再次显示缓冲区的其余部分。C-x n w