В Emacs C-u C-SPC
будет "прыгать на отметку" и установить знак из
позиция выскользнула из локального кольца метки ". Есть ли способ обойти обратный путь вокруг кольца меток? Скажите, что вы набрали Cu C-SPC несколько раз и хотите вернуться к отметке, которую вы видели, не обойдя весь путь кольцо.
Как двигаться вперед и назад в кольце маркировки Emacs
Ответ 1
Это не делает то, что вы просите, но может стоить искать пакет с именем 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] к маркер-визиту-prev и marker-visit-next соответственно.
Если вам действительно нужно/нужно перемещаться в том порядке, в котором находится ваше кольцо меток, вы можете где-то найти функции pop-to-mark-command и поп-метки и реализовать свои собственные версии, чтобы повернуть отметьте кольцо в противоположном направлении.
Ответ 2
В отличие от предыдущих ответов, это делает только то, что было задано: обратная сторона 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 -Марк-команды.
Ответ 3
Здесь функция для этого:
(defun unpop-to-mark-command ()
"Unpop off mark ring into the buffer 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))))
Ответ 4
Следуя моему замечанию на scottfrazer очень удобное решение, здесь приведены некоторые советы, которые работают в сочетании с этим, чтобы упростить обратное направление вокруг кольца меток по желанию, без необходимости использования другого ключевого связывания для каждого направления.
Я использую cua-selection-mode
, поэтому для меня C-SPC привязан к cua-set-mark
, но я написал это как макрос, чтобы сообщить, какая функция привязана к C-SPC, и проверила, что она работает с по умолчанию set-mark-command
.
Чтобы распаковать, просто поставьте отрицательный аргумент префикса. например C-- C-SPC
Одна из приятных вещей в cua-set-mark
заключается в том, что после начального C-u 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)
Ответ 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))
Ответ 6
Есть два кольца маркеров: один локальный для текущего буфера и один глобальный среди всех буферов.
По умолчанию в 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
- тот же, что и предыдущий (перейти к кандидату), но завершите команду (done) -
S-TAB
- apropos-complete (substring/regexp) -
TAB
- префикс или нечеткое полное
Ответ 7
В руководстве сказано следующее:
Переменная
mark-ring-max
указывает максимальное количество записи для сохранения в кольце метки. Если что существует много записей, а другое один подталкивается, самый ранний в список отбрасывается. Повторение `C-u C- 'циклически проходит через позиции в настоящее время на ринге.
Я предлагаю вам использовать это, чтобы содержать размер кольца меток (до 3 или 4, у меня в настоящее время 16). Затем вы можете перемещаться по нему намного быстрее, используя префиксы.
также:
Если вы хотите вернуться к одно и то же место снова и снова, знак кольцо может быть не достаточно удобным. Если поэтому вы можете записать позицию в зарегистрируйтесь для последующего поиска (* note Сохранение позиций в регистре: RegPos.).
Ответ 8
Вы пробовали browse-kill-ring
?
Загрузите его из Emacswiki, поместите его в свой путь загрузки и добавьте его в свой emacs-conf:
(when (require 'browse-kill-ring nil 'noerror)
(browse-kill-ring-default-keybindings))
Затем, когда вы нажмете M-y, вам будет показано кольцо-убийца, обыщите его как обычный текст и т.д. Очень удобно. Существует также более практичная информация о emacs-fu о том, как использовать browse-kill-ring