从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后,无论点位于何处,都不会输出 我做错了什么?
答案 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
来获取它。