Der schnellste Weg, um den Codeblock in eine bestimmte Zeile zu verschieben

8

Angenommen, Sie haben Code in den Zeilen 4, 5, 6. Dann möchten Sie diesen Codeblock zum Startpunkt Zeile 9 verschieben und gleichzeitig die Zeilen 4, 5, 6 löschen.

Was ist der schnellste Weg, dh die geringste Anzahl von Tastenanschlägen, um dies zu erreichen? Wäre eine benutzerdefinierte Funktion besser geeignet?

Edgar Aroutiounian
quelle

Antworten:

6

Beginnen Sie am Anfang von Zeile 4 ( ESC 4 ESC g goder M-4 M-g M-gum dorthin zu gelangen) C-3 C-k C-2 C-n C-y(oder ESC 3 C-k down down C-ywenn Sie Modifikatoren nicht gedrückt halten möchten).

Wenn Sie nicht in Ihrem Kopf rechnen möchten, sondern stattdessen visuell Linien auswählen möchten, dann

  • Bewegen Sie sich zum Anfang der Zone, um sich zu bewegen
  • C-SPC die Marke setzen
  • Gehen Sie zum Anfang der ersten Zeile, um sie beizubehalten
  • C-w schneiden
  • Gehen Sie nach unten zu der Stelle, an der Sie den ausgeschnittenen Text einfügen möchten
  • C-y einfügen

Ich glaube nicht, dass es eine Möglichkeit gibt, dies zu verkürzen, es sei denn, Sie sind bereit, etwas Flexibilität zu verlieren (zum Beispiel, wenn Sie häufig einen Block mit genau drei Zeilen verschieben möchten). Sie müssen drei Positionen angeben: den Anfang des zu verschiebenden Blocks, das Ende des zu verschiebenden Blocks und das Ziel. In den obigen Sequenzen gibt es an jeder Stelle einen einzigen Tastendruck, der so niedrig wie möglich ist.

Gilles 'SO - hör auf böse zu sein'
quelle
8

Wenn der Abstand nicht groß ist, können Sie Move-Text verwenden :

Geben Sie hier die Bildbeschreibung ein

In Bezug auf Tastenanschläge ist es für mich:

  1. Region wählen:

    C-SPCC-nC-nC-n

  2. Region verschieben:

    H-S-nH-S-nH-S-n

( move-text-downist gebunden an H-S-n)

welldan97
quelle
Sie können auch ein numerisches Argument nfür move-text-downund angeben move-text-up. Dies verkürzt Schritt (2) auf M-3 H-S-n.
itsjeyd
3

Sie können expand-region verwenden , um den Block zu markieren, wenn es sich um eine semantische Einheit wie eine Funktion handelt (auf der Website des Pakets wird dies ausführlicher erläutert). Bewegen Sie es dann, wie in der anderen Antwort erläutert. Je nachdem, wo Sie sich im Block befinden, kann ein einziger Tastendruck das Ganze markieren.

rlazo
quelle
Können Sie das näher erläutern? Was meinst du mit einem echten Block? Wie ein Funktionsblock?
Edgar Aroutiounian
Ja, der im Paket verwendete Begriff ist "semantische Einheiten", die Wort, Zeile, Codeblock, Funktion, Klasse oder ganze Datei sein können. Ich habe die Antwort so bearbeitet, dass sie einen Link zu dem Paket enthält, der dies besser erklärt.
Rlazo
2

Wenn Sie verwenden evil-mode, können Sie alternativ einen verwenden exBefehl ein : :4,6m9(die mLinien oves 4auf 6der Linie 9).

shosti
quelle
Ich kann ein exotisches Feature wie die vi-Emulation nicht erwähnen, wenn es nichts mit der Frage zu tun hat.
Gilles 'SO - hör auf böse zu sein'
2
Gilles: evil-modeist nicht gerade dunkel - es hat fast 18.000 Downloads auf Melpa. Eine andere Antwort verwendet expand-region, die auch ein externes Paket ist. Für eine Q & A-Site ist es wahrscheinlich gut, mehrere Möglichkeiten einzuschließen, um dasselbe mit verschiedenen Paketen zu erreichen (obwohl es möglicherweise sinnvoll ist, einige Richtlinien zu erstellen).
Shosti