【问题标题】:Adding comment-end character to Emacs-Lisp向 Emacs-Lisp 添加注释结束字符
【发布时间】:2013-01-15 14:41:00
【问题描述】:

是否可以在 emacs 中添加注释结尾字符?

我将使用我拥有的第一个代码并应用我想要的作为示例:

    (defun smart-tab ()
      (interactive)
\1\       (if (minibufferp)
\1a\             (minibuffer-complete)
\2\         (if (eq major-mode 'emacs-lisp-mode) 
            (progn 
              (save-excursion 
                (search-backward "(def")
                (while (not (looking-at "\\s-*)"))
                  (beginning-of-line 1)
                  (indent-for-tab-command)
                  (beginning-of-line 1) 
                  (next-line)
                  (when (looking-at (concat ".*" comment-start))
                    (next-line))))
              (indent-for-tab-command))    
          (yas-expand)))
      )

我想在函数前的缩进区添加一些信息,指出逻辑部分从哪里开始。

这对于 emacs-lisp 是否可行,是否有一种简单的方法可以使用一些小技巧来考虑评估器跳过某些文本?

【问题讨论】:

    标签: emacs lisp eval


    【解决方案1】:

    Emacs Lisp 没有阅读器宏(或任何其他修改阅读器的方式)。但是您可以通过编写自己的宏并使用它而不是defun 来做一些接近您想要的事情。例如,使用这个宏定义:

    (defmacro mydefun (name args &rest body)
      "Define NAME as a function.
    Like normal `defun', except BODY may contain |comments|."
      (labels ((uncomment (form)
                 (cond ((not (consp form)) form)
                       ((and (symbolp (car form))
                             (string-match "|.*|$" (symbol-name (car form))))
                        (uncomment (cdr form)))
                       (t (cons (uncomment (car form))
                                (uncomment (cdr form)))))))
        `(defun ,name ,args ,@(uncomment body))))
    

    你可以写:

        (mydefun smart-tab ()
          (interactive)
    |1|       (if (minibufferp)
    |1a|             (minibuffer-complete)
    |2|         (if (eq major-mode 'emacs-lisp-mode) 
                (progn 
                  (indent-for-tab-command)))))
    

    (不能为此使用\,因为该字符已经对 Emacs Lisp 阅读器有意义。)

    不过,我不得不说,这对我来说似乎不是一个特别好的主意。将部分标题放在源代码右侧的 cmets 中会更好:

    (defun smart-tab ()
      (interactive)
      (if (minibufferp)                         ; 1
          (minibuffer-complete)                 ; 1a
        (if (eq major-mode 'emacs-lisp-mode)    ; 2
            (progn 
              (indent-for-tab-command)))))
    

    这看起来和你的提议一样清楚,并且对于其他 Emacs Lisp 程序员来说更容易理解。

    【讨论】:

    • 我想我不得不同意,但是,当您考虑到这一点时,最终会出现大量嵌套,函数左侧的“空白”比函数的右侧!
    • 试图坚持大约 80 个字符会变得很困难,同时左侧还有大量空间。
    猜你喜欢
    • 2018-10-23
    • 1970-01-01
    • 2011-06-22
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多