将注释结束字符添加到Emacs-Lisp

时间:2013-01-15 14:41:01

标签: emacs lisp eval

是否可以在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是否可行,是否有一种简单的方法可以使用一些小技巧来考虑评估者跳过某些文本?

1 个答案:

答案 0 :(得分:5)

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读者有意义。)

但是,我不得不说,这对我来说似乎不是一个特别好的主意。将您的章节标题放在来源右侧的评论中会好得多:

(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程序员也更容易理解。