Wie wählt man nicht zusammenhängende Regionen in Emacs aus?

31

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.

Name
quelle
1
Es gibt eine sekundäre Auswahl .
Wasamasa
2
Es gibt ein Paket multiselect: skamphausen.de/cgi-bin/ska/multiselect Es sieht ein bisschen nach einem schnellen Hack aus.
Tobias
Je nachdem, welche Größe Sie auswählen und warum, multiple-cursorskönnen Sie eine Lösung finden.
Jordon Biondo
@wasamasa Ich habe die Anweisungen in dem von Ihnen angegebenen Link befolgt. Nach der ersten Auswahl habe ich die zweite Region ausgewählt, in der ich den Meta-Schlüssel behalten habe. Es wurde ausgewählt, aber es gibt zwei Probleme: (1) Die zweite Auswahl scheint keine echte Auswahl zu sein, da das Kopieren oder Löschen nicht funktioniert. (2) Es ist nicht möglich, auf diese Weise eine dritte Auswahl zu treffen.
Name
1
Das Emacs-Wiki bietet einen guten Abschnitt über die Sekundärauswahl . Verschiedene Verbesserungen machen es beispielsweise über die Tastatur benutzerfreundlicher.
Drew

Antworten:

43

Sie können append-next-kill( C-M-wstandardmäßig gebunden ) verwenden, um den Text zu akkumulieren, den Sie oben einfügen möchten paragraph 1:

  1. Töte, paragraph 2wie du es normalerweise tun würdest.

  2. Markieren paragraph 4und drücken, C-M-wbevor Sie es töten. Wiederholen Sie diesen Schritt für alle Absätze, die Sie zuvor verschieben möchten paragraph 1.

Wenn Sie fertig sind, können Sie den angesammelten Text vorher abreißen paragraph 1.

itsjeyd
quelle
5
Auch mit den grundlegenden Sachen gibt es immer ein paar neue Dinge zu lernen! Dies ist ziemlich nützlich, da ich normalerweise viel Tastendruck vergeude, indem ich den Kill-Ring bewege, wenn ich das tun muss. Ich wünschte, ich könnte dies noch etwas verbessern ...
Sinnvoller Benutzername
9

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 her C-u C-<SPC>oder speichern Sie sie in einem Register, sagen wir büber C-x r <SPC> b, und springen Sie später mit zurück C-x r j b.

Markieren Sie nun eine andere Region. C-u C-x r s akopiert den markierten Bereich zum Registrieren aund löscht den Text. Markieren Sie dann die nächste Region und C-u C-x r + afügen Sie diesem Register eine weitere Auswahl hinzu aund 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.

Andrew Swann
quelle
5

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.

Stefan
quelle
4

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.

Andreas Röhler
quelle
3

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-linesund bearbeiten Sie sie dann alle auf einmal. (Ja, ich weiß, dass mehrere Cursor dies alles für sich tun können mc/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.

dodgethesteamroller
quelle
3

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:

  • Sortieren Sie sie.
  • Benachbarte oder überlappende Zonen vereinen (zusammenfassen) (einschließlich Sortieren).
  • Schneide sie.
  • Grenzen Sie den Puffer auf eine Zone in der Liste ein. Zwischen den Verengungen fahren. Siehe Mehrere Verengungen .
  • Wählen Sie eine Zone in der Liste als aktive Region aus. Radfahren zwischen Regionen.
  • Suche sie (sie werden automatisch zuerst vereint). Dazu benötigen Sie die Bibliothek Isearch + .
  • Abfrage-Ersetzen über sie.
  • Markieren Sie sie und heben Sie die Markierung auf. (Dazu benötigen Sie Bibliothek Highlight oder Bibliothek 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.

Drew
quelle
2

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 werden tra-pardie 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.

Dieter.Wilhelm
quelle
2

Eine andere Möglichkeit ist, das objed- Paket zu verwenden (ich bin der Autor). Sie können jedes Textobjekt markieren, mit dem mder 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 ...):

Bildbeschreibung hier eingeben

clemera
quelle
Wenn ich versuche, dieses Paket von Melpa zu installieren, erhalte ich die Fehlermeldung package-install-from-archive: http://melpa.milkbox.net/packages/objed-20181201.1346.tar: Not found.
Name
@Name Das klingt nach einer Aktualisierung Ihrer Paketliste. Probieren Sie M-x package-refresh-contentsund dann M-x package-install.
Clemera
@Name Funktioniert es jetzt? Lassen Sie mich wissen, wenn Sie weitere Fragen haben.
Clemera
Ich konnte das Paket installieren. Scheint gut zu funktionieren, ich habe nicht alle Funktionen getestet. Vielen Dank.
Name