【问题标题】:how to wrap forms with an already written outer form in paredit如何在 paredit 中用已经写好的外部表格包装表格
【发布时间】:2013-09-23 19:07:20
【问题描述】:

假设我有这个代码

(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 是可扩展的。

标签: emacs lisp paredit


【解决方案1】:

不用重复使用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-(产生:

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

插入 let (acc) 并以 RET C-M-h TAB 结束以重新识别。

可能有更好的方法 =),但即使您不使用 transient-mark-mode,您也可以提供其他选项来包装:

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

查看paredit-wrap-sexp的文档字符串

【讨论】:

  • 这个。请注意,当区域处于活动状态并且启用transient-mark-mode 时仅使用( 将实现与使用paredit-wrap-sexp 相同的效果。我使用它,它使带括号的包装区域感觉自然。
【解决方案2】:

您可能还想看一下 redshank,它是一个 emacs 包,它可以做很多类似这样的有用的事情。与 paredit 配合得非常好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多