Я использовал Cursive's Structural Editing (режим, подобный паредиту для Intellij и Cursive), и нашел там замечательную команду, которая называется move form-up (и down).
Перемещение формы вверх делает это ( |
точка):
(+ 1 |(+ 2 3) 4) => (+ (+ 2 3) 1 4)
и перемещение формы вниз аналогично:
(+ 1 |(+ 2 3) 4) => (+ 1 4 (+ 2 3))
Возможно ли это сделать в Emacs paredit-mode? Я думаю, что это не на основном наборе paredit (по крайней мере это не описано в этом шпаргалке
C-M-t
делает примерно то же самое. Но я предполагаю, что вы имеете в виду, что та же самая форма продолжает перемещаться, вместо того, чтобы переключаться на следующую пару сексов.Ответы:
Как предложил @Drew,
C-M-t
делает то , что вы хотите. Правило таково:C-M-t
(который работаетtranspose-sexp
).Или вы можете просто подумать, что это не транспонирование, а просто движение вперед, вы должны поставить точку после того, какой пол вы хотите переместить.
Тем не менее, есть один удобный способ: когда вы хотите транспонировать левый sexp назад, вы используете тот же,
C-M-t
но снабженный аргументом с отрицательным префиксом, и это неудобно. Другая проблема заключается в том, что точка не будет следовать за транспонированным назад левым сексом . Чтобы решить эту проблему, мы создаем обратную версиюtranspose-sexps
:Затем привяжите его к тому,
C-M-y
который находится рядомC-M-t
и является бесплатным в Emacs по умолчанию.Вот демо; Вы заметите, что
(MY-SEXP1)
слева все время перемещаетесь вперед / назад:источник
Это можно сделать с помощью lispy , который является продвинутой формой
paredit-mode
.Для вашего случая использования:
Единственное, что курсор должен быть в конце, как в вашем примере:
Вы также можете перемещать несколько сексов одновременно с помощью wи s, если вы пометите их регионом. Смотрите документацию для получения дополнительной информации.
источник
Вот еще одна команда (из библиотеки
misc-cmds.el
), которая в значительной степени выполняет то, что вы запрашиваете. Просто свяжите его с одним ключом (C-M-t
или чем-то еще). Используйте его для многократного перемещения пола вперед и назад.Отрицательный префикс arg транспонируется назад, как
transpose-sexp
, но он также оставляет точку готовой сделать другую обратную транспозицию. А при повторении отрицательный префикс arg просто меняет направление.Поэтому, если вы связываете команду, скажем, с
C-o
, затем перемещаете сексп, который находится слева от точки, три раза вправо, затем влево дважды, затем один раз вправо.C-o C-o C-o
C--
C-o C-o
C--
C-o
Числовой префикс arg действует только при первом использовании, т. Е. Не при повторении - при повторении движение всегда происходит по одному полу за раз.
(Примечание. Поведение
transpose-sexps
изменилось в 24.4, отсюда и проверка версии. До 24.4 точка оказалась в правильном месте, чтобы продолжить (например, повторить). Начиная с 24.4, точка находится в неправильном месте для этого. регрессия или добавляет полезную функцию или исправляет некоторые другие ошибки, по-видимому, в глазах смотрящего. ;-) Я подал ошибку Emacs №20698 для этого, только сейчас.)источник