评估
中(+ 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上。因此条形图是框的左侧墙。
答案 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。也许你可以适应它。