2010-08-03 108 views
27

在Emacs中,C-u C-SPC將「跳到標記處,並將標記從 位置彈出當地標記環」。有沒有辦法繞着標記圈走相反的路?假設您已經多次輸入了C-u C-SPC,並且希望回到您所看到的標記,而不是繞着環路前進。如何在Emacs的標記環中向前和向後移動

+3

在這種情況下,將標記保存在寄存器中可能會很有用,如果它是一個衆所周知的或經常訪問的線路。不確定自己是否要通過標記環。 – 2010-08-03 05:56:30

+1

雖然這不允許倒退,但它可以幫助更快地完成整個環,這在很多情況下可能已經是您所需要的了:將set-mark-command-repeat-pop變量設置爲非'nil',這將允許您按一下'Cu C-SPC'後只按'C-SPC'。從[手冊](http://www.gnu.org/software/emacs/manual/html_node/emacs/Mark-Ring.html) – quazgar 2013-05-08 15:16:50

+3

掌舵一如既往:helm-all-mark-rings將顯示你所有的標記,並讓你使用正常的頭盔完成來瀏覽它們。你可以完成內容或linenumber! – sandos 2014-10-30 07:13:50

回答

2

它並不完全符合你的要求,但它可能值得尋找一個叫做marker-visit.el的軟件包,它允許你在'buffer position order'中瀏覽當前緩衝區中的標記, 。從該文件開始:

;;; 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-mark功能以及實現您自己的版本來旋轉標記環的方向相反。

+1

我設法在這裏找到一個谷歌緩存版本:http://webcache.googleusercontent.com/search?q=cache:YGXiRhltPR4J:www.bloomington.in.us/~brutt/marker-visit.el+marker-visit。 el&cd = 1&hl = en&ct = clnk – Damyan 2010-08-05 17:22:29

+0

啊,道歉 - 沒有意識到它很難找到。我懷疑我的配置中收集的一半elisp正在收集每週退休金。 – Simon 2010-08-16 23:51:11

+0

使用[書籤+](http://www.emacswiki.org/emacs/BookmarkPlus),書籤可以像標記一樣簡單 - 不需要命名等,您可以在它們之間循環。參見[autonamed書籤](http://www.emacswiki。org/emacs/BookmarkPlus#AutonamedBookmarks) – Drew 2011-11-02 16:22:25

-2

你試過browse-kill-ringDownload it from Emacswiki,把它放在你的負載路徑,然後將其添加到您的Emacs-conf的:

(when (require 'browse-kill-ring nil 'noerror) 
    (browse-kill-ring-default-keybindings)) 

然後,當你按你將看到我殺環,搜索它像普通的文本 。真的很方便。 There is also some more practical info on emacs-fu關於如何使用browse-kill-ring

+3

這將是一個關於殺戒的問題的有用答案。 – phils 2010-08-03 12:39:32

+0

他在問關於標記環的問題,標記環是設置標記的地方的一個循環列表。 – 2010-08-03 16:53:22

+0

... doh。注意自己:在極度疲勞的時候不要回答問題。 – monotux 2010-08-10 20:38:28

1

手冊上說的:

變量mark-ring-max 指定保留標記環 條目的最大數量。如果 存在許多條目,而另一個 則被推入,則 列表中最早的一個將被丟棄。重複「C-u C-」循環通過當前在環中的位置 。

我建議你使用它來包含標記環的大小(3或4,我現在是16)。然後,您可以使用前綴更快地移動它。

另外:

如果你想一遍又一遍回遷 同一個地方,標記 環可能不夠方便。如果是 那麼,您可以在 寄存器中記錄該位置以供日後檢索(*注意 將位置保存在寄存器中: RegPos。)。

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)))) 
+0

任何關於合理綁定的想法都會將此與現有的流行至標記機制聯繫起來?例如如果您從「C-u C-SPC C-SPC C-SPC ...」開始拍攝,最好有簡單的方法來改變方向。也許一些'set-mark-command'的建議可以使'C-u C-SPC'充當兩個函數之間的切換? – phils 2010-08-08 10:52:08

+2

排序:http://stackoverflow.com/questions/3393834/how-to-move-forward-and-backward-in-emacs-mark-ring/5117076#5117076 – phils 2011-02-25 12:14:15

5

跟進我到scottfrazer的very handy solution評論,這裏有一些建議,這與一起工作,可以很容易地扭轉隨意標記環周圍的方向,不需要爲每個方向使用不同的鍵綁定。

我用cua-selection-mode,所以對我來說C-SPC勢必cua-set-mark,但我已經寫了這個宏,以便提醒取其功能勢必C-SPC,並驗證它的工作原理默認set-mark-command

要取消流行,只需提供否定前綴參數即可。例如C--   C-SPC

一個約cua-set-mark的好處之一是,在經過最初   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) 
4

有兩個標記環:一個是當前緩衝區本地,一個是全局緩衝區。

默認情況下,在Icicles(在冰柱全球次要模式):

  • C-- C-SPC讓您當地的標誌
  • C-- C-x C-SPC讓您在全球的標記之間跳閘之間跳閘

IOW,用負前綴arg,C-SPCC-x C-SPC導航。沒有它,他們只是做他們通常做的事情(分別爲set-mark-commandpop-global-mark)。

導航工作如下:

  • 位置可作爲考生完成:文字是標記的生產線。
  • 完成:你可以使用子字符串,正則表達式,前綴,模糊(各種)。
  • 您可以在任何完成的候選人之間循環,或直接轉到其中的任何人。
完成期間可用

鍵包括:

  • updown - 在*Completions*候選人之間切換,而導航到它們的位置

  • ​​,C-down - 週期,導航到每個位置依次爲

  • C-RETC-mouse-2 - 直接轉到當前/點擊候選人(例如,在*Completions*

  • RETmouse-2 - 同以前的(去候選人),但結束命令(完成)

  • S-TAB - 中肯完成(串/正則表達式)

  • 前綴或模糊完整

10

不像以前的答案,這一個只是確切地問:銅的反向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答案,這個命令有它如何移動光標,標誌,能更準確地反映銅C-SPC一個微妙的差異,它不要求前面的命令是一個unpop /彈出到標記命令。

+1

這可以作爲純粹的魔法。 – yPhil 2014-08-01 23:21:03

+0

scottfrazer從2010年開始的答案非常相似(並且如上所述回答了問題)。你可能想討論爲什麼你認爲你的功能差異是一個改進。 – phils 2014-09-05 00:40:17

+0

當然。編輯我的答案。 – 2014-09-05 11:03:20

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))