Emacs:如何计算光标所在的最小s表达式或以下s表达式

Emacs:如何计算光标所在的最小s表达式或以下s表达式,emacs,elisp,s-expression,Emacs,Elisp,S Expression,评估中的(+100(+100))零件的好方法是什么 (+ (+ 1 2) (+ 100 (+ 100 100))) ? 现在,我用C-xc-e来做,这意味着我需要定位结束括号,这在大多数情况下是很困难的Options>Paren Matching Highlighting有帮助,但我仍然需要将光标移向结束括号,直到突出显示的匹配成为开始括号 一种方法是使用C-x C-e的反向版本,这样我可以将光标放在起始括号处,如下所示: (+ (+ 1 2) |(+ 100 (+ 100 100))) 然

评估中的
(+100(+100))
零件的好方法是什么

(+ (+ 1 2) (+ 100 (+ 100 100)))
?

现在,我用C-xc-e来做,这意味着我需要定位结束括号,这在大多数情况下是很困难的
Options>Paren Matching Highlighting
有帮助,但我仍然需要将光标移向结束括号,直到突出显示的匹配成为开始括号

一种方法是使用C-x C-e的反向版本,这样我可以将光标放在起始括号处,如下所示:

(+ (+ 1 2) |(+ 100 (+ 100 100)))
然后按相应的键绑定

或者我可以将光标放在表达式中,但不能放在较小的表达式中:

(+ (+ 1 2) (+ | 100 (+ 100 100)))
然后按一个键。因为目标越大,瞄准目标就越容易

我怎么能发出这样的命令?还是已经有了

旁注:条形光标和长方体光标

使用方框光标(默认)的emacs用户可能会想知道我将上面带有条形符号的光标放在哪里。在emacs中,您可以选择框光标或条形光标,
(条形光标模式t)
。当条形光标位于字母A和B之间时,长方体光标位于B上。因此,条形光标位于长方体的左墙上

顺便说一句,条形光标的概念在某些方面非常有用:
编程中从index1迭代到index2-1的实践让初学者感到惊讶。这有助于将index1和index2想象成指示条(左墙)而不是框。

您可以这样编写命令:

(require 'thingatpt)
(defun eval-sexp-at-or-surrounding-pt ()
  "evaluate the sexp following the point, or surrounding the point"
  (interactive)
  (save-excursion
    (forward-char 1)
    (if (search-backward "(" nil t)
        (message "%s" (eval (read-from-whole-string (thing-at-point 'sexp)))))))

有一个内置的
eval defun
。它默认绑定到C-M-x。它与您想要的类似,但评估顶级defun。也许你能适应

将密钥绑定到其中一个或两个:

(defun eval-next-sexp ()
  (interactive)
  (save-excursion
    (forward-sexp)
    (eval-last-sexp nil)))

(defun eval-surrounding-sexp (levels)
  (interactive "p")
  (save-excursion
    (up-list (abs levels))
    (eval-last-sexp nil)))
与此相关,我强烈建议使用s表达式。结构编辑命令和绑定使编辑s表达式变得轻而易举。它将C-down绑定到
up list
,这样上面的
eval-around-sexp
几乎与C-down C-x C-e完全相同(唯一的区别是该函数使用
save-shiftion
来防止移动)。

中有一种通用的方法来做您想要做的事情

默认情况下,在迷你缓冲区M-。绑定到一个命令,该命令将在(或附近)点处的文本插入迷你缓冲区(不输入文本或使用它执行其他操作,只插入文本)

例如,可以使用M-:计算Lisp sexp,然后使用M-。在某个点/附近抓取性爱镜头

如果你重复M-。然后,它放下刚才抓取的东西,在点/附近抓取其他类型的东西(文本)并插入。默认情况下,它按以下顺序运行:

a。Lisp符号或文件名

b。活动区域(选定文本)或单词

c。最直接的列表

d。第二大名单

e。第二大名单

f。函数
ffap猜测器
猜测的文件或URL

g。无论什么URL,函数
在点上的东西URL在点上
猜测

这对您的
(+(+12)(+100(+100))
示例意味着什么?

例如,如果点位于倒数第二个
100
1
之前,则当您点击M-时,这些是连续插入微型缓冲区中的sexps。反复地,为了:

a<代码>+

b<代码>100

c<代码>(+100)

d<代码>(+100(+100))

e<代码>(+(+12)(+100(+100))

因此,要插入最大的封闭列表,您需要执行M-:M-。M-。M-。M-。M-,也就是说,点击M-。五次


对于这种行为,尤其是为了准确获取列表,您还需要库。

eval defun
将获取太多(包含或位于点之后的整个顶级表单)。OP显然只想计算内部子表达式。是的。我是在建议改编。特别是它找到顶级性感女星的方式。