Emacs: Wie lösche ich Text ohne Kill Ring?


80

Ich möchte nur einen Text löschen , damit ich einen anderen Text zerren kann anstelle davon. Wie kann ich das machen? Cw schneidet den ausgewählten Text, um den Ring zu töten, und ich lande ohne den Text, den ich ziehen wollte.

Ist es auch möglich, Text direkt anstelle von Text zu ziehen, ohne die Tasten zu drücken, um ihn zu beenden ?



2
Siehe meine Antwort unten, Sie können die Rücktaste auf der Tastatur für die 1. Frage verwenden, Text für die 2. Frage markieren
Kevin Zhu

Ist es nicht nur Cx rk, nachdem Sie Ihren Block definiert haben?
Yalu2015

Antworten:


49

Ich tippe M-x delete-regionziemlich oft, aber Sie können es an einen Schlüssel binden.

Mit dem Auswahlmodus Löschen in neueren Versionen von Emacs müssen Sie keinen Befehl eingeben, sondern müssen nur Folgendes eingeben:

Standardmäßig erfolgt das Einfügen von Text normalerweise auch dann, wenn die Marke aktiv ist. Wenn Sie beispielsweise a eingeben, wird das Zeichen 'a' eingefügt und die Marke dann deaktiviert. Der Auswahlmodus "Löschen", ein Nebenmodus, ändert dieses Verhalten: Wenn Sie diesen Modus aktivieren, wird beim Einfügen von Text bei aktivierter Markierung der Text in der Region zuerst gelöscht. Außerdem löschen Befehle, die normalerweise nur ein Zeichen löschen, wie z. B. C-doder DEL, stattdessen die gesamte Region. Geben Sie ein, um den Auswahlmodus Löschen ein- oder auszuschaltenM-x delete-selection-mode.


33
Mit der neuesten Version von Emacs müssen Sie sich nicht einmal delete-regionan einen Schlüssel binden , da Backspace dies jetzt tut. Die Rücktaste löscht die ausgewählte Region, anstatt sie zu beenden. Mit anderen Worten, die Rücktaste löscht den ausgewählten Text, ohne ihn zu speichern / in den Tötungsring zu verschieben. Dies liegt daran, dass der Wert von delete-active-regionist, tes sei denn, Sie passen ihn an einen anderen Wert an.
Jisang Yoo


20

Ich hatte das gleiche Problem. Das Nächste, was ich bisher habe, ist, nur eine kleine Funktion zu erstellen, die im Wesentlichen:

(defun ruthlessly-kill-line ()
  "Deletes a line, but does not put it in the kill-ring. (kinda)"
  (interactive)
  (move-beginning-of-line 1)
  (kill-line 1)
  (setq kill-ring (cdr kill-ring)))

1
Warum nicht einfach (Löschbereich (Zeilenanfangsposition) (Zeilenendposition))?
CodyChan

Die aufgelistete Funktion klang gut, funktionierte aber im Allgemeinen nicht für mich. Insbesondere stellte ich fest, dass der Ruck-Zeiger auf das andere Ende des Kill-Rings zeigen würde, was im Allgemeinen (eigentlich fast immer?) Nicht das nächste Element auf der Liste ist! (Ich versuche immer noch, eine Funktion zu hacken, die zuverlässig über die Delegierung an `kill-line 'funktioniert ... vielleicht
greife

11

Entnommen aus dem EmacsWiki :

Das Äquivalent von ‘kill-line’( ‘C-k’), jedoch ohne Kill-Ring-Nebenwirkungen:

(delete-region (point) (line-end-position))

Beste Antwort IMO. Und ich habe Strg-Umschalt-W gebunden, um die Region zu löschen: (Global-Set-Key (kbd "CSw") 'Region löschen)
Tongfa

5

Mx eval-expression (setq kill-ring (cdr kill-ring)) - Entfernt den letzten Gegenstand aus dem Kill-Ring


Das macht es nur für die aktuelle Sitzung komisch. Außerhalb von Emacs wird es nicht aus dem Kill Ring entfernt!
PascalVKooten


3

Ich habe eine Antwort darauf gefunden.

Hat es zuerst hier gepostet .

;; Ctrl-K with no kill
(defun delete-line-no-kill ()
  (interactive)
  (delete-region
   (point)
   (save-excursion (move-end-of-line 1) (point)))
 (delete-char 1)
)
(global-set-key (kbd "C-k") 'delete-line-no-kill)

Das Problem ist, dass dieser Befehl immer auch die neue Zeile löscht, während kill-line die neue Zeile nur löscht, wenn der Wert der Variablen kill-ganze Zeile nicht Null ist. Es wäre besser, das "(delete-char 1)" in "(wenn die ganze Zeile töten (delete-char 1))" zu ändern.
Alan

3

Die meisten Kill-Funktionen verwenden kill-regiondie eigentliche Arbeit zum Töten von Text. Ich benutze ein Lisp-Makro, um Löschfunktionen aus Kill-Funktionen zu erstellen.

(defmacro jpk/delete-instead-of-kill (&rest body)
  "Replaces `kill-region' with `delete-region' in BODY."
  `(cl-letf (((symbol-function 'kill-region)
              (lambda (beg end &optional yank-handler)
                (delete-region beg end))))
     ,@body))

(defun jpk/delete-word (arg)
  "Like `kill-word', but does not save to the `kill-ring'."
  (interactive "*p")
  (jpk/delete-instead-of-kill (kill-word arg)))

Wie funktioniert es? Haben Sie weitere Informationen dazu? Das ist großartig.
Sinuskonata

cl-letfkann eine lokale Bindung einer Funktion mit dynamischem Bereich erstellen. Das heißt, es gilt nur für Code innerhalb von cl-letf, aber es gilt für den gesamten Aufrufbaum (z. B. kill-regionerscheint nicht direkt in body, sondern kill-wordruft auf kill-regionund das wird durch ersetzt delete-region).
jpkotta

Sie können die ursprüngliche Funktion sogar von ihrem Ersatz aus aufrufen, wenn Sie sie zuerst an einen anderen Namen in der Datei binden cl-letf. cl-letffunktioniert wie let*in diesem Sinne.
jpkotta

2

Technisch gesehen sind die anderen Antworten im ersten Teil falsch.

Hier ist meine Umsetzung und Motivation:

(defun delete-word (arg)
  "Delete characters backward until encountering the beginning of a word.
With argument ARG, do this that many times."
  (interactive "p")
  (delete-region (point) (progn (backward-word arg) (point))))

Ich habe den Code hier von "kill-word " insimple.el . Ich habe kill-regionmit delete-regionund forward-wordfür gewechselt backward-word. Auf diese Weise wirkt es sich WIRKLICH nicht auf die aus kill-ring, im Gegensatz zu den anderen Situationen, in denen ich außerhalb von Emacs bemerkte, dass das kill-ringbeeinflusst wurde.


2
Ich bevorzuge diese Antwort, weil sie das Einfügen aus der OS-Zwischenablage nicht vermasselt (wo das Löschen des letzten Dings aus dem Kill-Ring nicht hilft, weil das, was sich in der OS-Zwischenablage befindet, verloren geht)
Brel

Schauen Sie sich meine Antwort an, um dies zu tun, ohne die Definition der Kill-Funktion zu kopieren.
jpkotta

1
(defun copy-to-register-z (p1 p2)
  "Copy text selection to register named “z”."
  (interactive "r")
  (copy-to-register ?z p1 p2))
(defun replace-register-content-z (p1 p2)
  "Replace register named “z”'s content."
  (interactive "r")
  (delete-region p1 p2)
  (insert-register ?z))
(global-set-key (kbd "C-c c") 'copy-to-register-z)
(global-set-key (kbd "C-c v") 'replace-register-content-z)

Ich mag das, aber weil ich keinen Transient Mark-Modus verwende, bevorzuge ich ein "Insert-Register-Content-Z" mit allen außer der Delete-Region-Zeile.
Joshua Goldberg

1

Fügen Sie wie folgt ein Löschäquivalent der Kill-Region- und Kill-Line-Schlüssel Cw und Ck hinzu. Gebunden an die Tasten Cv und Cz.

;; Eine Tastenkombination für den Löschbereich ergibt ein gutes "Windows CUT Ctrl-x-Äquivalent".
;; Welche Tastenkombination verwendet werden soll, ist umständlich zu wählen.
;; Die Verwendung von "Windows PASTE Ctrl-v" ist eine ziemlich subversive Option.
;; Cv = in Emacs nach oben scrollen, für die ich keine Verwendung habe.
(Global-Set-Key (kbd "Cv") 'Löschbereich)

;; Um auch eine "Windows CUT" -Alternative zu Ck (Kill-Line) zu haben, können Sie Folgendes tun:
(defun delete-line () "Zeile löschen, aus dem Kill Ring nehmen. Diese Funktion an Cz binden"
 (interaktiv)
 (setq last-command 'delete-line)
 (Kill-Line)
 (setq kill-ring (cdr kill-ring))
 (setq kill-ring-yank-pointer kill-ring)
 (setq last-command 'delete-line)
)
(global-set-key (kbd "Cz") 'Zeile löschen)
;; ohne Einstellung des letzten Befehls 2+ C-zs den Kill-Ring durcheinander bringen

1

Meine Antwort auf die erste Frage: Markieren Sie den Text in Emacs (entweder mit der Maus oder mit der Markierung C-SPC) und drücken Sie stattdessen die Taste "<- Rücktaste" auf der Tastatur C-w. Auf diese Weise können Sie weiterhin Text in die Zwischenablage des Systems einfügen, ohne befürchten zu müssen, dass die Zwischenablage durch Text überschrieben wurde, der von getötet wurdeC-w

Hintergrund für diese Antwort: Manchmal, wenn ich Text außerhalb von Emacs erhielt, mit dem ich einen Bereich in Emacs ersetzen möchte, habe ich oft einen Fehler gemacht, indem ich diesen Text zuerst in die System-Zwischenablage (dh unter Windows Ctrl + C) kopiert und dann C-win Emacs nach " lösche "den Textbereich, den ich ersetzen möchte, mit der Hoffnung, dass ein späterer M-wmeinen Text in der Zwischenablage aus dem Kill-Ring wiederherstellen kann. Leider würde die Zwischenablage einfach durch Text überschrieben, der von getötet wurde C-w, und die ursprüngliche Nachricht in der Zwischenablage würde niemals im Kill-Ring angezeigt.

Bei der zweiten Frage können Sie den Text immer zuerst und dann direkt in Emacs markieren C-y


0

Hier ist eine Version davon kill-region, die keine Werte in den Kill-Ring zwingt.

(defun kill-or-delete-region (beg end prefix)
  "Delete the region, storing it in the kill-ring.
If a prefix argument is given, don't change the kill-ring."
  (interactive "r\nP")
  (if prefix
      (delete-region beg end)
    (kill-region beg end)))

(global-set-key (kbd "C-w") 'kill-or-delete-region)

Auf diese Weise können Sie C-wwie zuvor C-u C-wvorgehen , aber jetzt Text löschen, ohne den Kill-Ring zu ändern.


0

Wie lösche ich Text ohne Kill Ring?

Die delete-regionFunktion löscht die ausgewählte Region, ohne sie dem Kill-Ring hinzuzufügen

Ist es auch möglich, Text direkt anstelle von Text zu ziehen, ohne die Tasten zu drücken, um ihn zu beenden?

Ich denke, Sie fragen sich, wie Sie den Text in einer ausgewählten Region durch etwas ersetzen können, das Sie bereits auf den Kill Ring gesetzt haben.

Mit der Einstellung (delete-selection-mode 1)können Sie über einen ausgewählten Bereich ziehen / einfügen. Sie können damit auch nur eine ausgewählte Region eingeben und ersetzen.

In Version 25.1.1 unter OS XI musste außerdem hinzugefügt werden (setq select-enable-primary nil), um zu verhindern, dass die ausgewählte Region in den Kill Ring kopiert wird

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.