Korzystałem z Cursive's Structural Editing (tryb podobny do kredytów dla Intellij i Cursive) i znalazłem tam fajne polecenie o nazwie move form-up (i dół).
Przenieś formularz w górę robi to (o |
to chodzi):
(+ 1 |(+ 2 3) 4) => (+ (+ 2 3) 1 4)
i Przenieś formularz w dół jest analogiczny:
(+ 1 |(+ 2 3) 4) => (+ 1 4 (+ 2 3))
Czy można to zrobić w trybie paac Emacsa? Myślę, że nie ma go w podstawowym zestawie paredit (przynajmniej nie jest opisany w tym ściągu)
C-M-t
robi to samo. Ale myślę, że masz na myśli to, że ta sama forma jest nadal przenoszona, zamiast zamiany postępu na następną parę sexps.Odpowiedzi:
Jak sugeruje @Drew,
C-M-t
robi to, co chcesz. Zasada jest następująca:C-M-t
(który działatranspose-sexp
).Lub możesz po prostu pomyśleć, że to nie jest transpozycja, ale po prostu iść do przodu, musisz umieścić punkt za seksem, który chcesz przenieść.
Jest jednak jedna wygoda, że kiedy chcesz przetransponować lewą seksu wstecz, używasz tego samego,
C-M-t
ale z argumentem przedrostka ujemnego i jest to niewygodne. Inną kwestią jest to, że punkt nie będzie podążał za transponowaną do tyłu lewą seksem . Aby rozwiązać ten problem, tworzymy odwrotną wersjętranspose-sexps
:Następnie powiąż go z,
C-M-y
który jest obokC-M-t
i jest domyślnie darmowy w Emacsie.Oto demo; zauważysz, że
(MY-SEXP1)
cały czas jest po lewej stronie, aby przejść do przodu / do tyłu:źródło
Można to zrobić za pomocą lispy , która jest zaawansowaną formą
paredit-mode
.W przypadku użycia:
Jedyną rzeczą jest to, że kursor musi znajdować się w paren, co jest w twoim przykładzie:
Możesz również przenieść kilka sexps jednocześnie wi s, jeśli oznaczysz je regionem. Więcej informacji znajduje się w dokumentacji .
źródło
Oto kolejne polecenie (z biblioteki
misc-cmds.el
), które robi właściwie to, o co prosisz. Po prostu powiąż go z jednym kluczem (C-M-t
lub czymkolwiek). Użyj go, aby kilkakrotnie przesuwać seksu zarówno do przodu, jak i do tyłu.Negatywny przedrostek arg transponuje wstecz, jak
transpose-sexp
, ale pozostawia punkt gotowy do wykonania kolejnej transpozycji wstecznej. A podczas powtarzania arg ujemny przedrostek arg po prostu zmienia kierunek.Jeśli więc powiążesz polecenie, powiedzmy,
C-o
a następnie trzykrotnie przesuwa sekwencję na lewo od punktu w prawo, następnie dwa razy w lewo, a następnie raz w prawo.C-o C-o C-o
C--
C-o C-o
C--
C-o
Przedrostek numeryczny arg ma wpływ tylko przy pierwszym użyciu, tj. Nie przy powtarzaniu - przy powtarzaniu ruch jest zawsze jedną sekwencją na raz.
(Uwaga: zachowanie
transpose-sexps
zmieniło się w 24.4, stąd test wersji tutaj. Przed 24.4 punkt znajdował się we właściwym miejscu, aby kontynuować (np. Powtórzenie). Począwszy od 24.4, punkt znajduje się w niewłaściwym miejscu. Czy to jest regresja lub dodanie przydatnej funkcji lub naprawienie jakiegoś innego błędu jest prawdopodobnie w oczach patrzącego; ;-) Właśnie teraz zgłosiłem błąd Emacsa # 20698 ).źródło