是否可以在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)))
)
Run Code Online (Sandbox Code Playgroud)
我想在函数前面的缩进区域中添加一些信息,指示逻辑部分的起始位置.
这对于emacs-lisp是否可行,是否有一种简单的方法可以使用一些小技巧来考虑评估者跳过某些文本?
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))))
Run Code Online (Sandbox Code Playgroud)
你可以写:
(mydefun smart-tab ()
(interactive)
|1| (if (minibufferp)
|1a| (minibuffer-complete)
|2| (if (eq major-mode 'emacs-lisp-mode)
(progn
(indent-for-tab-command)))))
Run Code Online (Sandbox Code Playgroud)
(这是不可能的,\
因为该字符已经对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)))))
Run Code Online (Sandbox Code Playgroud)
这似乎与您的提议一样清晰,并且对于其他Emacs Lisp程序员来说更容易理解.