如何从 Emacs 缓冲区内的当前位置获取包含该点的最外层列表/s 表达式?
下面举几个例子来说明我想要实现的目标:
示例 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 后,无论该点在哪里,我都没有得到任何输出。
我做错了什么?
最佳答案
您正在寻找的是函数 parse-partial-sexp
返回 parser state (一个 10 元素的列表!)您可以使用它来确定您的性行为的开始和结束位置。
另一个有用的函数是scan-sexps
.
更新#1:
您的函数 get-outermost-brackets
返回最外面的开放括号的位置,不是缓冲区的有用部分,并且该值无论如何都不会显示在回显区域中。
更新#2:
这会将封闭的 sexp 发送到回显区域和 *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
。
我的百万呢?
关于emacs - 从当前点获取最外层列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19370089/