So kopieren Sie getötete Rechtecke in den Tötungsring


11

Ich extrahiere häufig ein Textrechteck aus einem Puffer, finde dann aber heraus, dass ich den Text ziehen möchte, als wäre es kein Rechteck. Gibt es eine Möglichkeit, das aktuell getötete Rechteck zum Tötungsring hinzuzufügen?

Das GNU Emacs-Handbuch enthält Folgendes:

Ein Rechteck zu „töten“ bedeutet nicht, im üblichen Sinne zu töten. Das Rechteck wird nicht im Kill-Ring gespeichert, sondern an einem speziellen Ort, an dem nur das zuletzt getötete Rechteck aufgezeichnet wird. Dies liegt daran, dass sich das Ziehen eines Rechtecks ​​so stark vom Ziehen von linearem Text unterscheidet, dass verschiedene Ruckbefehle verwendet werden müssen. Yank-Popping ist für Rechtecke nicht definiert.

Grundsätzlich kann ich jedoch das gewünschte Verhalten erzielen

  • M-> Gehe zum Ende des Puffers
  • C-x r y Ruck Rechteck
  • C-x C-x Austauschpunkt und Markierung (wählt neu gezogene Linien aus)
  • C-w töte die Auswahl zum Kill Ring

Gibt es eine bessere Möglichkeit, ein getötetes Rechteck in einen Kill-Ring-Eintrag zu verwandeln?


Die Lösung verknüpft ist nicht das, was Sie gefragt, aber es reißt Rechtecken , wie Sie wollen: emacs.stackexchange.com/a/46352/15749
jue

Antworten:


6

Wenn ich Ihre Frage verstanden habe, suchen Sie nach so etwas:

(defun youngfrog/copy-rectangle-to-kill-ring (start end)
  "Saves a rectangle to the normal kill ring. Not suitable for yank-rectangle."
  (interactive "r")
  (let ((lines (extract-rectangle start end)))
    (with-temp-buffer
      (while lines ;; insert-rectangle, but without the unneeded stuff
        ;; (most importantly no push-mark)
        (insert-for-yank (car lines))
        (insert "\n")
        (setq lines (cdr lines)))
      (kill-ring-save (point-min) (point-max)))))

Mit freundlicher Genehmigung von ErgoEmacs


3

Sie sind sich nicht sicher, was das Besondere am Rechteck im Kill-Ring ist, aber wenn Sie auf Emacs-24.4 aktualisieren, können Sie Folgendes tun: C-x SPC .... M-wWählen Sie ein Rechteck aus und platzieren Sie es auf dem Kill-Ring. Danach C-ywird das Rechteck gezogen (im selben war das C-x r yauch).


Es gibt zwei Dinge am Kill Ring, die "besonders" sind. Das Wichtigste (für mich) ist die Art und Weise, wie Gegenstände aus dem Tötungsring gezogen werden. Einfach ausgedrückt, der Ruck verschiebt vorhandenen Text nach unten, anstatt ihn nach rechts zu verschieben. Die Verwendung des Kill-Rings hat auch den Nebeneffekt, dass der Verlauf des getöteten Textes beibehalten wird. Es klingt so, als ob 24.4 den zweiten Vorteil bietet, aber nicht den ersten.
Nispio

Ah, in diesem Fall verbessert das neue Verhalten von 24.4 den Teil, den Sie nicht interessieren.
Stefan

1

Ich war anfangs verärgert über das Fehlen einer integrierten Lösung für dieses Problem und stellte dann fest, dass es eine integrierte Lösung gab: Kill-Rechteck.

Angenommen, Sie haben Text wie

AAA BBBBBBBBB
AAA BBB
AAA BBBBBBB

Aber wollen Sie den 'B'-Teil des Textes woanders, wie zwischen diesen C- und D-Zeilen:

CCCCC
CCC
DDDD
DD

Wenn Sie das B-Rechteck ( C-x r M-w) kopieren und dann den Punkt auf das erste 'D' setzen und dann das Rechteck zurückziehen ( C-x r y), erhalten Sie am Ende

CCCCC
CCC
BBBBBBBBBDDDD
BBB      DD
BBBBBBB  

wo du wirklich wolltest

CCCCC
CCC
BBBBBBBBB
BBB
BBBBBBB
DDDD
DD

Es mag natürlich erscheinen, das Rechteck von 'B' zu kopieren und an die neue Position zu ziehen, aber eine bessere Lösung besteht darin, einfach die Linien 'A' und 'B' zu kopieren und sie in ihrer Gesamtheit zwischen 'C' und 'zu ziehen. D 'Linien.

Markieren Sie dann das Rechteck mit den 'A' und verwenden Sie kill-rectangle( C-x r k), um mit dem gewünschten Ergebnis zu enden.

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.