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

6
假设我有以下代码:
(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或非paredit命令序列,我可以按下完成从那个起点开始的工作?

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

我对如何进行包装感到满意,但感觉可能会错过一些其他很棒的编辑技巧,这些技巧可以从不同的起点找到。


如果所有方法都失败了,可以使用键盘宏。您还可以扩展paredit以实现您想要的任何功能。GNU Emacs是可扩展的。 - Rainer Joswig
2个回答

7

不要反复使用paredit-forward-slurp-sexp或kill-yank'ing区域,您可以标记要包含的sexps区域并使用paredit-wrap-roundM-(

如果我在打您的示例,我会从最后一个表达式开始:

(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 的文档字符串。


3
注意,当选区处于活动状态且启用了 transient-mark-mode 时,仅使用 ( 就可以达到与使用 paredit-wrap-sexp 相同的效果。我使用它,让用括号包裹区域的操作感觉很自然。 - Moritz Bunkus

1

您可能还想看看redshank,这是一个与paredit非常兼容的emacs包,可以实现许多有用的功能,例如此类操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接