2

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

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

?

现在,我通过 Cx Ce 来完成,这意味着我需要找到结尾括号,这在大多数情况下都很困难。Options > Paren Matching Highlighting有帮助,但我仍然需要将光标移向结束括号,直到突出显示的匹配项是开始括号。

一种方法是使用 Cx Ce 的反向版本,这样我就可以将光标放在起始括号上,如下所示:

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

然后按相应的键绑定。

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

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

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

我怎样才能发出这样的命令?还是已经提供了一个?

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

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

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

4

4 回答 4

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防止移动)。

于 2010-01-31T18:43:16.107 回答
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)))))))
于 2010-01-31T17:02:46.657 回答
0

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

默认情况下,在 minibufferM-.中绑定到一个命令,该命令将文本在(或附近)点插入到 minibuffer 中(不输入它或用它做其他事情;只是插入它)。

例如,您可以使用M-:来评估 Lisp 性别,然后您可以使用M-.在/附近获取性别。

如果你重复M-.,那么它会丢弃它刚刚抓取的内容并在/附近抓取一些其他类型的东西(文本)并插入它。默认情况下,它会依次运行这些类型的 THING:

一种。Lisp 符号或文件名。

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

C。最直接的清单。

d。下一个最大的列表。

e. 下一个最大的列表。

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

G。thing-at-point-url-at-point无论函数猜测的 URL 是什么。

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

例如,如果 point 位于1倒数第二个的之前,则100这些是在您重复点击时连续插入到 minibuffer 中的 sexps M-.,按顺序:

一种。+

湾。100

C。(+ 100 100)

d。(+ 100 (+ 100 100))

e. (+ (+ 1 2) (+ 100 (+ 100 100)))?

因此,要插入最大的封闭列表,您会这样做M-: M-. M-. M-. M-. M-.,即点击M-.五次。

对于这种行为,特别是为了准确抓取列表,您还需要库Thing At Point+

于 2011-08-21T22:34:07.950 回答
-1

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

于 2010-01-31T17:14:18.000 回答