【问题标题】:Using Paredit to wrap existing expression使用 Paredit 包装现有表达式
【发布时间】:2013-01-05 09:25:40
【问题描述】:

我在 Paredit 模式下使用 Emacs 来处理 Lisp 代码。

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

(square 5)
(println (square 5))

在 paredit 中最终发生的事情是这样的:

(square 5)
(println) (square 5)

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

我现在的做法是: 1. 删除函数调用并在 println 中拉取它 2.不带paren写println,可视选择代码并用paren括起来

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

这两种方法都很乏味。每当我在 Paredit 中从里到外编写代码时,这似乎都是一个常见问题。任何帮助将不胜感激

【问题讨论】:

  • 您最好阅读简短的manual,而不是针对有据可查的功能提问。

标签: emacs clojure lisp paredit


【解决方案1】:

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

【讨论】:

  • M-( 如果我先输入 println,则结果为 (println) (square 5)。我刚刚意识到我必须先环绕然后输入 println,这不自然。谢谢!
  • 一旦习惯了lisp,在添加函数调用之前包装参数是完全自然的。
【解决方案2】:

与其他答案相比,我倾向于使用 Ctrl-Right:在你得到之后

(println|) (square 5)

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

【讨论】:

    【解决方案3】:

    M-(

    您可以致电paredit-insert-html-examples 生成HTML 网页备忘单。一个版本是here

    【讨论】:

      【解决方案4】:

      按步骤逐步将打印表单包裹在方形表单周围的三种方法。 (其他答案中已经提到了这三种方式中的两种)

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

      进入

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

      通过在两个 oink 周围包裹一个 mapc-over-lambda 表单。

      Type & slurf 似乎是最知名的。它也可以推广到 mapc-over-lambda 的情况。

      Wrap & type 是最容易输入的。当您将其推广到 map-over-lambda 情况时,您选择两个 oink,然后按 ( 将其换行,并完成 lambda 形式的编写,然后选择 lambda 形式,按 ( 将其换行,键入 mapc ,并且您可以使用 C-M-f 跨越 lambda 形式和类型(列表 1 2 3)。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          "("

          这让你

          ()println

          然后是 C-S-) 得到你

          (打印)

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-08-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-03-03
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多