Angenommen, ich habe bereits Text im aktuellen Puffer ausgewählt. Ist es möglich, einen anderen Textabschnitt auszuwählen, während die vorherige Auswahl beibehalten wird (und so weiter)?
Hinzugefügt : Eine Motivation für diese Funktionalität ist wie folgt: Angenommen, ich habe einen Text, der so aussieht:
paragraph 1 ...
paragraph 2 ...
paragraph 3 ...
paragraph 4 ...
paragraph 5 ...
Ich möchte einige Absätze (zB 2, 4 und 6) entfernen und vor Absatz 1 einfügen.
multiple-cursors
können Sie eine Lösung finden.Antworten:
Sie können
append-next-kill
(C-M-w
standardmäßig gebunden ) verwenden, um den Text zu akkumulieren, den Sie oben einfügen möchtenparagraph 1
:Töte,
paragraph 2
wie du es normalerweise tun würdest.Markieren
paragraph 4
und drücken,C-M-w
bevor Sie es töten. Wiederholen Sie diesen Schritt für alle Absätze, die Sie zuvor verschieben möchtenparagraph 1
.Wenn Sie fertig sind, können Sie den angesammelten Text vorher abreißen
paragraph 1
.quelle
Sie können Register verwenden, die mit dem Markierungsring kombiniert sind. Schieben Sie die aktuellen Markierungen mit
C-<SPC> C-<SPC>
, stellen Sie sie später mit wieder herC-u C-<SPC>
oder speichern Sie sie in einem Register, sagen wirb
überC-x r <SPC> b
, und springen Sie später mit zurückC-x r j b
.Markieren Sie nun eine andere Region.
C-u C-x r s a
kopiert den markierten Bereich zum Registrierena
und löscht den Text. Markieren Sie dann die nächste Region undC-u C-x r + a
fügen Sie diesem Register eine weitere Auswahl hinzua
und löschen Sie sie.Sie können den Inhalt dann mit einfügen
C-x r i a
.Weitere Informationen finden Sie im Abschnitt "Speichern von Text in Registern" im Emacs-Handbuch.
quelle
Die neue Rechteck-Region Unterstützung in Emacs-24.4 tatsächlich eingeführt (ein großen Teil davon) die Infrastruktur für diese Funktion benötigt [schließlich ein rechteckiger Bereich ist eine nicht zusammenhängende Region].
Daher sollte es jetzt möglich sein, ein "Split-Region" -Paket zu implementieren, das genau die Funktionalität bietet, die Sie sich wünschen.
Zugegeben, viele Emacs-Befehle wurden noch nicht an die neue Infrastruktur angepasst (z. B. Befehle wie Groß- / Kleinschreibung oder Rückgängigmachen in der Region, Abfragen ersetzen, ...) und funktionieren daher noch nicht ordnungsgemäß für Rechtecke (Also würden sie auch in einer "Split-Region" nicht richtig funktionieren), aber dies sind Fehler, die hoffentlich im Laufe der Zeit behoben werden sollten.
quelle
Installieren Sie browse-kill-ring.el
Kopieren und töten Sie alle Regionen von Interesse.
Ich muss zeigen, wo das erneute Einfügen beginnen soll.
M-x
browse-kill-ring
RET öffnet einen Puffer und setzt den Cursor hinein.Typ n, um Stücke zu reisen.
RET Dort wird der Block an der Stelle in den ursprünglichen / anderen Puffer eingefügt.
quelle
Wenn die Linien wollen Sie über eine Regex zu unterscheiden manipulieren, können Sie auftreten-Modus in einem neuen Fenster zu sehen. Sie können sie dann im Bearbeitungsmodus bearbeiten, wobei der ursprüngliche Puffer die Änderungen widerspiegelt, die Sie im Ereignispuffer vorgenommen haben.
Dies funktioniert wunderbar, zum Beispiel in Kombination mit dem Mehrfach-Cursor-Modus : Da die Zeilen, die Sie für den Occur-Puffer ausgewählt haben, fortlaufend angezeigt werden, unabhängig davon, wie weit sie sich im ursprünglichen Puffer befinden, können Sie alle markieren oder eine Untergruppe und aktivieren
mc/edit-lines
und bearbeiten Sie sie dann alle auf einmal. (Ja, ich weiß, dass mehrere Cursor dies alles für sich tun könnenmc/mark-all-like-this
, aber es ist schön, Optionen zu haben.)Alle anderen Bearbeitungsvorgänge, die einfacher wären, wenn Sie nur die Zeilen sehen würden, an denen Sie arbeiten möchten, z. B. das Einrichten einer komplizierten Suche und Ersetzung von regulären Ausdrücken oder ein Makro, das nacheinander in jeder Zeile eines Puffers ausgeführt werden muss. kann auch so gemacht werden.
quelle
Dies beantwortet Ihre allgemeine Frage, nicht jedoch den von Ihnen erwähnten Anwendungsfall (Verschieben von Code).
Emacs hat jetzt eine so genannte nicht zusammenhängende Region. Dies ist die Art von Auswahl, nach der Sie fragen. Vanilla Emacs bietet keine spezielle Möglichkeit, eine nicht zusammenhängende Region zu erstellen, es sei denn, es handelt sich um ein Rechteck . Aber Library Zones tut es.
Mit Bibliothekszonen können Sie mehrere Zonen in Ihrem Puffer definieren. Eine Zonenliste ist eine nicht zusammenhängende Region . Sie können es sich auch als mehrere Regionen vorstellen, je nachdem, wie Sie es nutzen möchten. Sie können jederzeit mehrere Zonenlisten definieren, die jeweils einer anderen Zonenvariablen zugewiesen sind, und zwischen diesen wechseln.
Wenn Sie auch die Bibliothek Bookmark + verwenden , können Sie Listen von Zonen dauerhaft speichern und in späteren Emacs-Sitzungen wiederherstellen. Mit Lesezeichen + können Sie einem Lesezeichen auch beliebige Tags zuweisen. Dies bedeutet, dass Sie eine Liste von Zonen kennzeichnen können.
Die Zonen in einer bestimmten Zonenliste befinden sich normalerweise im selben Puffer, müssen es aber nicht sein. In diesem Fall ist eine Zonenliste allgemeiner als eine nicht zusammenhängende Region. Allgemeiner ist auch, dass jede Zone neben den Zonengrenzen zusätzliche Informationen und eine Kennung enthalten kann.
Es gibt verschiedene Möglichkeiten, eine Zone zu erstellen. Eine der einfachsten ist die Verwendung
C-x n a
: Sie definiert eine Zone aus der aktiven Region und fügt sie dem aktuellen Zonensatz hinzu. (C-x n n
(narrow-to-region
) tut dies zusätzlich zur Verengung auch.)Dies sind einige der Dinge, die Sie mit einer Reihe (Liste) von Zonen tun können:
facemenu+.el
.Siehe auch Narrow Indirect , mit dem Sie indirekte Puffer erstellen können , die Klone eines bestimmten Puffers sind und die auf verschiedene Teile dieses Puffers beschränkt sind.
quelle
Eine weitere Option: Absätze transponieren
Der Vollständigkeit halber können Sie die Absätze (nacheinander) mit markierten Bereichen neu anordnen und
M-0 M-x transpose-paragraph
(durch das Null-Argument werdentra-par
die Absätze vertauscht, in denen Punkt und Markierung enthalten sind, dh der Bereich beginnt und endet)!Dies funktioniert übrigens für alle
transpose-.*
Befehle (-words, -sexp, -sentences, ...) und ist in vielen Situationen äußerst praktisch.quelle
Eine andere Möglichkeit ist, das objed- Paket zu verwenden (ich bin der Autor). Sie können jedes Textobjekt markieren, mit dem
m
der Punkt automatisch zum nächsten Objekt des aktuellen Typs verschoben wird. Heben Sie die Markierung eines Objekts auf, indem Sie dorthin navigieren, und drücken Sie erneut m. Hier ist ein Beispiel-Screencast (zeigt Markierungslinien, funktioniert aber auch für andere Objekte wie Absätze, Defuns ...):quelle
package-install-from-archive: http://melpa.milkbox.net/packages/objed-20181201.1346.tar: Not found
.M-x package-refresh-contents
und dannM-x package-install
.