EMACS: Как вырвать последний дерзкий текст независимо от последующих убийств?

StackOverflow https://stackoverflow.com/questions/5823495

  •  26-10-2019
  •  | 
  •  

Вопрос

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

  1. Сай
  2. Cy my
  3. Cy my my
  4. Cy my my

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

Это было полезно?

Решение

Это странный хак, но может помочь.

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

Для хранения этого последнего янка я использую регистр «Y» в этом примере.

Эти 2 функции будут обернуться вокруг янка и янка. Вы ожидаете ошибок, я ожидаю предложений.

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

Другие советы

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

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

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

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

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

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

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

    И если вы используете библиотеку Просмотр-Kill-Ring+.el Затем браузер Kill-Ring дает вам также доступ к альтернативному кольцу (которое по умолчанию является кольцом вторичных выборов, если вы используете библиотеку second-sel.el).

Я пытаюсь взломать линию использования незначительного режима. Назовем это delete-mode. Анкет Как только вы попадете в режим удаления, убить команды (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)
)

Я постараюсь использовать Delete-Region больше, но я лучше знаю команды убийства. Хитрость, которая не требует программирования или предварительного планирования, состоит в том, чтобы использовать MW после особенно раздражающей строки моей. Это ставит более доступную копию последнего янка в кольцо убийства.

Лучшая реализация янка-попа

Это определяет лучшую реализацию янка, которая пытается решить растущую проблему янка.

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

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

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

я использую

MX Обзор-Kill-Ring

с ключом 'm-y'. Есть также поддержка руля.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top