【问题标题】:In Emacs can you evaluate an Emacs Lisp expression and replace it with the result?在 Emacs 中,您可以评估 Emacs Lisp 表达式并将其替换为结果吗?
【发布时间】:2010-06-14 06:29:42
【问题描述】:

例如,如果我有文字:

Sum of items is (+ 1 2 3)

我想移动到行尾,计算表达式并用结果替换它,这样它就变成了:

Sum of items is 6

【问题讨论】:

    标签: emacs elisp


    【解决方案1】:

    光标在行尾时,C-u C-x C-e 会将前面带括号的表达式的值插入缓冲区。您可以这样做,然后手动备份并删除原始表达式。如果工作量太大,这里有一个命令,它计算前面的表达式并用它的值替换它:

      (defun replace-last-sexp ()
        (interactive)
        (let ((value (eval (preceding-sexp))))
          (kill-sexp -1)
          (insert (format "%S" value))))
    

    【讨论】:

      【解决方案2】:

      与此相关,您可能会喜欢 Luke Gorrie 的“lively.el”,它提供了文本缓冲区中 emacs lisp 表达式的实时替换。这是一个巧妙的技巧。

      【讨论】:

        【解决方案3】:

        当我在 Google 搜索结果中遇到一个解决方案时,我正在尝试解决这个问题。

        (defun fc-eval-and-replace ()
          "Replace the preceding sexp with its value."
          (interactive)
          (backward-kill-sexp)
          (prin1 (eval (read (current-kill 0)))
                 (current-buffer)))
        

        http://emacs.wordpress.com/2007/01/17/eval-and-replace-anywhere/

        【讨论】:

          【解决方案4】:

          replace-regex 函数可以执行 lisp 来生成替换。

          在有问题的 sexp 在单行上并且是唯一包含括号的简单实例中,您可以匹配 "(.+)" 并替换为 "\,(eval (read \&)) ”。

          【讨论】:

            【解决方案5】:

            如果您通过技术使用 emacs 入门套件,则可以使用“esk-eval-and-replace”功能评估 elisp 性别并替换它们。默认绑定到C-c e

            【讨论】:

              【解决方案6】:

              查看函数 eval-print-last-sexp,您可以使用它构建一些东西

              【讨论】:

                【解决方案7】:

                我的 emacs-fu 不是那么强大,所以我不知道是否有一个命令可以做到这一点,但你可以为它自己制作一个(有点脆弱的)宏......将这些行放在你的 @ 987654321@:

                (fset 'eval-sexp-in-place
                      [?\M-x ?e ?v ?a ?l ?- ?p ?r ?i ?n tab return ?\M-^ ?\M-^ ?\C-\M-b ?\C-\M-k ?\C-d])
                (global-set-key [(control x) (control a)] 'eval-sexp-in-place)
                

                这很好用,但有一个问题:您需要在 sexp 的 结束 (即在最后一个右括号之后)才能使其工作。

                另外,我选择了一个随机的未绑定密钥 (C-x C-a) - 您可以随意将其更改为您喜欢的更多内容。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2012-07-13
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-04-13
                  • 1970-01-01
                  • 2015-07-28
                  相关资源
                  最近更新 更多