【问题标题】:How to make Merlin (OCaml) ignore some lines?如何让 Merlin (OCaml) 忽略某些行?
【发布时间】:2014-10-29 20:14:10
【问题描述】:

我使用 Merlin 和 Emacs 来编辑 OCaml 代码。它通常工作得很好,但我遇到了以下问题:

我需要使用由其他人构建的包,该包向 OCaml 添加了一些不是该语言原生的关键字。由于我使用包来编译代码,因此编译效果很好。另一方面,Merlin 发疯了,认为新的关键字是错误的。幸运的是,新关键字只出现在行首,所以我的代码如下所示:

let square x = x * x;;

let rec fact x =
    if x <= 1 then 1 else x * fact (x - 1);;

FOO "This syntax is not standard Ocaml" square fact;;

FOO 是新关键字。 Merlin 会抱怨并说Unbound constructor FOO。所以问题是,我可以让马林忽略那条线吗?或者你能想出一个技巧来将语法包装成 Merlin 不会抱怨的东西吗?

【问题讨论】:

  • 我认为你无能为力。实际上,这种语言不再是 OCaml,Merlin 将无法处理它。您可能可以作弊,方法是编写一个将FOO 定义为适当函数或数据构造函数的模块,然后仅为 Merlin 导入该模块。

标签: emacs ocaml merlin


【解决方案1】:

Merlin 不会也不会 (afaik) 支持任意语法扩展,但它们确实对最常用的 camlp4 扩展(如 pa_lwt、pa_macro 等)提供了解析技巧。此外,最新的 merlin 版本将跳过未知行并恢复解析,所以'go-to-definition' 和 type throwback 在文件的其他部分没有被语法扩展修改。

【讨论】:

    【解决方案2】:

    ocp-index 是一个替代方案,虽然完全不同,但提供了 Merlin 功能的一个子集(库中的补全和文档、文件导航)。

    Ocp-index 不会解释或键入您当前的文件(它只会扫描它是否打开等),因此它不会受到任意扩展名的困扰。

    【讨论】:

      猜你喜欢
      • 2018-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-30
      • 2019-10-29
      • 2010-10-15
      • 1970-01-01
      相关资源
      最近更新 更多