Verwissel twee statements op aangrenzende regels in C wanneer één instructie meerdere regels bevat

Stel dat ik de volgende code heb:

int x;
string s = "some very long "
           " string";

Ik zou graag één commando hebben dat de volgorde van deze verwisselt zonder dat het eindigt op iets als:

string s = "some very long"
int x;
           "string";

Is er een eenvoudige manier om het te doen?

5
Helpt C-M-t ( transpose-sexps )? Het zou moeten, maar misschien niet in C.
toegevoegd de auteur Ryan Eastabrook, de bron
Het kan afhangen van waar u de cursor plaatst. Dunno, wat Emacs als een sekse beschouwt in C. Misschien is het niet erg geavanceerd. U kunt hier misschien zien of een van de andere transpose - * -opdrachten ( transpose-paragraph ?) Hier helpt. Hoe dan ook, waarschijnlijk zijn er bibliotheken van derden die bieden wat u vraagt, en hopelijk laat iemand het u hier weten.
toegevoegd de auteur Ryan Eastabrook, de bron
Ik zou willen voorstellen: 1) highlite één van de verklaringen 2) 'ruk' uit de verklaring 3) 'zet' de bewering op zijn 'nieuwe locatie. Wanneer u een macro hebt ontwikkeld die begint bij het begin van de instructie (begin van de regel ??) tot de eerste puntkomma, voegt u functie toe om naar de volgende puntkomma te zoeken, gaat u verder langs de nieuwe regel en plakt u. Vervolgens kunt u die macro gebruiken voor wat u wilt uitvoeren. (waarschijnlijk een LOT sneller om alleen de stappen uit te voeren via toetsenbord- en muisacties) Zorg dat u die macro opslaat in het opstartbestand van emacs
toegevoegd de auteur Alexander Prokofyev, de bron
Nee, het doet iets heel anders.
toegevoegd de auteur Josh Belmont, de bron
Misschien sp-transpose-hybrid-sexp docs van smartparens zal het doen, in ieder geval plaats je haakjes rond het paar strings.
toegevoegd de auteur andrewb, de bron

2 antwoord

Ik raad aan om smartparens te gebruiken. Voor niet-lisp-talen heeft dit de bruikbare notie van "hybrid s-expression" . De opdracht sp-transpose-hybrid-sexp werkt niet direct op uw voorbeeld, maar als u bereid bent om die twee tekenreeks tussen haakjes in te pakken, werkt het (ook Emacs lijkt veel beter te laten inspringen) met de toegevoegde haakjes). Als u het op de volgende tekst uitvoert met het punt waar dan ook in string s = zal het de twee verklaringen correct omwisselen:

int x;
string s = ("some very long "
            " string");
1
toegevoegd

anchored-transpose may be another option.

Bind verankerd-transponeren in Cx t , dan kun je het eerste statement markeren, druk op Cx t , markeer het tweede statement, druk op Cx t , en deze twee verklaringen zijn verwisseld. Het lijkt NIET erg handig op het eerste gezicht, dus het is beter als je het gebruikt met andere pakketten die snel de uitspraken kunnen markeren.

EDIT: Ik heb me net gerealiseerd dat anchored-transpose misschien geen goede oplossing is voor dit speciale geval. Als u snel de regio markeert, kunt u gewoon een C-w doen om de regio te doden en vervolgens plakken. anchored-transpose moet in enkele meer algemene gevallen passen waar er niet zoiets is als sexp of statement , alleen willekeurige teksten.

0
toegevoegd