Sposta il modulo su e giù in modalità paredit


13

Ho usato l'editing strutturale del corsivo (una modalità simile a un paredit per Intellij e Cursive) e ho trovato un comando piacevole chiamato move form-up (e down).

Sposta forma in alto fa questo ( |il punto è):

(+ 1 |(+ 2 3) 4) => (+ (+ 2 3) 1 4)

e Sposta forma in basso è analogo:

(+ 1 |(+ 2 3) 4) => (+ 1 4 (+ 2 3))

È possibile farlo su Emacs paredit-mode? Penso che non sia sul set di paredit di base (almeno non è descritto in questo cheat sheet


Bello. Ora è un'operazione che mi vedevo fare.
PythonNut,

2
FWIW, almeno per i due esempi che mostri, semplicemente C-M-tfa la stessa cosa. Ma suppongo che tu voglia dire che la stessa forma continua a essere spostata, piuttosto che scambiare i progressi con la prossima coppia di sexp.
Ha

Risposte:


13

Come suggerito da @Drew, C-M-tfa quello che vuoi. La regola è così:

  • Metti il ​​punto nel mezzo di due sexp.
  • Premere C-M-t(che esegue transpose-sexp).
  • Il sexp di sinistra viene sempre spostato a destra insieme al punto. Questo è molto importante , altrimenti sarai confuso a non finire.

Oppure, puoi semplicemente pensare che questo non sta trasponendo, ma semplicemente per andare avanti, devi posizionare il punto dopo il sexp che vuoi spostare.

Tuttavia, c'è un comodo che è, quando si desidera trasporre indietro il sexp sinistro, si usa lo stesso C-M-tma viene fornito con un argomento con prefisso negativo e questo è scomodo. Un altro problema è che il punto non seguirà il sexp sinistro trasposto all'indietro . Per risolvere questo problema, creiamo una versione inversa di transpose-sexps:

(defun reverse-transpose-sexps (arg)
  (interactive "*p")
  (transpose-sexps (- arg))
  ;; when transpose-sexps can no longer transpose, it throws an error and code
  ;; below this line won't be executed. So, we don't have to worry about side
  ;; effects of backward-sexp and forward-sexp.
  (backward-sexp (1+ arg))
  (forward-sexp 1))

Quindi, associlo a quello C-M-yche è accanto C-M-ted è gratuito in Emacs predefinito.

(global-set-key (kbd "C-M-y") 'reverse-tranpose-sexps)

Ecco una demo; noterai che (MY-SEXP1)è sempre a sinistra per essere spostato avanti / indietro:

inserisci qui la descrizione dell'immagine


5

È possibile farlo con Lispy , che è una forma avanzata di paredit-mode.

Per il tuo caso d'uso:

  • w si alza
  • s si sposta in basso

L'unica cosa è che il cursore deve essere in parentesi, come nel tuo esempio:

(+ 1 |(+ 2 3) 4)

Puoi anche spostare diversi sexp contemporaneamente con we s, se li contrassegni con una regione. Vedi la documentazione per maggiori informazioni.


;; C'è un modo per usare solo quei due comandi? ;; Mi sembra di perdere "M-sinistra" e "M-destra" quando lo faccio: `(add-hook 'clojure-mode-hook (lambda () (lispy-mode 1) (local-set-key (kbd" M - <up> ") 'lispy-move-up) (local-set-key (kbd" M- <down> ")' lispy-move-down)))`
nha

1

Ecco un altro comando (dalla libreria misc-cmds.el) che fa praticamente quello che richiedi. Basta associarlo a una singola chiave ( C-M-to qualsiasi altra cosa). Usalo per spostare ripetutamente un sexp sia in avanti che all'indietro.

Un prefisso negativo arg traspone all'indietro, come transpose-sexp, ma lascia anche il punto pronto per fare un'altra trasposizione all'indietro. E quando si ripete, un prefisso negativo arg ribalta semplicemente la direzione.

Quindi, se si lega il comando a, diciamo, C-oquindi si sposta il sexp che è a sinistra del punto a destra tre volte, quindi a sinistra due volte, quindi a destra una volta.C-o C-o C-o C-- C-o C-o C-- C-o

Un arg di prefisso numerico ha un effetto solo per il primo utilizzo, cioè non quando si ripete - quando si ripete, il movimento è sempre un sexp alla volta.

(defun reversible-transpose-sexps (arg)
  "Reversible and repeatable `transpose-sexp'.
Like `transpose-sexps', but:
 1. Leaves point after the moved sexp.
 2. When repeated, a negative prefix arg flips the direction."
  (interactive "p")
  (when (eq last-command 'rev-transp-sexps-back) (setq arg  (- arg)))
  (transpose-sexps arg)
  (unless (natnump arg)
    (when (or (> emacs-major-version 24)
              (and (= emacs-major-version 24)  (> emacs-minor-version 3)))
      (backward-sexp (abs arg)) (skip-syntax-backward " ."))
    (setq this-command  'rev-transp-sexps-back)))

(Nota: il comportamento è transpose-sexpscambiato in 24.4, quindi il test di versione qui. Prima di 24.4, il punto è finito nel posto giusto per continuare (es. Ripetizione). A partire da 24.4, il punto è nel posto sbagliato per quello. una regressione o l'aggiunta di una funzione utile o correzioni di altri bug è presumibilmente negli occhi di chi guarda; ;-) Ho presentato il bug # 20698 di Emacs per questo, proprio ora.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.