2

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

4

1 回答 1

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

于 2013-01-15T15:17:45.980 回答