Bearbeiten Sie in Emacs mehrere Zeilen gleichzeitig

71

Ich glaube, Textmate hat einen Modus, in dem, wenn Sie mit der Eingabe beginnen, in allen von Ihnen ausgewählten Zeilen dasselbe eingegeben wird. Gibt es etwas Ähnliches in Emacs? Ich vermute, es gibt eine Möglichkeit, wie Rechtecke mir helfen können, aber ich bin mir nicht sicher, wie ...

allyourcode
quelle
Sie sollten dies versuchen: github.com/magnars/mark-multiple.el Demo: youtube.com/watch?v=r2o9HYi7DOY
whunmr
Wenn Sie die Hilfehinweise dazu noch
einmal
Ja, @phils, multiple-cursors.el ist großartig.
Whunmr
Siehe auch: stackoverflow.com/questions/29719274
dreftymac

Antworten:

98

So einfach ist das: Cx rt

Einige Beispiele finden Sie hier: http://ergoemacs.org/emacs/emacs_string-rectangle_ascii-art.html

allyourcode
quelle
7
Das ist großartig, aber für jemanden, der Emacs noch nicht kennt, nicht sehr nützlich. Können Sie mir bitte helfen, dies zu entziffern?
Kegel
3
@cone Sie sollten das integrierte Emacs-Tutorial lesen. Es erklärt, wie man die Hieroglyphen liest;). Um das Tutorial in Emacs zu starten, drücken Sie 'h', während Sie die Strg-Taste gedrückt halten. Dann
drücken Sie
1
Ich habe C-xzum Schneiden zugeordnet (Cua-Modus), daher ist dies keine gute Idee.
MefiX
26
Vielleicht ist es Ihre Idee, Mapping C-xzu schneiden, was nicht gut ist :)
BartoszKP
Hinweis: Dieser Befehl ersetzt das ausgewählte Rechteck durch die angegebene Zeichenfolge, dh wählen Sie den Zeilenanfang aus, damit die Ersetzung funktioniert.
Anfänger
54

Sie müssen unbedingt versuchen, mehrere Cursor zu installieren:

https://github.com/magnars/multiple-cursors.el

Es ist in Marmelade und Melpa, also nur:

Mx-Paket installieren mehrere Cursor
Nic Ferrier
quelle
1
Dies ist eine gute Lösung. Sehr einfach zu bedienen. Fügen Sie (global-unset-key (kbd "M-<down-mouse-1>")) (global-set-key (kbd "M-<mouse-1>") 'mc/add-cursor-on-click)Ihrer Konfiguration hinzu , um eine Mehrfachauswahl durch Klicken hinzuzufügen (der Standard für den Verlust von Personen, einschließlich mir) .
Smonff
22

Eine der Lösungen ist der CUA-Modus. Aktivieren Sie den Cua-Modus mit M-x cua-mode, wählen Sie das Rechteck aus: Beginnen Sie zuerst C-Enterund bewegen Sie den Cursor mit den Standardbewegungsbefehlen, um die Auswahl zu treffen. Wenn Sie jetzt jederzeit die Eingabetaste drücken, wird der Cursor durch die Ecken des Rechtecks ​​bewegt, sodass Sie der Auswahl Text voranstellen oder anhängen können.

boskom
quelle
Danke, Boskom. Ich verwende Version 21.3.1, daher scheint dieser Modus nicht installiert zu sein. Ich werde es wahrscheinlich nicht installieren, weil ich finde, dass ich Cx r t mag.
Allyourcode
1
Vielen Dank! Ich dachte nur, der Cua-Modus sei für Leute gedacht, die Emacs Copy n Paste-Bindungen nicht lernen wollten: P Das ist großartig!
rflood89
2
Wenn Sie cua-selection-modeanstelle von verwenden cua-mode, erhalten Sie keine unerwünschten Bindungen zum Ausschneiden / Kopieren / Einfügen. Sie werden eine andere Funktionalität erhalten , dass Sie nicht wollen könnten, obwohl (vor allem, Editierbefehle die Region zu ersetzen).
Phils
21

Sie können die folgenden Befehle (und Tasten) verwenden, um dies zu erreichen:

  • offenes Rechteck (Cx, r, o) fügt Leerzeichen hinzu
  • Kill-Rechteck (Cx, r, k) löschen
  • klares Rechteck (Cx, r, c) durch Leerzeichen ersetzen
  • Mx String-Insert-Rechteck mit angegebenem Text füllen

Hier finden Sie eine vollständige Beschreibung dieser Funktionen: http://www.gnu.org/software/emacs/manual/html_node/emacs/Rectangles.html

paweloque
quelle
20

Für diejenigen unter Ihnen, die dies für kompliziertere Szenarien tun möchten und dies ohne Installation eines neuen Moduls tun möchten, lesen Sie bitte weiter. (Dies ist in Emacs möglich, ohne MarkMultiple zu installieren, obwohl ich MarkMultiple persönlich benutze und liebe.)

Ich musste kürzlich eine SQL-Abfrage in eine Datei ausgeben und sie dann in eine MYSQL INSERT-Abfrage formatieren. So hat Emacs mir das Leben leichter gemacht ...

Datei sieht aus wie:

1   I am a random text
2   I am not
3   G, you've gone mad
4   Click on this link
5   Transfer in progress (we've started the transfer process)
6   But transfer happend yesterday
7   No you are
8   Oh please! this is getting too much!
9   I love emacs
10  I cant be bothered with this any more
11  its time to raise the bar
12  show me how to expand my territory

Und ich möchte, dass es so aussieht:

(1,   ,'I am a random text'),
(2,   ,'I am not'),
(3,   ,'G, youve gone mad'),
(4,   ,'Click on this link'),
(5,   ,'Transfer in progress (weve started the transfer process)'),
(6,   ,'But transfer happend yesterday'),
(7,   ,'No you are'),
(8,   ,'Oh please! this is getting too much!'),
(9,   ,'I love emacs'),
(10,  ,'I cant be bothered with this any more'),
(11,  ,'its time to raise the bar'),
(12,  ,'show me how to expand my territory'),
  1. Platzieren Sie den Cursor in der ersten Zeile
  2. Drücken Sie C-x (, um die Aufnahme des Makros zu starten. [Zu diesem Zeitpunkt werden alle Tasteneingaben aufgezeichnet. Befolgen Sie daher die Anweisungen sorgfältig.]
  3. Drücken Sie C-a, um zum Zeilenanfang zu gelangen
  4. Geben Sie "(" gefolgt von M-fein Wort vorwärts ein und geben Sie dann "," ein
  5. C-num zur nächsten Zeile zu gelangen, gefolgt vom C-x )Beenden des Makros
  6. C-u 11 C-x e Wiederholen Sie das Makro n (in diesem Fall 11) Mal

Eureka! Wenn Sie nicht versagt haben, erhalten Sie jetzt etwas, das so aussieht:

(1,   I am a random text
(2,   I am not
(3,   G, youve gone mad
(4,   Click on this link
(5,   Transfer in progress (weve started the transfer process)
(6,   But transfer happend yesterday
(7,   No you are
(8,   Oh please! this is getting too much!
(9,   I love emacs
(10,  I cant be bothered with this any more
(11,  its time to raise the bar
(12,  show me how to expand my territory

An diesem Punkt überlasse ich es Ihnen, den Rest herauszufinden. Aber bevor ich gehe, möchte ich erwähnen, dass es einige Möglichkeiten gibt, so etwas zu erreichen. Dies ist nur einer dieser Wege und es ist zufällig mein Lieblingsweg.

Hoffe du fandest es hilfreich;)

Hamster
quelle
4

Ich glaube, Sie suchen nach dem von boskom vorgeschlagenen cua-Modus. http://www.vimeo.com/1168225?pg=embed&sec=1168225 Dieser Screencast gibt Ihnen möglicherweise eine Vorstellung davon, wie Sie dies verwenden können.

Amjith
quelle
Danke für den Link! Ein Bild sagt mehr als tausend Worte :).
Allyourcode
3

Rechtecke sind für einfache Dinge wie das Löschen der gleichen Anzahl von Leerzeichen in benachbarten Zeilen.

Ansonsten sind Tastaturmakros der richtige Weg.

Sternenblau
quelle
2

Die oben gezeigten Antworten dienen zum Einfügen von Text in Spalten. TextMates "Jede Zeile in Auswahl bearbeiten" fügt unabhängig von der Länge jeder Zeile denselben Text in jede Zeile ein. Ich lerne jetzt Lisp, also habe ich als Übung eine Funktion geschrieben, um dies zu tun:

(defun append-to-lines (text-to-be-inserted)
  ;;Appends text to each line in region
  (interactive "sEnter text to append: ")
  (save-excursion
    (let (point-ln mark-ln initial-ln final-ln count)
      (barf-if-buffer-read-only)
      (setq point-ln (line-number-at-pos))
      (exchange-point-and-mark)
      (setq mark-ln (line-number-at-pos))
      (if (< point-ln mark-ln)
          (progn (setq initial-ln point-ln final-ln mark-ln)
                 (exchange-point-and-mark))
        (setq initial-ln mark-ln final-ln point-ln))
      (setq count initial-ln)
      (while (<= count final-ln)
        (progn (move-end-of-line 1)
               (insert text-to-be-inserted)
               (next-line)
               (setq count (1+ count))))
      (message "From line %d to line %d." initial-ln final-ln ))))

Sie treffen zunächst eine Auswahl, die alle Zeilen enthält, die Sie beeinflussen möchten, und führen dann die Funktion mit Mx-Anhängen an Zeilen aus.

gdelfino
quelle
Ich habe das nicht getestet, aber gute Arbeit. Ich war mehr an dem Ansatz interessiert, "denselben Text zur selben Spalte hinzuzufügen", aber ich bin mir sicher, dass dies auch nützlich sein würde.
Allyourcode