Merlin抱怨同一个项目缺少模块

Rom*_*kov 8 emacs ocaml utop merlin

我是Ocaml的新手,只是用emacs,merlin和flycheck设置我的开发环境.除了一件事之外,一切都或多或少地起作用:merlin似乎无法识别同一项目中模块之间的依赖关系.

例如,我有一个包含两个模块的测试项目:main.ml和awesome.ml.

这是我的main.ml引用第二个模块awesome.ml

(* main.ml *)
open Core
module A = Awesome
let _ =
   Printf.printf "hello \n Converted to string we get: %s\n"
     (A.str_of_t (A.succ A.one_t));
Run Code Online (Sandbox Code Playgroud)

这是awesome.ml:

(* awesome.ml *) 
type t = int
let one_t = 1
let succ i = i + 1
let str_of_t = string_of_int
Run Code Online (Sandbox Code Playgroud)

当我发送main.ml缓冲区以使用utop-eval-buffer函数评估到utop时,我收到一个错误:"错误:未绑定的模块很棒"

我在项目的根目录中有.merlin,它有S指令.我知道它是由梅林发现的,因为它没有抱怨"开放核心"

S src
PKG core lwt ounit
B _build/src
B +threads
Run Code Online (Sandbox Code Playgroud)

这是我的_tags:

<src/**>: include
<src/**>: package(oUnit), package(core)
true:thread
Run Code Online (Sandbox Code Playgroud)

ocamlbuild的常规项目编译工作正常,没有错误.这是Makefile

## Makefile
default: main
main: main.native

test: test.native

%.native:
   ocamlbuild -use-ocamlfind $@
   mv $@ $*

.PHONY: test default
Run Code Online (Sandbox Code Playgroud)

任何想法为什么在utop中无法识别Awesome模块或这是预期的行为?

ivg*_*ivg 10

一旦你编译了它们,Merlin就会看到其他模块(事实上,一旦你编译了它的接口).所以鉴于你.merlin的正确,它会在你运行编译后看到所有内容.您的文件确实应该在一个src文件夹中,即您的项目布局,基于您的.merlin文件应如下所示:

Makefile
.merlin
src/
   awesome.ml
   main.ml
Run Code Online (Sandbox Code Playgroud)

这不是必需的布局,但这是您向Merlin描述的布局.我怀疑它不一样的原因是你的原因Makefile.

PS正如一个侧面说明,没有在你的代码一个小问题:你应该打开Core.Std没有Core.