Emacs:如何重新标记先前标记的区域

Emacs:如何重新标记先前标记的区域

使用 Emacs 时,我通常需要对同一区域执行多项操作(通常很大但不是明确定义的对象,例如“整个部分”、“整个段落”)。目前,我必须手动标记该区域,执行第一个操作,然后返回并重新标记该区域,执行第二个操作,然后重复...这非常麻烦。我想知道是否有任何快捷方式可以重新标记先前标记的区域?或者某种方法可以保持区域标记,直到我告诉 Emacs 取消标记。

答案1

下面的脚本片段将把 key-chords F6C-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

相关内容