Clojure – Structural editing & keybindings

W poprzednim poście obiecałem, że zajmę się kwestią ustawień klawiatury…

Nie no teraz to już przesadzasz, zabrał byś się do pisania projektu a nie posty sobie nabijasz…

Yup, w większości przypadków ustawianie klawiatury jest zbędne. Każde IDE ma tam jakieś swoje kombinacje klawiszy ale zwykle wystarczy sobie załatwić odpowiedni cheat sheet i po sprawie.
Jednakże! Tym razem mamy wyjątek.

Zanim jednak zaczniemy, musimy nauczyć się kilku nowych słówek.

“S-Expression”, bądź “sexpr”, ewentualnie “symbolic expression”.
Jest to wyrażenie w formie listy (drzewa).
Np. wyrażenie (* 2 (+ 3 4)) rozbijamy na:

Corrected_S-expression_tree_2

Oczywiście z tą samą notacją mamy do czynienia przy pisaniu w clojure.

A co nam daje taka notacja? Otóż umożliwia nam tzw. “Structural editing”.
“Structured editing” inaczej zwany “Paredit” (od trybu w edytorze Emacs) dość pokaźnie zmienia sposób w jaki edytujemy nasz kod.

Nie każdy lubi, nie każdy używa – ale warto spróbować.

Przejdźmy się zatem po funkcjonalnościach edycji strukturalnej którą umożliwia na Cursive.

Keeps parentheses balanced

Korzystając z języka opartego na S-Expressions można zauważyć, że natężenie nawiasów wszelakich w kodzie źródłowym pokaźnie wzrasta. Edytory strukturalne dbają o to aby ich ilość zawsze się zgadzała. Co początkowo może powodować agresję, wybuchy złości oraz wyprowadzać z równowagi.

****! Ja chcę usunąć TEN nawias a nie oba!

Zaznaczanie:

  • Expand selection

Rozszerza zaznaczenie o kolejne sexpr.

Expand selection

  • Wrap

Okala zaznaczenie wybranym nawiasem.

Wrap

REPL

Czasami kod jaki pleciemy w REPL bywa wielolinijkowy. Powoduje to iż standardowe funkcje nie są dostępne. Np. Enter zrobi nam nową linię zamiast uruchomienia kodu.

  • Execute current statement

Aby uruchomić kod w REPL musimy znajdować się w ostatniej linijce kodu. A co jeżeli jesteśmy gdzieś w środku? To makro umożliwia nam uruchamianie kodu w REPL niezależnie od pozycji kursora.

  • Next/Previous repl history item

Podobnie – strzałki w wielolinijkowcach nie przeglądają historii. Więc i do tego mamy makro.

  • Run test under caret in REPL

Do uruchamiania konkretnego testu nad którym pracujemy.

  • Send form before caret to REPL

Oczywiście możemy wysyłać nie tylko testy do REPL a wręcz całe funkcje (pliki).

Edycja

Czyli to co nas najbardziej interesuje.

  • Slurp

Wciąganie sexpr do obecnego nawiasu

Slurp

  • Barf

Wyrzucanie najdalszego sexpr poza nawias

Barf

  • Kill

Usuwa wybrane sexpr (razem ze wszystkimi sexpr wewnątrz)

Kill

  • Split

Dzieli string/sexpr na dwa.

Split

Split

  • Join

Łączy string/sexpr w jedno.

Join

A tutaj lista moich ustawień (standardowo nie wszystkie są ustawione):

Expand selection: CTRL + W

Shrink selection: CTRL + SHIFT + W

Execute current statement (REPL): CTRL + ENTER↵

Next REPL history item: CTRL +

Previous REPL history item: CTRL +

Run test under caret in REPL: CTRL + U, R

Send form before caret to REPL: CTRL + E, R

Slurp (forwards): CTRL + E, CTRL +

Barf (forwards): CTRL + E, CTRL +

Kill: CTRL + SHIFT + DELETE

Split: CTRL + E, Q

Join: CTRL + E, E

Słówko jeszcze o kombinacjach pokroju Slurp czy Barf.
Z racji, że są to funkcjonalności z których korzysta się kilka razy pod rząd.
Np. aby przenieść 4 elementy poza nawias. To muszą być ustawione na tyle wygodnie aby można było używać ich wielokrotnie. Kombinacje które tu przedstawiłem z wygodnym nie mają dużo wspólnego…

No to po co je tak ustawiłeś? WTF man?

A no widzisz, sekret tkwi w odpowiedniej klawiaturze. Na mojej1, znajduje się szereg przycisków do makr (całe 5). A usytuowane są o na tyle wygodnie (na lewo od tabulatora), że warto by było z nich skorzystać. Dlatego Barf/Slurp mam przypisane pod jeden przycisk makra który wywołuje bardziej skomplikowaną kombinację.

  1. Razer BlackWidow. Któraś ze starszych modeli.

Be First to Comment

A penny for your thoughts