Emacs:如何评估光标所在的最小s表达式,或者下面的s表达式

时间:2010-01-31 13:56:46

标签: emacs elisp s-expression

评估

(+ 100 (+ 100 100))部分的好方法是什么?
(+ (+ 1 2) (+ 100 (+ 100 100)))

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

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

(+ (+ 1 2) |(+ 100 (+ 100 100)))

然后按相应的键绑定。

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

(+ (+ 1 2) (+ | 100 (+ 100 100)))

然后按键绑定。因为如果目标很大,瞄准目标会更容易。

我该怎么做这样的命令?或者是否已经提供了一个?

旁注:条形光标和方框光标

使用方框光标的默认设置(默认)可能想知道我将光标放在上面的条形符号上。在emacs中,您可以选择框光标或条形光标(bar-cursor-mode t)。当条形光标位于字母A和B之间时,框光标位于B上。因此条形图是框的左侧墙。

BTW,条形光标的概念在某些不寻常的方面很有用: 在编程中从index1迭代到index2-1的做法令初学者感到惊讶。将index1和index2想象为指示条(左墙)而不是框。

4 个答案:

答案 0 :(得分:3)

将一个键绑定到其中一个或两个:

(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)))

切线相关,我强烈建议使用paredit来处理s表达式。结构编辑命令和绑定使编辑s表达式变得轻而易举。它将C-down绑定到up-list,因此上面的eval-surrounding-sexp几乎与C-down Cx Ce完全相同(唯一的区别是函数使用save-excursion来阻止移动)。

答案 1 :(得分:2)

您可以这样编写这样的命令:

(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)))))))

答案 2 :(得分:0)

Icicles中,有一种通用的方法可以做你想做的事。

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

例如,您可以使用 M - :来评估Lisp性别,然后使用 M - 。在/点附近抓取一个性别。< / p>

如果你重复 M - 。然后它会删除它刚刚抓住的东西,并在/接近点抓取其他类型的东西(文本)并插入它。默认情况下,它按顺序运行这些类型的操作:

一个。一个Lisp符号或文件名。

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

℃。最直接的清单。

d。下一个最大的名单。

即下一个最大的名单。

F。函数ffap-guesser猜测的文件或URL。

克。无论函数thing-at-point-url-at-point猜到什么网址。

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

例如,如果点位于倒数第二个1的{​​{1}}之前,那么当您点击 M - 时,这些是连续插入迷你缓冲区的性别。< / kbd>反复按顺序:

一个。 100

+

℃。 100

d。 (+ 100 100)

(+ 100 (+ 100 100))

所以要插入最大的封闭列表,你会做 M-:M-。 M-。 M-。 M-。 M - 。,即击中 M - 。五次。

对于此行为,尤其是准确抓取列表,您还需要库Thing At Point+

答案 3 :(得分:-1)

内置eval-defun。它默认绑定到 C - M - x 。它与你想要的类似,但是可以避开顶级的defun。也许你可以适应它。