Déplacer le formulaire de haut en bas en mode paredit

13

J'ai utilisé l'édition structurelle de cursive (un mode de type paredit pour Intellij et Cursive) et j'ai trouvé une belle commande appelée déplacer la forme vers le haut (et vers le bas).

Déplacer le formulaire vers le haut fait cela ( |c'est le but):

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

et Déplacer le formulaire vers le bas est analogue:

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

Est-il possible de le faire sur le mode paredit d'Emacs? Je pense que ce n'est pas sur l'ensemble de paredit de base (au moins, il n'est pas décrit sur cette feuille de triche

Rodrigo Flores
la source
Agréable. Voilà une opération que je me voyais faire.
PythonNut
2
FWIW, au moins pour les deux exemples que vous montrez, C-M-tfait à peu près la même chose. Mais je suppose que ce que vous voulez dire, c'est que la même forme continue d'être déplacée, plutôt que de passer de la progression à la prochaine paire de sexps.
Tiré

Réponses:

13

Comme l'a suggéré @Drew, C-M-tfait ce que vous voulez. La règle est la suivante:

  • Mettre le point au milieu de deux sexps.
  • Appuyez sur C-M-t(qui s'exécute transpose-sexp).
  • Le sexp gauche est toujours déplacé vers la droite avec le point. Ceci est très important , sinon vous serez confus sans fin.

Ou, vous pouvez simplement penser que ce n'est pas transposer mais simplement pour avancer, vous devez placer un point après le sexp que vous voulez déplacer.

Cependant, il existe un moyen pratique: lorsque vous souhaitez transposer le sexp gauche vers l'arrière, vous utilisez le même C-M-tmais fourni avec un argument de préfixe négatif et cela n'est pas pratique. Un autre problème est que ce point ne suivra pas le sexe gauche transposé en arrière . Pour résoudre ce problème, nous créons une version inverse de 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))

Ensuite, liez-le à celui C-M-yqui est à côté C-M-tet qui est gratuit dans Emacs par défaut.

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

Voici une démo; vous remarquerez qu'il (MY-SEXP1)est tout le temps à gauche pour avancer / reculer:

entrez la description de l'image ici

Tu Do
la source
5

Il est possible de le faire avec lispy , qui est une forme avancée de paredit-mode.

Pour votre cas d'utilisation:

  • w remonte
  • s descend

La seule chose est que le curseur doit être à paren, ce qui est dans votre exemple:

(+ 1 |(+ 2 3) 4)

Vous pouvez également déplacer plusieurs sexps à la fois avec wet s, si vous les marquez avec une région. Voir la documentation pour plus d'informations.

abo-abo
la source
;; Existe-t-il un moyen d'utiliser uniquement ces deux commandes? ;; Je semble perdre "M-gauche" et "M-droite" en faisant cela: `(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

Voici une autre commande (de la bibliothèque misc-cmds.el) qui fait à peu près ce que vous demandez. Il suffit de le lier à une seule clé ( C-M-tou autre). Utilisez-le pour déplacer un sexe à la fois vers l'avant et vers l'arrière à plusieurs reprises.

Un préfixe négatif arg transpose vers l'arrière, comme transpose-sexp, mais il laisse également le point prêt à effectuer une autre transposition vers l'arrière. Et lors de la répétition, un préfixe négatif arg inverse simplement la direction.

Donc, si vous liez la commande à, disons, déplacez C-oensuite le sexp qui est à gauche du point vers la droite trois fois, puis deux fois vers la gauche, puis une fois vers la droite.C-o C-o C-o C-- C-o C-o C-- C-o

Un préfixe numérique arg n'a d'effet que pour la première utilisation, c'est-à-dire pas lors de la répétition - lors de la répétition, le mouvement est toujours un sexp à la fois.

(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)))

(Remarque: Le comportement de transpose-sexpschangé en 24.4, d'où le test de version ici. Avant 24.4, le point s'est retrouvé au bon endroit pour continuer (par exemple, répéter). À partir de 24.4, le point est au mauvais endroit pour cela. Que ce soit une régression ou ajoute une fonctionnalité utile ou corrige un autre bogue est probablement dans l'œil du spectateur. ;-) J'ai déposé le bogue Emacs # 20698 pour cela, tout à l'heure.)

A dessiné
la source