EMACS: Wie kann man den letzten geschleuderten Text unabhängig von nachfolgenden Kills geschleudert?

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

  •  26-10-2019
  •  | 
  •  

Frage

Ich finde mich oft wiederholt, nachdem ich einige Kills gemacht habe, und es wird zu einem Prozess wie:

  1. Cy
  2. Cy my
  3. Cy mein meine
  4. Cy mein meine mein meine

Jedes Mal, wenn ich einen Text töte, drückt es den ersten Kill zurück in den Kill -Ring, damit ich alle Kills durchqueren muss, um zum Text zurückzukehren, den ich öfen möchte. Was ich tun möchte, ist wiederholt den gleichen Text zu rücken, während ich Text zwischen Yanks tötet. Ist das möglich?

War es hilfreich?

Lösung

Dies ist ein seltsamer Hack, kann aber helfen.

Das erste Mal, dass Sie verwenden M-y Normalerweise erhalten Sie einen Fehler (kein früherer Yank). Die Idee ist also, dass Sie dieses erste Mal den letzten Ruck bekommen, anstatt den letzten Kill.

Um diesen letzten Yank zu speichern, verwende ich in diesem Beispiel das 'Y' -Register.

Diese 2 Funktionen würden sich um Yank und Yank-Pop wickeln. Sie erwarten Fehler, ich erwarte Vorschläge.

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

Andere Tipps

Verwenden Sie den Kill Ring nicht; Geben Sie den Text stattdessen in ein Register ein. C-x r s a Um den Text der Region in (sagen wir) Registrieren "a" zu speichern; dann C-x r i a um es woanders einzufügen.

Du könntest benutzen M-x delete-region Um den Text abzutöten und ihn möglicherweise an einen Schlüssel zu binden, wenn Sie ihn viel verwenden möchten.

  1. Wenn Sie wiederholt den gleichen Text erziehen möchten, verwenden Sie die Sekundärauswahl anstelle der Region oder getöteten Text.

    Was bei Vanille -EMACs fehlt, ist eine Schlüsselbindung an die sekundäre Auswahl. ich benutze C-M-y dafür (siehe Bibliothek second-sel.el).

  2. Bekommen direkter Zugang Verwenden Sie zu allen Kills im Kill Ring M-y mit Durchsuchen Sie den Ring oder mit Eiszapfen. In beiden Fällen, M-y Auf der oberen Ebene erhalten Sie Zugriff auf alle Einträge im Kill -Ring.

    Und wenn Sie Bibliothek verwenden second-sel.el Zusätzlich zum Kill -Ring haben Sie Zugang zu einem Ring Ihrer früheren sekundären Auswahl.

    Und wenn Sie Bibliothek verwenden second-sel.el und Eiszapfen dann M-y Ruckt ein Eintrag vom Ring, von dem Sie zuletzt ausgerissen wurden (Ring Ring oder Secondary Selection Ring).

    Und wenn Sie Bibliothek verwenden Durchsuchen Sie-Kill-Ring+.el Anschließend erhalten Sie im Kill-Ring-Browser auch Zugriff auf einen alternativen Ring (der standardmäßig der Ring der sekundären Auswahl ist, wenn Sie die Bibliothek verwenden second-sel.el).

Ich versuche, mich entlang der Linie eines kleinen Modus zu hacken. Nennen wir das delete-mode. Sobald Sie in den Löschmodus eingestiegen sind, töten Sie Befehle (kill-line, kill-paragraph, kill-word, ...) wird ihr Verhalten so ändern, dass die kill-region Ein Teil ihrer Befehle wird durch ersetzt durch delete-region, und neues Material wird dem Kill -Ring nicht hinzugefügt. In diesem Modus bleibt der Kill -Ring konstant. Wenn Sie aus diesem Modus zurückschalten, kehrt das Verhalten wieder normal.

Das Folgende ist ein unvollständiger Code Versuch, das, was ich oben geschrieben habe, umzusetzen. Es funktioniert korrekt beim Umschalten in den Löschmodus, hat jedoch ein Problem mit dem Zurückschalten (den kleinen Modus ausschalten). Jede Hilfe bei der Behebung dieses würde geschätzt.

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

Ich werde versuchen, mehr Löschregion zu verwenden, aber ich weiß, dass die Kill-Befehle besser sind. Ein Trick, der keine Programmierung oder Vorabplanung erfordert, besteht darin, MW nach einer besonders nervigen Schnur von mir zu verwenden. Dies bringt eine zugängliche Kopie des Final Yank in den Kill -Ring.

Eine bessere Implementierung von Yank-Pop

Dies definiert eine bessere Yank-Pop-Implementierung, die versucht, das zunehmende Jank-Pop-Problem zu beheben.

Es überschreibt nur die Funktion "Strom-Kill". Aufgrund des modularen Designs von Yank-, Yank-Pop- und Kill-Ring-Variablen und -funktionen in EMACs stellt sich heraus, dass das Überschreiben von "Strom-Kill" alles ist, was notwendig ist, um das gewünschte Verhalten zu erhalten.

Das gewünschte Verhalten ist, dass (1) etwas, das etwas tötet Yank-Pop, um das Erscheinungsbild des Kill-Rings zu verleihen, indem eine globale Variable inkrementiert und das letzte Yank-Pop-Element dort ersetzt wird, wo es sich befand. Dies bedeutet auch, dass (4) Elemente, die transitional geleitet werden (dh von Yank- oder Yank-Pop-Befehlen platziert werden, wobei der nächste Befehl ein Yank-Pop ist) letztendlich dort bleiben, wo sie sich im Kill-Ring befinden.

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

der Code:

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

ich benutze

MX Browse-Kill-Ring

mit Schlüsselbindungen 'M-y'. Es gibt auch Helmunterstützung.

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

Bietet mehr Lösungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top