Vim中的Lisp(2019)

Hacker News Top 工具

摘要

详细比较了Slimv和Vlime这两个用于交互式Lisp编程的Vim插件,涵盖安装、功能及推荐。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/05/23 15:32

# Vim 中的 Lisp - Susam Pal 来源:https://susam.net/lisp-in-vim.html 作者 **Susam Pal** 于 2019 年 12 月 7 日 ## 引言 https://susam.net/lisp-in-vim.html#introduction 十五年前,在 Vim 中编写 Lisp 代码是一次奇特的冒险。当时没有好的 Vim 插件来辅助 Lisp s-expression 的结构化编辑,也不支持通过在编辑器中嵌入 Lisp 读取-求值-打印-循环(REPL)或调试器进行交互式编程。自那以后,情况有了很大改善。在过去十年中,我们看到两个名为 Slimv (https://github.com/kovisoft/slimv) 和 Vlime (https://github.com/l04m33/vlime) 的 Vim 插件得到了积极开发。Slimv 如今已有超过十年的历史。Vlime 更近一些,目前还不到三年。两者都支持 Lisp 的交互式编程。本文将讨论并比较 Slimv 和 Vlime。我将展示如何开始使用这两个插件,并介绍它们的一些基本功能。不过我不会涵盖所有内容。这不是一篇教程。有关教程,请参阅 *参考文献* (https://susam.net/lisp-in-vim.html#references) 部分。如果你只是想比较这两个插件或寻求快速推荐,请直接跳转到 *Slimv 与 Vlime 的比较* (https://susam.net/lisp-in-vim.html#comparison-of-slimv-and-vlime) 或 *快速推荐* (https://susam.net/lisp-in-vim.html#quick-recommendation) 部分。 ## 目录 https://susam.net/lisp-in-vim.html#contents - 引言 (https://susam.net/lisp-in-vim.html#introduction) - 背景 (https://susam.net/lisp-in-vim.html#background) - Lisp (https://susam.net/lisp-in-vim.html#lisp) - Emacs: SLIME (https://susam.net/lisp-in-vim.html#emacs-slime) - Vim: Slimv/Vlime (https://susam.net/lisp-in-vim.html#vim-slimv-vlime) - Vim 插件管理 (https://susam.net/lisp-in-vim.html#vim-plugin-management) - 软件版本 (https://susam.net/lisp-in-vim.html#software-versions) - 入门 (https://susam.net/lisp-in-vim.html#get-started) - 使用 Slimv 和 SBCL 入门 (https://susam.net/lisp-in-vim.html#get-started-with-slimv-and-sbcl) - 使用 Vlime 和 SBCL 入门 (https://susam.net/lisp-in-vim.html#get-started-with-vlime-and-sbcl) - 使用 Paredit 入门 (https://susam.net/lisp-in-vim.html#get-started-with-paredit) - 使用调试器和检查器 (https://susam.net/lisp-in-vim.html#use-debugger-and-inspector) - 使用 Slimv 的调试器和检查器 (https://susam.net/lisp-in-vim.html#use-debugger-and-inspector-with-slimv) - 使用 Vlime 的调试器和检查器 (https://susam.net/lisp-in-vim.html#use-debugger-and-inspector-with-vlime) - 跟踪函数 (https://susam.net/lisp-in-vim.html#trace-function) - 在 Slimv 中跟踪函数 (https://susam.net/lisp-in-vim.html#trace-function-in-slimv) - 在 Vlime 中跟踪函数 (https://susam.net/lisp-in-vim.html#trace-function-in-vlime) - 实用功能 (https://susam.net/lisp-in-vim.html#nifty-features) - 求值顶层形式 (https://susam.net/lisp-in-vim.html#evaluate-top-level-form) - 彩虹括号 (https://susam.net/lisp-in-vim.html#rainbow-parentheses) - 参数列表 (https://susam.net/lisp-in-vim.html#argument-list) - 全能补全 (https://susam.net/lisp-in-vim.html#omni-completion) - 描述符号 (https://susam.net/lisp-in-vim.html#describe-symbol) - 展开宏 (https://susam.net/lisp-in-vim.html#expand-macro) - 交叉引用 (https://susam.net/lisp-in-vim.html#cross-reference) - 其他 Common Lisp 实现 (https://susam.net/lisp-in-vim.html#other-common-lisp-implementations) - 使用 Slimv 与 CLISP (https://susam.net/lisp-in-vim.html#use-slimv-with-clisp) - 使用 Slimv 与 ECL (https://susam.net/lisp-in-vim.html#use-slimv-with-ecl) - 使用 Vlime 与 CLISP (https://susam.net/lisp-in-vim.html#use-vlime-with-clisp) - 使用 Vlime 与 ECL (https://susam.net/lisp-in-vim.html#use-vlime-with-ecl) - 其他 Lisp 方言 (https://susam.net/lisp-in-vim.html#other-lisp-dialects) - 使用 Slimv 与 MIT/GNU Scheme (https://susam.net/lisp-in-vim.html#use-slimv-with-mit-gnu-scheme) - 使用 Slimv 与 Clojure (https://susam.net/lisp-in-vim.html#use-slimv-with-clojure) - Slimv 与 Vlime 的比较 (https://susam.net/lisp-in-vim.html#comparison-of-slimv-and-vlime) - 快速推荐 (https://susam.net/lisp-in-vim.html#quick-recommendation) - 披露 (https://susam.net/lisp-in-vim.html#disclosure) - 参考文献 (https://susam.net/lisp-in-vim.html#references) ## 背景 https://susam.net/lisp-in-vim.html#background 在开始使用 Slimv 和 Vlime 之前,最好先简要了解一下这些插件的传承背景。这些插件为 Vim 提供了 Lisp 开发环境,因此它们的故事从 Lisp 开始。 ### Lisp https://susam.net/lisp-in-vim.html#lisp Lisp 是一族编程语言,具有独特的全括号前缀记法。它与当今大多数其他流行编程语言(如 C、Python、Ruby 等)截然不同。它的同像性及其强大的宏系统(可以转换任意 Lisp 表达式)使其成为如此灵活、多才多艺、可扩展且内省的语言,以至于描述 Lisp 的文章常常包含“启蒙”一词。例如,请参阅以下文章: - *Beating the Averages* (http://www.paulgraham.com/avg.html)(作者 Paul Graham) - *The Nature of Lisp* (https://www.defmacro.org/ramblings/lisp.html)(作者 Slava Akhmechet) - *How Lisp Became God's Own Programming Language* (https://twobithistory.org/2018/10/14/lisp.html)(作者 Sinclair Target) 在计算史上,各位杰出人物以各种方式描述过 Lisp。Alan Kay 曾这样描述 Lisp: > 有史以来设计的最伟大的单一编程语言。 John Foderaro 曾这样写道: > Lisp 是一种可编程的编程语言。 Eric S. Raymond 在他著名的文章 *How To Become A Hacker* (http://www.catb.org/~esr/faqs/hacker-howto.html) 中表达了学习 Lisp 所体验到的启蒙: > Lisp 值得学习,因为当你终于理解它时,你将获得深刻的启蒙体验。这种体验会让你在余下的编程生涯中成为更好的程序员,即使你从未大量实际使用 Lisp 本身。 Randall Munroe,XKCD (https://xkcd.com/) 网络漫画的创作者,曾以 Lisp 为主题创作了两幅漫画: XKCD 关于 Lisp 的漫画 *Lisp*,作者 Randall Munroe (来源:https://xkcd.com/224/) XKCD 关于 Lisp 循环的漫画 *Lisp Cycles*,作者 Randall Munroe (来源:https://xkcd.com/297/) Lisp 由 John McCarthy 于 1958 年开发,是当今仍在使用的第二古老的编程语言。只有 Fortran 更古老,早一年。当今流行的 Lisp 方言包括 Common Lisp、Scheme 和 Clojure。本文大部分内容将聚焦于 Common Lisp。Scheme 和 Clojure 将在本文末尾简要讨论。 ### Emacs: SLIME https://susam.net/lisp-in-vim.html#emacs-slime 许多 Lisp 程序员在想到编写 Lisp 代码时会立即想到 Emacs。Emacs 是一族文本编辑器。Emacs 编辑器本身通常用某种 Lisp 方言实现。有一个名为 SLIME 的 Emacs 模式为 Lisp 编程提供了出色的支持。SLIME 代表 Superior Lisp Interaction Mode for Emacs。SLIME 最初于 2003 年 8 月发布,由 Eric Marsden 创建,随后由 Luke Gorrie 和 Helmut Eller 进一步开发。它提供了读取-求值-打印-循环(REPL)、集成调试以及表达式的交互式求值,所有这些都直接在编辑器内可用。有许多方便的键盘绑定可用于编译和求值当前缓冲区中的部分或全部代码。SLIME 通过启动一个 Swank TCP 服务器来工作。Swank 是一个用 Common Lisp 编写的后端服务器程序,它监听套接字以接收来自 Emacs 的 SLIME 命令并执行它们。SLIME 非常有用,以至于许多在 Emacs 中编写 Lisp 代码的 Lisp 程序员认为它是不可或缺的。 ### Vim: Slimv/Vlime https://susam.net/lisp-in-vim.html#vim-slimv-vlime Vim 是否有类似 SLIME 的东西?是的,有两个流行的选项: - **Slimv:**它代表 Superior Lisp Interaction Mode for Vim。这是一个由 Tamas Kovacs 创建的 Vim 插件,最初于 2009 年 1 月发布。 - **Vlime:**这是一个由 Kay Z 创建的 Vim 插件,最初于 2017 年 5 月发布。它比 Slimv 新得多。Vlime 比 Slimv 年轻八岁。 这两个插件都使用与 Emacs 中的 SLIME 类似的客户端-服务器架构。两个插件都依赖 Swank 服务器启动。实际上,Slimv 捆绑了一个稍作修改的 Swank 版本,以便它可以启动它并连接以发送要求值的表达式。Vlime 没有捆绑 Swank 服务器,但它提供了一个包装器,可以在需要时自动下载 Swank 服务器。 ## Vim 插件管理 https://susam.net/lisp-in-vim.html#vim-plugin-management 当我十五年前开始使用 Vim 时,我们通常只需下载一个 Vim 插件并将其复制/解压到 `~/.vim` 目录。如今,有一些 Vim 插件管理工具,例如 Pathogen (https://github.com/tpope/vim-pathogen)、Vundle (https://github.com/VundleVim/Vundle.Vim)、vim-plug (https://github.com/junegunn/vim-plug) 等。我不会使用它们中的任何一个,因为我不知道你使用哪一个,而且我不想为每个都写出步骤。事实上,我自己从未使用过任何 Vim 插件管理器。直到 Vim 7,我常常创建一个 `~/.vim/bundle` 目录,然后将每个插件复制到该目录下的自己的子目录中,并将插件的目录路径添加到 Vim 的 `runtimepath` 选项。Vim 8 原生支持包,这使得安装插件和加载它们更加简单。使用 Vim 8,我们可以将每个插件复制到 `~/.vim/pack/plugins/start` 下的自己的目录中,它们在 Vim 启动时会自动加载。此路径中的目录名 `plugins` 只是一个示例。它可以是任何任意名称,Vim 仍然可以正常加载插件。 在本文中,我将使用 Vim 8 对包的原生支持来设置 Vim 插件。唯一的例外是安装 Vlime。Vlime 的顶级目录不是插件目录。插件目录包含在一个名为 `vim` 的子目录中。这不符合 Vim 包中插件的目录结构。因此,在本文中,我将以老式方式设置 Vlime,将其复制到 `~/.vim/bundle`,然后将插件目录的路径添加到 Vim 的 `runtimepath` 选项。 ## 软件版本 https://susam.net/lisp-in-vim.html#software-versions 由于本文涉及多层软件,因此随着这些不同软件随时间变化和发展,本文中所述的一些内容可能在未来不再适用。因此,在本节中,我将记录我在撰写本文时使用的各种软件工具的版本。它们如下: - Debian GNU/Linux 10.1 (buster) - Vim 8.1 - Slimv(Git 仓库最后更新于 2019 年 11 月 30 日,提交 47a0070 (https://github.com/kovisoft/slimv/commits/47a0070)) - Vlime(Git 仓库最后更新于 2017 年 10 月 16 日,提交 065b95f (https://github.com/l04m33/vlime/commits/065b95f)) - Paredit(Git 仓库最后更新于 2019 年 11 月 30 日,提交 d99905a (https://github.com/kovisoft/paredit/commits/d99905a)) - Rainbow Parentheses(Git 仓库最后更新于 2015 年 10 月 29 日,提交 27e7cd7 (https://github.com/junegunn/rainbow_parentheses.vim/commits/27e7cd7)) - SBCL 1.4.16.debian - GNU CLISP 2.49.92 - ECL 16.1.3 - MIT/GNU Scheme 9.1.1 on Debian GNU/Linux 9.11 (stretch) - Clojure 1.10.1 - Quicklisp beta(库最后更新于 2019 年 11 月 30 日) - tmux 2.8 根据你遵循本文的哪些部分,你可能只需要上述工具中的一小部分。只需选择你想尝试的部分,并按照其中的步骤操作即可。它们将引导你完成安装适用于所选部分工具的过程。 无论你选择哪些部分,我建议你务必通读下面的三个“入门”小节。这些小节详细介绍了其他部分未涉及的一些先决条件,例如对 tmux 的支持、Paredit、Vim 中 Python 接口的支持等。 选择 Debian 可能看起来有些奇怪。我希望本文中讨论的命令和步骤能够在自由开源操作系统中轻松重现。Debian 恰好是我最喜欢的。在 Debian 上有效的方法在 Ubuntu 和其他衍生版上通常可以轻松重现,通常无需更改步骤。我相信,将 Debian 的步骤转换为适用于其他操作系统的步骤并不太难。 请注意,Quicklisp(Vlime 的先决条件)在撰写本文时仍是测试版软件。安装 Quicklisp 的实际步骤将来可能会更改。查看 https://www.quicklisp.org/ 以获取安装 Quicklisp 的最新说明。 ## 入门 https://susam.net/lisp-in-vim.html#get-started ### 使用 Slimv 和 SBCL 入门 https://susam.net/lisp-in-vim.html#get-started-with-slimv-and-sbcl 以下是设置并使用 Slimv 的步骤: 1. 使用以下命令安装设置 Slimv 和 Common Lisp 开发环境所需的工具: `` sudo apt-get install vim-nox sbcl tmux git `` Debian 中默认的 Vim 是 `vim.basic`,由 `vim` 包提供,它不支持 Python 接口。Slimv 使用 Vim 脚本、Lisp 和 Python 3 编写,因此它确实需要一个支持 Python 接口的 Vim 包。其中一个这样的包是 `vim-nox`,它提供了 `vim.nox` 命令。安装它会自动更新 `vim` 命令以运行 `vim.nox`。另一个这样的包是 `vim-gtk`,它还提供了 GUI 支持。图形化的 Vim(称为 GVim)可以使用 `gvim` 命令启动。它在桌面环境中运行。在本文中,我将坚持使用 `vim-nox`,因为它轻量级。所有针对 Slimv 的步骤在 `vim-gtk`、MacVim 和 GVim 上也同样适用。 安装 tmux 是可选的。如果 Vim 在 tmux、GNU Screen 或桌面环境中运行,Slimv 可以自动启动 Swank 服务器,因此如果你已经在使用 GNU Screen,则无需安装 tmux。此外,如果你在桌面环境中运行 Slimv,则实际上不需要安装 tmux 或 GNU Screen,尽管如果你希望看到 Swank 在单独的 tmux 或 GNU Screen 窗口中运行(而不是单独的终端窗口),也可以安装它们。在本文中,我将假设 Vim 在 tmux 内运行。如果要在没有桌面环境、tmux 或 GNU Screen 的终端中运行 Slimv,则必须手动运行 Swank 服务器。下面的第 4 点解释了如何操作。 2. 安装 Slimv 非常简单。以下是一种方法: `` git clone https://github.com/kovisoft/slimv.git ~/.vim/pack/plugins/start/slimv vim +'helptags ~/.vim/pack/plugins/start/slimv/doc' +q `` 就这样!Slimv 就设置好了。就是这么简单。上面的命令展示了如何仅用两个 shell 命令设置 Slimv。你也可以使用 Vim 插件管理器来安装 Slimv,但这里我不介绍。 3. 这是一个可选步骤。如果你在 tmux、GNU Screen 或桌面环境中运行 Vim,Slimv 支持自动启动 Swank 服务器。要启动 tmux,请输入以下命令: `` tmux `` 如果你使用 GNU screen 或桌面环境,则不必运行 tmux。如果你不使用 tmux、GNU Screen 或桌面环境,则必须按照下一点所述手动启动 Swank 服务器。 4. 仅当你未使用 tmux、GNU Screen 或桌面环境时,才需要此步骤。以下命令展示了如何手动启动 Swank 服务器: `` sbcl --load ~/.vim/pack/plugins/start/slimv/slime/start-swank.lisp `` 如果

相似文章

Lisp在网页应用中的运用(2001)

Hacker News Top

Paul Graham结合自己创办Viaweb的经验,讨论了在网页应用中使用Lisp的优势,包括语言自由度、增量开发以及快速修复bug。

JavaScript 精简

Lobsters Hottest

LispE 是 NAVER 开发的一个紧凑的 Lisp 方言,它结合了函数式和数组语言特性,并支持 PyTorch 和 llama.cpp 等 AI 库。

vi 家族

Hacker News Top

本文对 vi 系列文本编辑器及其衍生克隆版本进行了历史回顾和分类整理,涵盖了从 1977 年的原始版本到 Vim 等现代衍生版本。