将您的编辑器转变为一个功能齐全的 OCaml IDE
这篇文章简要介绍了一些您可以在编辑器中使用的工具,以便在使用 OCaml 开发时获得更流畅的体验。我们正在努力使这些工具能够与 OPAM 开箱即用,因此我们将在此处以及 OPAM 工具本身发布关于它们的博文。
在撰写本文时,这些工具的接口可用于 Emacs 和 Vim。目前正在努力为其他编辑器添加支持,包括 Acme 和 Sublime Text 3。
概述
第一个工具,ocp-indent,负责处理 OCaml 文件的缩进任务。它是一个 OCaml 可执行文件,可以从命令行或直接从您的编辑器中使用。
第二个工具,merlin 对您的源文件执行“静态分析”。然后使用该分析来提供错误报告、源代码浏览、自动完成等功能。
用于缩进的 ocp-indent
大多数编辑器都提供某种“开箱即用”的缩进功能。但是,最近 OCaml 社区的大部分人已经转向使用 ocp-indent 进行微调缩进
- 它紧跟语言的发展,很好地处理了最新的特性,
- 即使您的同事使用不同的编辑器,它也会进行相同的缩进,
- 它更灵活,例如支持特定于项目的样式;
实际上,ocp-indent 的缩进行为可以通过多个选项进行配置,从而指导它在遇到不同的 OCaml 语言结构时的行为。这些选项可以设置在配置文件中(例如 此示例配置)或在从命令行调用 ocp-indent 时直接作为参数传递。
最后,ocp-indent 还会识别 OCaml 生态系统中的一些常用语法扩展并对其进行有意义的缩进,而您的编辑器可能不会。
用于分析的 Merlin
Merlin 通过提供有关代码的交互式反馈来增强您编辑 OCaml 代码的体验。
在幕后,它维护着您正在编辑的文件的“代码模型”。对于项目中的其他文件,它将使用编译器生成的输出;编辑后定期重建以使模型与您的代码同步。
从这个代码模型中,它提供了许多有用的功能
- 作用域/上下文感知的自动完成,如 IntelliSense;
- 查询文件中任何表达式的类型;
- 快速报告类型和语法错误,缩短编辑周期;
- 跳转到定义;
- 列出当前缓冲区中标识符的使用情况。
快速入门
假设 opam 已经安装在您的系统上,您只需要调用
$ opam install ocp-indent merlin
来安装这两个工具。
**Emacs。**您需要将 opam/share
添加到 'load-path
中,然后加载插件特定的文件。这可以通过将以下几行添加到您的 .emacs
中来完成
(setq opam-share (substring (shell-command-to-string "opam config var share 2> /dev/null") 0 -1))
(add-to-list 'load-path (concat opam-share "/emacs/site-lisp"))
(require 'ocp-indent)
(require 'merlin)
有关 merlin 设置的更多信息,您可以查看 专门的 merlin wiki。
**Vim & ocp-indent。**我们建议使用 ocp-indent-vim 插件而不是默认插件。它提供了“边输入边缩进”的交互式缩进,而官方模式仅提供手动调用的缩进函数,而不提供被动缩进。
此模式确实需要使用 Python 支持编译 vim,而官方模式则不需要。
安装就像克隆 ocp-indent-vim 并将目录添加到您的运行时路径一样简单。
假设您的克隆位于 ~/my-clone-of/ocp-indent-vim
中,请将此添加到 .vimrc
中
set rtp+=~/my-clone-of/ocp-indent-vim
**Vim & merlin。**在 专门的 merlin wiki 上提供了有关 merlin 安装过程的全面指南。再次强调,如果您只想开始使用,以下几行包含您需要的所有内容。
在 vim 中加载 merlin 归结为将插件目录添加到运行时路径。但是,由于 merlin 依赖于您当前的 opam 切换,因此更灵活的方法是找到当前切换并将其用作基本目录。
此代码正是这样做的:它找到当前的 opam share 目录,然后将 merlin 插件子目录添加到当前的运行时路径。将其添加到您的 .vimrc
中
let g:opamshare = substitute(system('opam config var share'),'\n$','','''')
execute "set rtp+=" . g:opamshare . "/merlin/vim"
与您的项目集成
为了与编译器保持同步,Merlin 需要一些关于项目结构的信息:构建和源目录、包依赖项、语法扩展。此结构可以在项目根目录中的 .merlin
文件中描述。Merlin 项目的 .merlin
文件说明了语法。
下次您在编辑器中打开 OCaml 文件时,将加载 .merlin
文件。
要从跨文件代码导航中获益,您还需要通过将 -bin-annot
标志传递给 OCaml 编译器来打开“cmt”文件的生成。您可以在 OCaml 4.01 及更高版本中,通过在 _tags
文件中添加 bin_annot
标签来在 ocamlbuild
中执行此操作。