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
C-M-t
fait à 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.Réponses:
Comme l'a suggéré @Drew,
C-M-t
fait ce que vous voulez. La règle est la suivante:C-M-t
(qui s'exécutetranspose-sexp
).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-t
mais 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 detranspose-sexps
:Ensuite, liez-le à celui
C-M-y
qui est à côtéC-M-t
et qui est gratuit dans Emacs par défaut.Voici une démo; vous remarquerez qu'il
(MY-SEXP1)
est tout le temps à gauche pour avancer / reculer:la source
Il est possible de le faire avec lispy , qui est une forme avancée de
paredit-mode
.Pour votre cas d'utilisation:
La seule chose est que le curseur doit être à paren, ce qui est dans votre exemple:
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.
la source
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-t
ou 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-o
ensuite 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.
(Remarque: Le comportement de
transpose-sexps
changé 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.)la source