使用双括号包装现有表达式



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

我试图在println:

中包装一个函数调用
(square 5)
(println (square 5))

最终在parendit中发生的是这样的:

(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。如有任何帮助,不胜感激

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

与其他答案相反,我倾向于在得到

后使用Ctrl-Right。
(println|) (square 5)

(其中|是光标所在的位置),我只需按Ctrl-Right即可获得正确的结果。

M-(

可以调用paredit-insert-html-examples生成HTML网页小抄。

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

(1) Cut &类型,粘贴

(+ (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)类型&slurf

(+ (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) wrap &类型

(+ (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)

剪,类型,粘贴是最乏味的。它不依赖于双括号,并且最容易推广到将一个复杂的外部形式包裹在多个内部形式(可能是多行格式)的情况,例如,将

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

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

通过在两个链接周围包装一个mapc-over-lambda形式

类型,Slurf似乎是最有名的。它也可以推广到mapc-over-lambda的情况。

包装,字体是最容易打字的。当您将其推广到map-over-lambda的情况时,您选择两个链接,并按(将其包裹起来,并完成lambda表单的编写,并选择lambda表单,按(将其包裹起来,键入mapc,您可以使用C-M-f将lambda表单和类型交叉(列表1 2 3)。

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

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

" ("

让你

println ()

,然后是C-S-),得到

println ()

最好的方法是使用家长式对话开始是有一张纸上的家长式对话小抄粘在你的显示器的一边。或者,您也可以安装paredit-menu,它会添加一个菜单项,并带有工具提示,显示与备忘单相同的示例。

我使用M-C-(,它会立即将下面的sexp用parent括起来。

最新更新