从当前点获取最外面的列表

时间:2013-10-14 22:08:14

标签: emacs elisp s-expression

从Emacs缓冲区内的当前位置开始,如何获得包含该点的最外层列表/ s-expression?
下面举几个例子来说明我想要实现的目标:

示例1:

(defun xpto(arg)
  (+ 2 4)[point])

输出1:

(defun xpto(arg)
      (+ 2 4))

示例2:

(defun [point]xpto(arg)
  (+ 2 4))

输出2:

(defun xpto(arg)
      (+ 2 4))

示例3:

(defun xpto(arg)
  (+ 2 4))[point]

输出3:

NIL

是否有Emacs提供的“现成”功能可以完成上述行为? 如果没有,你能指导我采用更简单的方法来实现它吗?

更新#1

根据建议,我尝试了以下方法:

;; Gets the outermost brackets based on point position
(defun get-outermost-brackets()
  (interactive)
  (car (last (nth 9 (syntax-ppss)))))


;; Assigns that function to a key
(global-set-key [(control p)] 'get-outermost-brackets)

然而,按下CTRL + P后,无论点位于何处,都不会输出 我做错了什么?

2 个答案:

答案 0 :(得分:4)

你要找的是函数parse-partial-sexp,它返回parser state(一个10元素列表!),你可以用它来计算你性别的开始和结束位置。

另一个有用的功能是scan-sexps

更新#1:

你的函数get-outermost-brackets返回最外面的打开paren的位置,而不是缓冲区的有用部分,并且该值无论如何都不会显示在echo区域中。

更新#2:

这会将封闭的sexp发送到echo区域和*Messages*缓冲区:

(defun get-enclosing-sexp (&optional pos)
  (interactive)
  (message "%s" (save-excursion
                  (goto-char (car (last (nth 9 (syntax-ppss)))))
                  (read (current-buffer)))))

如果您想从函数返回sexp而不是仅显示它,请删除message

我的百万在哪儿?

答案 1 :(得分:4)

(car (last (nth 9 (syntax-ppss))))会给你最外面的开放式paren的位置(如果你不在括号内,则为nil)。如果您想将相应的表达式作为s-exp,您可以转到该位置,然后使用read来获取它。