как оборачивать формы уже написанной внешней формой в 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, которую я могу нажать, чтобы завершить задание с этого начала?

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

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


person Jisang Yoo    schedule 23.09.2013    source источник
comment
Если ничего не помогает, используйте макрос клавиатуры. Вы также можете расширить paredit, чтобы делать все, что хотите. GNU Emacs является расширяемым.   -  person Rainer Joswig    schedule 24.09.2013


Ответы (2)


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

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

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

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

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

Вставьте let (acc) и нажмите RET C-M-h TAB для повторной идентификации.

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

  • C-u переносится в конец буфера или окружающего его списка
  • C-u # заключает в себе следующие # выражений

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

person assem    schedule 23.09.2013
comment
Этот. Обратите внимание, что простое использование (, когда регион активен и когда включен transient-mark-mode, приведет к тому же результату, что и использование paredit-wrap-sexp. Я использую его, и он делает обтекание областей скобками естественным образом. - person Moritz Bunkus; 24.09.2013

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

person David Hodge    schedule 28.09.2013