Ziehen Sie eine Textspalte aus der Zwischenablage

7

Ich möchte oft kopieren und mehrere Spalten einfügen, zum Beispiel eine Spalte einfügen

line one
line two
line three

Jetzt möchte ich eine weitere Säule dahinter ziehen können. Angenommen, mein Kill-Puffer hat Folgendes:

added to one
added to two
added to three

Welchen Befehl müsste ich aufrufen, um Folgendes zu erhalten:

line one added to one
line two added to two
line three added to three

Aktualisieren

Die Verwendung der Rechteckfunktionalität von Emacs hilft einiges, ist aber immer noch nicht optimal. Wenn Sie beispielsweise Emacs im grafischen Modus verwenden und aus externen Programmen ziehen, dh die Copy-Paste-Funktion Ihres Betriebssystems verwenden, verfügt der Kill-Buffer über keine rechteckigen Metainformationen, sodass das rechteckige Ziehen nicht funktioniert. Ein weiteres Problem ist, wenn Sie Spalten mit unterschiedlicher Innenbreite haben:

short line                        *
a much larger line which goes on
short line again

Und wenn Sie einen rechteckigen Ruck haben möchten, müssen Sie Ihren Zeiger an der markierten Stelle (*) platzieren. Obwohl dies mit drei Zeilen trivial ist, kann es ziemlich umständlich sein, sicherzustellen, dass Sie den Zeiger am äußersten Rand der ersten Spalte platzieren.

hbogert
quelle
Ich bin mir nicht ganz sicher, ob ich das verstehe, aber ich denke, Sie möchten mit Rechtecken arbeiten .
Dan
Ich bin mir nicht sicher, ob es eine einfache Antwort darauf gibt. Sobald der Text in die Zwischenablage kopiert wurde, gingen alle Informationen zu Spalten verloren. Ich denke, Sie müssten wahrscheinlich etwas außerhalb von Emacs tun, um diese "Spalten" -Informationen zu erhalten.
Drew
Wenn ich nur besser mit elisp umgehen könnte, würde ich erwarten, dass dies nur ein paar Zeilen sind, aber tatsächlich erwartet, dass dies eine existierende Funktion ist
hbogert
Sie können dies mit einem Makro ziemlich einfach tun. Ziehen Sie Ihren zweiten Spaltentext unter den ersten Spaltentext. Zeichnen Sie dann ein Makro auf, das den obersten Wert der Daten der zweiten Spalte an das Ende der ersten Zeile der Daten der ersten Spalte verschiebt. Verschiebt dann den nächsten Wert der Daten der zweiten Spalte nach unten und führt ihn aus, bis alle übereinstimmen.
Jordon Biondo

Antworten:

5

Hier ist ein einmaliger Befehl, mit dem Sie jede Zeile des aktuellen Kill am Ende jeder nachfolgenden Zeile ab der aktuellen Zeile ziehen können.

(defun yank-append-lines (&optional without-space)
  "Yank each line of the current kill at the end of each subsequent line.

A space will be added between each line unless WITHOUT-SPACE which can
be passed in via a prefix arg."
  (interactive "P")
  (save-excursion
    (let ((lines (split-string (current-kill 0) "\n")))
      (dolist (line lines)
        (goto-char (line-end-position))
        (unless without-space
          (just-one-space))
        (insert line)
        (unless (zerop (forward-line))
          (insert "\n"))))))

Die Implementierung ist ziemlich einfach. Nehmen Sie das current-kill, teilen Sie es nach Linien. Dann für jede Trennlinie: Gehen Sie zum Ende der Trennlinie, fügen Sie ein Leerzeichen ein, fügen Sie eine Linie ein und bewegen Sie sich dann eine Zeile vorwärts.

Dies könnte auch mit einem wiederholbaren Makro erfolgen, das eine Zeile von einer Stelle im Puffer zum Ende einer Zeile in einem anderen Teil des Puffers verschiebt.

Jordon Biondo
quelle