在Emacs中,C-u C-SPC
将“跳转到标记,并设置标记
从当地标记圈弹出“。有没有办法在标记环周围走相反的方向?假设您已经多次输入Cu C-SPC并想要回到你看过的标记而不是一路走来戒指。
答案 0 :(得分:13)
与以前的答案不同,这个问题只与我们提出的问题完全相同:C-u C-SPC的逆转。我发现它最有用。
(defun unpop-to-mark-command ()
"Unpop off mark ring. Does nothing if mark ring is empty."
(interactive)
(when mark-ring
(setq mark-ring (cons (copy-marker (mark-marker)) mark-ring))
(set-marker (mark-marker) (car (last mark-ring)) (current-buffer))
(when (null (mark t)) (ding))
(setq mark-ring (nbutlast mark-ring))
(goto-char (marker-position (car (last mark-ring))))))
与scottfrazer的答案相比,这个命令在移动光标和标记方面有一个细微的差别,它更准确地反映了Cu C-spc,并且它不要求前一个命令是一个unpop / pop-to -mark-命令。
答案 1 :(得分:5)
这是一个功能:
(defun unpop-to-mark-command ()
"Unpop off mark ring into the buffer's actual mark.
Does not set point. Does nothing if mark ring is empty."
(interactive)
(let ((num-times (if (equal last-command 'pop-to-mark-command) 2
(if (equal last-command 'unpop-to-mark-command) 1
(error "Previous command was not a (un)pop-to-mark-command")))))
(dotimes (x num-times)
(when mark-ring
(setq mark-ring (cons (copy-marker (mark-marker)) mark-ring))
(set-marker (mark-marker) (+ 0 (car (last mark-ring))) (current-buffer))
(when (null (mark t)) (ding))
(setq mark-ring (nbutlast mark-ring))
(goto-char (mark t)))
(deactivate-mark))))
答案 2 :(得分:5)
继续我对scottfrazer的very handy solution的评论,这里有一些建议与之配合使用,可以轻松地随意反转标记环周围的方向,而无需为每个使用不同的键绑定方向。
我使用cua-selection-mode
,所以对我来说, C-SPC 绑定到cua-set-mark
,但我把它写成一个宏,以便建议绑定哪个函数到 C-SPC ,并验证它适用于默认的set-mark-command
。
要取消启动,只需提供一个否定前缀参数。例如Ç - C-SPC
关于cua-set-mark
的一个好处是,在初始 Cu C-SPC 之后,您可以继续使用弹出连续标记C-SPC ,我在这里包含了这种行为:在初始 C - C-SPC 之后你可以继续用 C-SPC 。要再次反转方向并调用pop-to-mark
,只需再次使用 C-u C-SPC 提供正参数。
(defmacro my-unpop-to-mark-advice ()
"Enable reversing direction with un/pop-to-mark."
`(defadvice ,(key-binding (kbd "C-SPC")) (around my-unpop-to-mark activate)
"Unpop-to-mark with negative arg"
(let* ((arg (ad-get-arg 0))
(num (prefix-numeric-value arg)))
(cond
;; Enabled repeated un-pops with C-SPC
((eq last-command 'unpop-to-mark-command)
(if (and arg (> num 0) (<= num 4))
ad-do-it ;; C-u C-SPC reverses back to normal direction
;; Otherwise continue to un-pop
(setq this-command 'unpop-to-mark-command)
(unpop-to-mark-command)))
;; Negative argument un-pops: C-- C-SPC
((< num 0)
(setq this-command 'unpop-to-mark-command)
(unpop-to-mark-command))
(t
ad-do-it)))))
(my-unpop-to-mark-advice)
答案 3 :(得分:5)
这是一个解决方案,我刚刚花了太多时间。这个和其他解决方案之间的区别在于它适用于缓冲区,即它适用于“全局标记环”。我的目标是模拟类似于Eclipse或IntelliJ的历史浏览。我将它绑定到M-left和M-right,显然你可以选择不同的键。
(defun marker-is-point-p (marker)
"test if marker is current point"
(and (eq (marker-buffer marker) (current-buffer))
(= (marker-position marker) (point))))
(defun push-mark-maybe ()
"push mark onto `global-mark-ring' if mark head or tail is not current location"
(if (not global-mark-ring) (error "global-mark-ring empty")
(unless (or (marker-is-point-p (car global-mark-ring))
(marker-is-point-p (car (reverse global-mark-ring))))
(push-mark))))
(defun backward-global-mark ()
"use `pop-global-mark', pushing current point if not on ring."
(interactive)
(push-mark-maybe)
(when (marker-is-point-p (car global-mark-ring))
(call-interactively 'pop-global-mark))
(call-interactively 'pop-global-mark))
(defun forward-global-mark ()
"hack `pop-global-mark' to go in reverse, pushing current point if not on ring."
(interactive)
(push-mark-maybe)
(setq global-mark-ring (nreverse global-mark-ring))
(when (marker-is-point-p (car global-mark-ring))
(call-interactively 'pop-global-mark))
(call-interactively 'pop-global-mark)
(setq global-mark-ring (nreverse global-mark-ring)))
(global-set-key [M-left] (quote backward-global-mark))
(global-set-key [M-right] (quote forward-global-mark))
答案 4 :(得分:4)
有两个标记环:一个是当前缓冲区的本地,另一个是所有缓冲区中的全局。
默认情况下,在Icicles中(在 Icicle 全局次要模式中):
C-- C-SPC
可让您在当地标记之间旅行C-- C-x C-SPC
可让您在全球标记之间旅行 IOW,带有否定前缀arg,C-SPC
和C-x C-SPC
导航。没有它,他们就会按照他们通常的做法分别进行(set-mark-command
和pop-global-mark
)。
导航的工作原理如下:
完成期间可用的密钥包括:
up
,down
- 在*Completions*
中的候选人之间循环,而不导航到他们的位置
C-up
,C-down
- 循环,依次导航到每个位置
C-RET
,C-mouse-2
- 直接转到当前/点击的候选人(例如*Completions*
}
RET
,mouse-2
- 与之前相同(转到候选人),但结束命令(已完成)
S-TAB
- apropos-complete(substring / regexp)
TAB
- 前缀或模糊完整
答案 5 :(得分:2)
它并没有完全符合您的要求,但是可能值得寻找一个名为marker-visit.el的软件包,它允许您以“缓冲区位置顺序”导航当前缓冲区中的标记。从那个文件:
;;; Commentary:
;; This file provides a simple way to navigate among marks in a
;; buffer. C-u C-SPC is similar, but takes you haphazardly around the
;; buffer. Setting bookmarks is a lot of extra work if you just want
;; to jump around your buffer quickly; plus, you have to come up with
;; a name for every bookmark.
;; All the marks you've left while editing a buffer serve as bread
;; crumb trails of areas in the buffer you've edited. It is
;; convenient to navigate back and forth among these marks in order.
;; This file provides two methods to do just that, marker-visit-prev
;; and marker-visit-next. These two functions will take you, from
;; point, to the nearest mark in either direction. The function
;; marker-visit-truncate-mark-ring will truncate the mark ring.
;; The marks you can visit in a buffer consist of: "the mark" plus the
;; contents of the mark-ring.
我将[S-up]和[S-down]分别绑定到marker-visit-prev和marker-visit-next。
如果你真的想要/需要按照你的标记环目前的顺序进行导航,那么你可以通过查看pop-to-mark-command函数和pop标记以及实现自己的版本来旋转标记相反方向的环。
答案 6 :(得分:1)
手册说明了这一点:
变量
mark-ring-max
指定的最大数量 条目保留在标记环中。如果 存在许多条目而另一条存在 一个被推,最早的一个 列表被丢弃。重复`C-u C-'循环通过位置 目前在环。
我建议你使用它来包含标记环的大小(到3或4,我的目前是16)。然后你可以使用前缀更快地移动它。
此外:
如果你想回到 标记一遍又一遍 戒指可能不够方便。如果 所以,你可以记录一个位置 注册以便以后检索(*注意 在寄存器中保存职位: RegPos)。
答案 7 :(得分:0)
不是直接为这个问题回答emacs键绑定问题。
邪恶用户
我发现better-jumper
是邪恶用户。如果您对以邪恶方式诚实地提供使用感兴趣。
通过在主repository中使用其提供方式
(with-eval-after-load 'evil-maps
(define-key evil-motion-state-map (kbd "C-o") 'better-jumper-jump-backward)
(define-key evil-motion-state-map (kbd "<C-i>") 'better-jumper-jump-forward))
向前和向后移动到光标的旧位置真的很容易。
此外,您还可以使用其hook
函数来创建新方案,例如如果我将缓冲区标记更改为旧点等。
适用于emacs键绑定迷
对于默认键绑定样式,我只能提供helm-all-mark-rings
的建议。它提供了有关标记环的最佳可见性。
答案 8 :(得分:-2)
你试过browse-kill-ring
吗?
Download it from Emacswiki,将其放入您的加载路径,然后将其添加到您的emacs-conf:
(when (require 'browse-kill-ring nil 'noerror)
(browse-kill-ring-default-keybindings))
然后,当你按下M-y时,你会看到杀戮戒指,像普通文本一样搜索等。真的很方便。关于如何使用browse-kill-ring