Emacs 如何在paredit中使用已编写的外部表单包装表单

Emacs 如何在paredit中使用已编写的外部表单包装表单,emacs,lisp,paredit,Emacs,Lisp,Paredit,假设我有这个代码 (hello world) (hi world) 然后我想到我应该用以下形式来包装它: (let (acc) <> (nreverse acc)) 我通常是这样包装的。首先,我在待包装表单之前编写一个不完整的外部表单,如下所示: (let (acc)) (hello world) (hi world) 然后我按两次C-(paredit forward slurp sexp)来发出声音: (let (acc) (hello world) (hi

假设我有这个代码

(hello world)
(hi world)
然后我想到我应该用以下形式来包装它:

(let (acc)
  <>
  (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命令序列,我可以按它从一开始就完成作业

我可以移动点,剪切两个要包装的表单,移动点,粘贴表单。但是我想知道是否有更方便的方法


我对我如何包装感到满意,但感觉我可能错过了其他一些从另一个开始就可以找到的整洁的编辑技巧。

与其反复使用
paredit-forward-slurp-sexp
或kill-yank'ing区域,您可以标记sexps区域以将其括起来并使用
paredit-wrap-round
M-(

如果我键入您的示例,我将从最后一个表达式开始:

(hello world)
(hi world)
(nreverse acc)_
C-SPC C-M-a C-M-a C-M-a M-(产量:

插入
let(acc)
并用RET C-M-h选项卡完成重新识别

可能有更好的方法=),但即使不使用
瞬态标记模式
,也可以提供其他包装选项:

  • C-u换行到缓冲区或封闭列表的末尾
  • C-u#包装以下
    #
    表达式

请参阅paredit wrap sexp的docstring

您可能还想看看redshank,一个emacs软件包,它可以做许多类似的有用的事情。与paredit配合使用非常好。

如果所有操作都失败,请使用键盘宏。您还可以扩展paredit以执行任何您想要的操作。GNU emacs是可扩展的。注意,只需使用
>(
当区域处于活动状态且启用了
瞬态标记模式时,将实现与使用
paredit wrap sexp
相同的效果。我使用了它,它使带括号的区域看起来很自然。
(hello world)
(hi world)
(nreverse acc)_
(_(hello world)
  (hi world)
  (nreverse acc))