emacs - 从当前点获取最外层列表

标签 emacs elisp s-expression

如何从 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/

相关文章:

variables - 我可以在.dir-locals.el中放入任意的elisp代码吗?

emacs - 为特定模式定义前缀键映射中的键

compiler-construction - OCaml 中 S 表达式树到抽象语法树

functional-programming - 列表作为通用数据类型表示的缺点是什么?

c++ - 根据 Rcpp.h 为自定义类扩展 Rcpp::as

emacs - 让 Newsticker.el 使用带有登录凭据的 rss 提要

linux - Linux 上的 Emacs/xterm 颜色烦恼

Emacs 自动完成弹出菜单损坏

Emacs 元编程,动态定义方法

elisp - 有没有办法用 gnuplot 快速绘制 elisp 函数?