使用Paredit将现有表达式包裹起来

6

我正在使用Paredit模式下的Emacs编写Lisp代码。

我正在尝试在println中包装一个函数调用:

(square 5)
(println (square 5))

在 paredit 中会发生以下情况:

(square 5)
(println) (square 5)

我无法删除println的右括号并将其移动到末尾。

目前我所做的方法是: 1. 删除函数调用并将其粘贴到println中 2. 写入没有括号的println,选择代码并加上括号

(square 5)
println (square 5)
=> select block of code and type (
(println (square 5))

这两种方法都很繁琐。每当我使用Paredit将代码从内部向外编写时,似乎都会遇到这个常见的问题。如有帮助,将不胜感激。


1
你最好阅读一下这个简短的手册,而不是询问已经有详细文档记录的功能相关问题。 - Bozhidar Batsov
7个回答

8
< p > paredit-wrap-round 命令可能会有帮助(在我使用的 paredit 版本中绑定到 M-( )。


如果我先输入println,那么M-(会导致(println)(square 5)。我刚意识到我必须先包裹再输入println,这不是很自然。谢谢! - Sathish
一旦你习惯了写Lisp,将参数包装在函数调用之前就变得非常自然。 - event_jr

6
与其他答案不同,我倾向于使用Ctrl-Right来完成此操作:在你得到……
(println|) (square 5)

(其中|表示光标所在位置),我只需按下Ctrl-Right即可得到正确结果。

5

M-(

您可以调用paredit-insert-html-examples生成HTML网页备忘单。 其中一个版本在这里


3

三种将印刷表单包裹在方形表单周围的方法,逐步进行。(其中三种方法中的两种已经在其他答案中提到)

(1) 剪切、打字和粘贴

(+ (square 3) 4)
;;; make sure cursor is at right place (| is cursor)
(+ |(square 3) 4)
;;; mark-sexp and kill-region
(+ | 4)
;;; type the print form and make sure cursor is at right place
(+ (print |) 4)
;;; paste
(+ (print (square 3)) 4)

(2) 类型和滑移

(+ (square 3) 4)
;;; make sure cursor is at right place (| is cursor)
(+ |(square 3) 4)
;;; type the print form and make sure cursor is at right place
(+ (print|) (square 3) 4)
;;; paredit-forward-slurp-sexp
(+ (print (square 3)) 4)

(3) 包装和类型

(+ (square 3) 4)
;;; make sure cursor is at right place (| is cursor)
(+ |(square 3) 4)
;;; paredit-wrap-round
(+ (|(square 3)) 4)
;;; type print
(+ (print (square 3)) 4)

剪切、输入和粘贴是最繁琐的。它不依赖于paredit,最容易推广到将复杂的外部表单包装在多个内部表单周围的情况,这些内部表单可能是多行格式,例如,将

(let ((x 1))
  (moo)
  (oink)
  (oink))

into

(let ((x 1))
  (moo)
  (mapc (lambda (x)
          (oink)
          (oink))
        (list 1 2 3)))

通过在两个 oinks 周围包装 mapc-over-lambda 形式。

类型 & slurf 似乎是最为人知晓的。它也可以推广到 mapc-over-lambda 的情况。

Wrap & type 是最容易输入的。当你将其推广到 map-over-lambda 情况时,你选择两个 oinks,并按 ( 包装它,完成编写 lambda 形式,然后选择 lambda 形式,按 ( 包装它,输入 mapc,您可以使用 C-M-f 穿过 lambda 形式并键入 (list 1 2 3)。


2
在您的情况下,解决方案是M-2 M-(M-( C-)

1

有几种方法可以做到这一点。我通常的做法是输入

"("

这会得到

()println

然后按C-S-),这会得到

(println)

使用paredit的最佳方法是在显示器侧面贴上paredit cheatsheet的纸张。或者,您也可以安装paredit-menu,它会添加一个菜单项,并显示与cheetsheet相同的示例工具提示。


0

我使用 M-C-(,它会立即将下一个 sexp 包裹在括号中。


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