Как обернуть формы с уже написанной внешней формой в paredit

Предположим, у меня есть этот код

(hello world)
(hi world)

Тогда мне приходит в голову, что я должен обернуть это в следующую форму:

(let (acc)
  <>
  (nreverse acc))

в результате этого кода:

(let (acc)
  (hello world)
  (hi world)
  (nreverse acc))

Вот как я обычно делаю упаковку. Сначала я пишу неполную внешнюю форму перед формами, которые будут обернуты следующим образом:

(let (acc))
(hello world)
(hi world)

Тогда я нажимаю C-) (paredit-forward-slurp-sexp) дважды хлебать вещи:

(let (acc)
  (hello world)
  (hi world))

Затем я заканчиваю, добавляя (nreverse acc) в конце.

Теперь я задаюсь вопросом: а что, если я начну с написания полного шаблона внешней формы, подобного этому?

(let (acc)
  (nreverse acc))
(hello world)
(hi world)

или как это

(hello world)
(hi world)
(let (acc)
  (nreverse acc))

Существует ли короткая последовательность команд paredit или non paredit, которые я могу нажать, чтобы завершить работу с этого старта?

Я мог бы переместить точку, вырезать две обернутые формы, переместить точку, вставить формы. Но мне интересно, есть ли более удобный способ.

Я удовлетворен тем, как я делаю обертку, но мне кажется, что я могу пропустить некоторые другие хитрые уловки редактирования, которые можно найти с другого начала.

2 ответа

Вместо неоднократного использования paredit-forward-slurp-sexp или убить-дергать регион, вы можете пометить регион sexps для включения и использования paredit-wrap-round M-(

Если бы я печатал ваш пример, я бы начал с последнего выражения:

(hello world)
(hi world)
(nreverse acc)_

C-SPC CMa CMa CMa M-( дает:

(_(hello world)
  (hi world)
  (nreverse acc))

Вставить let (acc) и закончить с помощью RET CMh TAB для повторной идентификации.

Там, вероятно, лучший способ =), но даже если вы не используете transient-mark-mode Вы можете предоставить другие варианты упаковки:

  • Cu переносится в конец буфера или вмещающий список
  • Cu # оборачивает следующее # выражения

Смотрите документацию для paredit-wrap-sexp

Возможно, вы также захотите взглянуть на redshank, пакет emacs, который делает кучу полезных вещей вроде этого. Работает с Paredit очень хорошо.

Другие вопросы по тегам