【问题标题】:lisp on emacs: how to comment a multi-line expression?lisp on emacs:如何注释多行表达式?
【发布时间】:2011-06-22 08:10:30
【问题描述】:

例如,如果我想对此发表评论:

(defun noop ()
  nil)

每次我尝试在“(defun”之前加一个分号时,defun 都会跑到下一行。那么应该怎么做呢?

GNU Emacs 23.1.1

编辑:“逃跑”是指当我在“(defun”之前插入分号时,分号之后会自动插入一个换行符,并且“(defun”再次从新行开始。

【问题讨论】:

  • 它对我有用,不要在这里逃跑。您是说当您在“(defun”之前插入分号时,会自动在其后插入换行符并且“(defun”再次从新行开始?这很奇怪;它发生在我的两个emacs版本中(GNU Emacs 22.1 和基于 GNU Emacs 22.3.1 的 Aquamacs Emacs)。
  • 是的,事情就是这样发生的。 GNU Emacs 23.1.1.
  • 您很可能安装了 paredit。
  • 那么结果是什么模式?

标签: emacs lisp comments


【解决方案1】:

查看命令 M-x comment-region 和相关的。

【讨论】:

    【解决方案2】:

    标记这两行并致电M-x comment-region。另请查看comment-or-uncomment-regioncomment-dwim 函数。

    【讨论】:

      【解决方案3】:

      M-X comment-dwimM-;,这是前者的默认键绑定 — 可能会为您节省一些击键,因为它不仅是 cmets,而且是 uncmets 区域,如果它已经被注释的话。无论如何,请查看 Emacs Manual 以获得正确的描述。

      【讨论】:

      • 不幸的是,在我的emacs M-x comment-dwim 在行尾插入分号,M-;插入三个分号和一个换行符
      【解决方案4】:

      Ron,做一个CTRL-H m 并查看次要模式。您有一些“有用的”次要模式处于活动状态。 (可能是paredit,但我不这么认为。)我记得当我尝试 EMACS 入门套件时有类似的情况。在我尖叫并找到杀死它的方法之前,它持续了大约 30 秒。

      在任何情况下,这不是默认的 EMACS 行为,它是一些 init-file 或 site-emacs 添加。

      【讨论】:

      • 键入C-h k ;,Emacs 会告诉你分号绑定到哪个命令,以及哪个库定义了它。从那里你应该能够弄清楚你需要禁用什么。
      【解决方案5】:

      如果您谈论的是 Common Lisp(而不是 Emacs-Lisp),您可以使用 #+(or)

      #+(or)
      (defun noop ()
        nil)
      

      详情请参阅CLHS

      【讨论】:

        【解决方案6】:

        对于您在标题中要求的特定任务(评论可能一次跨越多行的完整表达式),首先按C-M-SPC(绑定到mark-sexp)将区域设置为以下点的表达式,然后然后是M-;(绑定到comment-dwim,它将调用comment-region)。

        【讨论】:

          【解决方案7】:

          聚会有点晚了,但是,怎么样:

          (defmacro comment (&rest a))
          

          【讨论】:

          • 遗憾的是花了几年时间才被抓住,但这些宏解决方案不会很有用,因为 BODY 仍然需要无错误地进行评估。
          【解决方案8】:
          (defvar orgCmntEnd nil "Org Comment End")
          
          (defun orgCmntBegin (<comment <commentEnd))
          
          (orgCmntBegin "
          **  orgCmntBegin. Permits us to include * at the beginning of line as a comment.
          Which in turn allows us to switch between emacs-major mode and org-mode for COMEEGA.
          Example usage is: 
          (orgCmntBegin \"multi-line comment comes here.\" orgCmntEnd)
          
          I wish elisp had a here-document facility. Like common-lisp.
          Anybody listening?
          " orgCmntEnd)
          

          【讨论】:

          • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
          • 这是工作代码。所有 3 种形式都可以进行评估。
          • 您可以将前两个表单放入库中。第三种形式演示用法。整个事情的美妙之处在于块 cmets - 作为字符串 - 被很好地描绘并且块看起来很漂亮。 orgCmntBegin 是一个空函数,其 doc-string 是注释块,而 orgCmntEnd 只是一个使用法更明显的变量。
          • 上一条评论的最后一句应该是:orgCmntBegin 是一个空函数,由一个包含评论块的字符串调用,第二个参数是 orgCmntEnd,这使得用法更加明显。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-07-13
          • 1970-01-01
          • 2010-10-13
          • 2011-01-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多