Emacs: Как вернуть последний восстановленный текст независимо от последующих убийств? - PullRequest
30 голосов
/ 28 апреля 2011

Я часто обнаруживаю, что постоянно дергаю что-то после некоторых убийств, и это становится процессом вроде:

  1. C-у
  2. C-y M-y
  3. C-y M-y M-y
  4. С-у М-у, М-у, М-у

Каждый раз, когда я убиваю какой-то текст, он выталкивает первое уничтожение обратно в список уничтожений, так что мне нужно циклически проходить все убийства, чтобы вернуться к тексту, который я хочу вернуть. То, что я хочу сделать, это неоднократно дергать один и тот же текст, убивая текст между рывками. Это возможно?

Ответы [ 8 ]

20 голосов
/ 29 апреля 2011

Не используйте кольцо убийства; вместо этого поместите текст в регистр. C-x r s a для сохранения текста региона в (скажем) регистре «а»; затем C-x r i a, чтобы вставить его в другом месте.

18 голосов
/ 29 апреля 2011

Это странный взлом, но может помочь.

При первом использовании M-y вы обычно получаете сообщение об ошибке (без предыдущего рывка).Таким образом, идея заключается в том, что в первый раз вы получите последний рывок вместо последнего убийства.

Для сохранения этого последнего янка я использую регистр 'Y' в этом примере.будет обернуть вокруг янки и поп-музыки.Вы ожидаете ошибок, я ожидаю предложений.

(defun jp/yank (&optional arg)
  "Yank and save text to register Y"
  (interactive)
  (set-register ?Y (current-kill 0 t))
  (yank arg))

(defun jp/yank-pop (&optional arg)
  "If yank-pop fails, then insert register Y"
  (interactive)
  (condition-case nil
      (yank-pop arg)
    (error (insert (get-register ?Y)))))

(global-set-key (kbd "M-y") (quote jp/yank-pop))
(global-set-key (kbd "C-y") (quote jp/yank))
5 голосов
/ 28 апреля 2011

Вы можете использовать M-x delete-region вместо этого, чтобы убить текст, возможно связав его с ключом, если вы хотите использовать его много.

4 голосов
/ 27 июля 2014
  1. Если вы хотите неоднократно дергать один и тот же текст, используйте вторичный выбор вместо региона или убитого текста.

    Чего не хватает в ванильном Emacs - это ключевая привязка для восстановления вторичного выбора. Я использую C-M-y для этого (см. Библиотеку second-sel.el).

  2. Чтобы получить прямой доступ к любым убийствам в списке убийств, используйте M-y с Просмотр кольца убийств или с Сосульки . В обоих случаях M-y на верхнем уровне дает вам доступ ко всем записям в списке уничтожений.

    И если вы используете библиотеку second-sel.el, то, кроме кольца убийства, у вас есть доступ к кольцу ваших прошлых вторичных выборов.

    И если вы используете библиотеку second-sel.el и Сосульки , тогда M-y восстанавливает запись из кольца, с которого вы в последний раз дернули (кольцо убийства или кольцо вторичного выбора).

    А если вы используете библиотеку browse-kill-ring + .el , то браузер kill-ring также дает вам доступ к альтернативному кольцу (которое по умолчанию является кольцом вторичных выборов, если вы используете библиотека second-sel.el).

1 голос
/ 07 августа 2015

Лучшая реализация Yank-Pop

Определяет лучшую реализацию Yank-Pop, которая пытается решить проблему растущей yank-Pop.

Она только переопределяет функцию "current-kill",Из-за модульной конструкции переменных и функций yank, yank-pop и kill ring в Emacs оказывается, что переопределение «current-kill» - это все, что необходимо для получения желаемого поведения.

Желаемое поведение состоит в том, что (1) уничтожение чего-либо все еще помещает его впереди кольца уничтожения, но теперь (2) дергание или выдергивание чего-то также помещает его впереди кольца уничтожения (3) мы сохраняем способностьyank-pop, чтобы создать видимость перемещения по кольцу уничтожения, увеличивая глобальную переменную и используя ее, чтобы заменить последний элемент yank-pop'ped обратно туда, где он был.Это также означает, что (4) элементы, которые переходят назад (т. Е. Элементы, размещенные командами yank или yank-pop, где следующая команда - yank-pop), в конечном итоге остаются там, где они находятся в списке уничтожения.

;; Example:
;; (setq kill-ring '("a" "b" "c" "d" "e"))
;;
;; keystroke        kill ring contents              value of kill-ring-yank-index
;; C-y              ("a" "b" "c" "d" "e")           0
;; M-y              ("b" "a" "c" "d" "e")           1
;; M-y              ("c" "a" "b" "d" "e")           2
;; M-y              ("d" "a" "b" "c" "e")           3

;; C-y              ("d" "a" "b" "c" "e")           0
;; M-y              ("a" "d" "b" "c" "e")           1

;; M-d              ("x" "a" "d" "b" "c" "e")
;; etc.

код:

;; ----------------------------------------------------------------
;; helper functions

(defun list-insert-before (l n x)
  (if (<= n 0) (cons x l)
    (cons (car l) (list-insert-before (cdr l) (- n 1) x))))

(defun list-prepend-nth (l n)
  (if (<= n 0) l
    (let* ((lx (list-prepend-nth (cdr l) (- n 1))))
      (cons (car lx) (cons (car l) (cdr lx))))))

(defun list-insert-car-at (l n)
  (list-insert-before (cdr l) n (car l)))


;; ----------------------------------------------------------------
;; overriding current-kill

(defvar kill-ring-yank-index 0
  "Index into kill-ring of last yank-pop. The item yank-popped
  will be at the head of the kill ring, but if the next command
  is also yank-pop, it will be returned here first before this
  variable is incremented.")

(defun current-kill (n)
  "Replaces standard 'current-kill' function. This version tries
to fix the increasing yank-pop problem.

TODO:
- respect second argument of original function
- deal with 'interprogram-{cut,paste}-function'
"
  (if (eq 0 n) ;; looks like we're doing a yank; reset
               ;; kill-ring-yank-index to 0 to indicate that the
               ;; current head of the list is useful to the user
      (progn (setq kill-ring-yank-index 0)
             (car kill-ring))

    ;; otherwise put the head of kill-ring back where we had
    ;; previously found it, and fetch the next element
    (setq kill-ring
        (list-insert-car-at kill-ring kill-ring-yank-index))
    (setq kill-ring-yank-index (+ kill-ring-yank-index n))
    (when (>= kill-ring-yank-index (- (length kill-ring) 1))
      (setq kill-ring-yank-index (- (length kill-ring) 1))
      (message "Reached end of kill-ring"))
    (when (< kill-ring-yank-index 0)
      (setq kill-ring-yank-index 0)
      (message "Reached beginning of kill-ring"))
    (setq kill-ring (list-prepend-nth kill-ring kill-ring-yank-index))
    (car kill-ring)))

;; ----------------------------------------------------------------
;; new key binding

;; Here's an auxiliary function and key binding that makes it easy to
;; go back and forth in the kill-ring while we're yank-popping
(defun yank-pop-back () "" (interactive "*")
       (yank-pop -1))

(global-set-key "\C-\M-y" 'yank-pop-back)
1 голос
/ 27 ноября 2013

Я попытаюсь использовать delete-region больше, но я знаю команды kill лучше. Уловка, которая не требует программирования или предварительного планирования, состоит в том, чтобы использовать M-w после особенно раздражающей строки M-y. Это помещает более доступную копию последнего рывка в список уничтожений.

1 голос
/ 29 апреля 2011

Я пытаюсь взломать линию использования второстепенного режима. Давайте назовем это delete-mode. Как только вы войдете в режим удаления, команды kill (kill-line, kill-paragraph, kill-word, ...) изменят свое поведение, так что часть kill-region их команд будет заменена на delete-region, и новые материал не будет добавлен в список убийц. В этом режиме кольцо уничтожения будет оставаться постоянным. Когда вы возвращаетесь из этого режима, поведение возвращается к нормальному.

Ниже приведен неполный код , пытающийся реализовать то, что я написал выше. Он работает правильно при переключении в режим удаления, но у него есть проблемы с переключением обратно (отключение второстепенного режима). Любая помощь, исправляющая это, будет оценена.

(defvar delete-mode nil)

(defun delete-mode ()
    "delete minor-mode"
    (interactive)
    (setq delete-mode (not delete-mode))
    (if delete-mode
        (defalias 'kill-region 'delete-region)
        (defalias 'kill-region 'original-kill-region)
    )
)

(if (not (assq 'delete-mode minor-mode-alist))
    (setq minor-mode-alist
        (cons '(delete-mode "Delete mode on") minor-mode-alist)
    )
    (defalias 'original-kill-region 'kill-region)
)
0 голосов
/ 27 декабря 2017

Я использую

Mx browse-kill-ring

с привязкой клавиш 'M-y'.Также есть поддержка руля.

https://www.emacswiki.org/emacs/BrowseKillRing

предлагает больше решений.

...