【问题标题】:Elisp programming - what's the best setup?Elisp 编程 - 最好的设置是什么?
【发布时间】:2011-03-08 20:58:30
【问题描述】:

Emacs 中有各种很酷的编程语言模式,都是用 elisp 编写的,但显然没有对 elisp 本身的特殊支持。

由于 slime 不适用于 elisp,我问自己是否所有 elisp 代码都只是在 scratch 缓冲区中被黑了? 编写 elisp 时是否不需要像 slime 这样的东西,还是根本不存在?有人使用 ECB 和语义来进行更大的 elisp 项目吗?

【问题讨论】:

  • 您在寻找什么功能?诚然,我不使用其他 lisp,所以我不熟悉 slime 之类的东西,但我从未发现 Emacs 缺乏对 elisp 开发的支持。可能有现有的方法可以做你想做的事。
  • 因为我是从 elisp 开始的,所以这是一个更普遍的问题。我想知道其他人如何处理 elisp 编程,只是为了确保我不会错过一些重要的事情。 'elisp setup' 的 google-space 几乎是空的。如果它只是打开一个 .el 文件,使用加载的 emacs-lisp-mode 和内置调试器(或 edebug),我很放心。

标签: emacs development-environment elisp


【解决方案1】:

ielm 是 Emacs Lisp REPL:交互式 Emacs Lisp 模式。

M-x ielm 让你到达那里。

【讨论】:

  • 但似乎没有一种好方法将缓冲区的一部分发送到进程。我想做 elpy 或 ess 让我做的事情,即向交互式进程发送一个区域、缓冲区或文件,这样我就可以在那里玩它
  • @Dodgie:“发送一个区域”做M-x eval-region RET。通常你会使用C-M-xC-x C-e,尽管如此。
【解决方案2】:

Emacs 本身带有 Emacs Lisp 支持。基本到中级的东西,例如完成 (M-TAB)、库搜索 (M-x apropos)、文档 (C-h fC-h vC-h S)、即时运行代码 (C-M-x、@ 987654327@) 直接在运行的 Emacs 中操作。

Slime 的主要目的是与外部进程交互。对于 Emacs Lisp,您不需要它(除非您正在为不同版本的 Emacs 进行开发,但这是一个罕见的问题)。

ECB 和语义的特性主要用于大型项目(由多个源文件组成)。人们不倾向于用 Emacs Lisp 编写大型项目。

【讨论】:

  • 甚至可以说,Slime 的目的是让 CL 开发几乎与开箱即用的 Elisp 一样方便。
【解决方案3】:

总是有emacs-lisp-mode,每当您编辑 .el 文件时,它(至少在 Emacs 23 中)会自动加载。这似乎是许多 emacs lisp 黑客用来编写程序的方法。它有一些不错的特性(比如编译或评估缓冲区、一些调试工具、分析)。 *scratch* 缓冲区默认是从 lisp-interaction-mode 编辑的,这有点不同。

它不像 slime 那样功能齐全(elisp 的社区比普通 lisp 小得多),但它确实有效。您必须翻阅文档并尝试使用该模式才能了解您可以使用哪些功能。

【讨论】:

  • 所以有 3 种选择:用于交互使用的暂存缓冲区和 ielm 以及用于更“严肃”的 elisp 编程的 emacs-lisp-mode。就在刚才,我发现了大量用于 elisp 的 Yasn-ps,甚至是文件头,这可能会进一步加快速度:emacswiki.org/emacs-en/AndyStewart_YasnippetTemplate#toc2
  • SLIME 是因为一个 elisp 黑客想要像 edebug、ielm 和 Common Lisp 的相关工具一样好的东西而编写的。这很难验证,但我猜 elisp 程序员的数量比 Common Lisp 程序员的数量要多得多。
【解决方案4】:

如前所述,Emacs 已经是权威的 elisp 开发环境,并且在内部为您提供了您可能想要的大部分功能。

如果您想跳转到尚未加载(并且缺少自动加载声明)的函数定义,您可能还可能使用 ctags/etags 为您的 elisp 代码库生成外部索引。 M-x find-function RET 否则会处理这个问题。 (我将它绑定到 C-hC-f

“apropos”函数通常是查找事物的关键。为了方便访问,我使用以下绑定:

(define-prefix-command 'Apropos-Prefix nil "Apropos (a,c,d,i,l,v,C-v)")
(global-set-key (kbd "C-h C-a") 'Apropos-Prefix)
(define-key Apropos-Prefix (kbd "a")   'apropos)
(define-key Apropos-Prefix (kbd "C-a") 'apropos)
(define-key Apropos-Prefix (kbd "c")   'apropos-command)
(define-key Apropos-Prefix (kbd "d")   'apropos-documentation)
(define-key Apropos-Prefix (kbd "i")   'info-apropos)
(define-key Apropos-Prefix (kbd "l")   'apropos-library)
(define-key Apropos-Prefix (kbd "v")   'apropos-variable)
(define-key Apropos-Prefix (kbd "C-v") 'apropos-value)

;; Use prefix arg (C-u) to see more results for a call,
;; or uncomment the next line to do this by default:
;; (setq apropos-do-all t)
;; See C-h v apropos-do-all RET for details.

我还启用了eldoc-mode,并且绑定了imenu-ido-goto-symbol(但很少使用)。

还有其他库可能被证明是有用的。例如,我知道有些人以ParEdit 发誓。诚然,要搜索对编写 elisp 有用的 elisp 库有点困难。我不确定 Emacs Wiki 是否有这个类别?

【讨论】:

    【解决方案5】:
    • 我通常使用emacs-lisp-mode,而不是*scratch* 的默认模式。 99% 的时间我都想保存一次性的交互式测试(至少暂时如此),因此我更经常使用 *.el 文件而不是 *scratch*

    • Icicles 在与 Emacs Lisp 交互时有很大帮助。方法太多,这里就不一一列举了。这里有两个概述可以提供一个想法:

    http://www.emacswiki.org/emacs/EmacsNewbieWithIcicles

    http://www.emacswiki.org/emacs/Icicles_-_Nutshell_View

    【讨论】:

      【解决方案6】:

      我想把这个添加到你的 .emacs

      (define-key emacs-lisp-mode-map (kbd "M-.") 'find-function-at-point)
      

      会很有帮助。

      【讨论】:

      • M-. 在最新的 Emacs 版本中已经默认(通过 xref 库)这样做了。
      【解决方案7】:
      M-x edebug-defun 
      

      调试函数 我认为这些是 elisp 最好的调试工具。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-03
        • 2010-10-29
        • 2011-06-06
        • 1970-01-01
        • 1970-01-01
        • 2015-03-18
        • 2010-09-21
        • 1970-01-01
        相关资源
        最近更新 更多