3

从 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+PI 后,无论该点在哪里,都没有输出。
我究竟做错了什么 ?

4

2 回答 2

4

您正在寻找的是parse-partial-sexp返回解析器状态的函数(一个 10 元素列表!),您可以使用它来确定您的 sexp 的开始和结束位置。

花药有用的功能将是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)))))

message如果您想从函数中返回 sexp 而不是仅仅显示它,请放弃。

我的百万呢?

于 2013-10-14T23:12:44.733 回答
4

(car (last (nth 9 (syntax-ppss))))将为您提供最外面的开放括号的位置(如果您不在括号内,则为 nil)。如果你想得到对应的表达式作为s-exp,你可以到那个位置,然后用read它来获取。

于 2013-10-15T00:27:52.483 回答