EMACS: Как вырвать последний дерзкий текст независимо от последующих убийств?
Вопрос
Я часто нахожусь неоднократно что -нибудь после того, как сделал некоторые убийства, и это становится таким процессом:
- Сай
- Cy my
- Cy my my
- 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
Вместо этого, чтобы убить текст, возможно, связываю его с ключом, если вы хотите использовать его много.
Если вы хотите неоднократно дергать тот же текст, используйте Вторичный выбор вместо региона или убитого текста.
То, что не хватает в ванильных eMacs, является ключом, чтобы выдержать вторичный отбор. я использую
C-M-y
Для этого (см. Библиотекуsecond-sel.el
).Получить прямой доступ на любые убийства в кольце убийства, используйте
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'. Есть также поддержка руля.
предлагает больше решений.