How to get code completion in spacemacs for OCaml Jane Street Core library?

Hello everyone,

I’m a beginner with OCaml and am making my way through the wonderful RealWorldOCaml book. I’m using Emacs via Spacemacs flavor and I like the simplicity of the interface as opposed to an IDE.

However, I’m not able to get proper code completion for the jane stree core library, which is used by the book. I’ve made sure to update the .ocamlinit as per the book instructions here https://dev.realworldocaml.org/install.html

But this is what appears a the code completion level, which does not show up String.rsplit2 but sticks to the OCaml Std lib definitions.

Could you please guide me a bit here? :slight_smile:

Possibly silly sanity check question: is this after a open Core line?

Spacemacs seems to have been fine for me for cross lib completion, but I’ll need to double check

Have you created (or built, e.g., with dune) a .merlin file? That is required for merlin to make any autocompletions outside of the standard library.

@darrenldl and @bcc32, thanks to both your suggestion I’m now able to get the completion fine

I added the PKG core to .merlin and then when I do the open Core, it gives the correct completion

But, this seems to be temporary

However, I also saw the config in .merlin keeps getting translated into

EXCLUDE_QUERY_DIR
B /Users/eklavya/.opam/default/lib/base
B /Users/eklavya/.opam/default/lib/base/caml
B /Users/eklavya/.opam/default/lib/base/shadow_stdlib
B /Users/eklavya/.opam/default/lib/sexplib0
B /Users/eklavya/.opam/default/lib/stdio
B _build/default/.sum.eobjs/byte
S /Users/eklavya/.opam/default/lib/base
S /Users/eklavya/.opam/default/lib/base/caml
S /Users/eklavya/.opam/default/lib/base/shadow_stdlib
S /Users/eklavya/.opam/default/lib/sexplib0
S /Users/eklavya/.opam/default/lib/stdio
S .
FLG -w @a-4-29-40-41-42-44-45-48-58-59-60-40 -strict-sequence -strict-formats -short-paths -keep-locs

Dune will re-generate the .merlin file when you recompile. My guess is that you have base, but not core, declared as a dependency in your dune file.

Guessing a bit based on what’s in that chapter of Real World Ocaml, it’s possible that you want to just open Base instead of Core for now. But if you did want to use Core, you would have to add it to your dune file.

Hmm, thanks @Levi_Roth that makes sense now.

After changing the base to core in the dune file I can see the following changes to the .merlin file

EXCLUDE_QUERY_DIR
B /Users/eklavya/.opam/default/lib/base
B /Users/eklavya/.opam/default/lib/base/caml
B /Users/eklavya/.opam/default/lib/base/md5
B /Users/eklavya/.opam/default/lib/base/shadow_stdlib
B /Users/eklavya/.opam/default/lib/base_bigstring
B /Users/eklavya/.opam/default/lib/base_quickcheck
B /Users/eklavya/.opam/default/lib/bin_prot
B /Users/eklavya/.opam/default/lib/bin_prot/shape
B /Users/eklavya/.opam/default/lib/core
B /Users/eklavya/.opam/default/lib/core_kernel
B /Users/eklavya/.opam/default/lib/core_kernel/base_for_tests
B /Users/eklavya/.opam/default/lib/fieldslib
B /Users/eklavya/.opam/default/lib/jane-street-headers
B /Users/eklavya/.opam/default/lib/ocaml
B /Users/eklavya/.opam/default/lib/ocaml/threads
B /Users/eklavya/.opam/default/lib/parsexp
B /Users/eklavya/.opam/default/lib/ppx_assert/runtime-lib
B /Users/eklavya/.opam/default/lib/ppx_bench/runtime-lib
B /Users/eklavya/.opam/default/lib/ppx_compare/runtime-lib
B /Users/eklavya/.opam/default/lib/ppx_enumerate/runtime-lib
B /Users/eklavya/.opam/default/lib/ppx_expect/collector
B /Users/eklavya/.opam/default/lib/ppx_expect/common
B /Users/eklavya/.opam/default/lib/ppx_expect/config
B /Users/eklavya/.opam/default/lib/ppx_hash/runtime-lib
B /Users/eklavya/.opam/default/lib/ppx_inline_test/config
B /Users/eklavya/.opam/default/lib/ppx_inline_test/runtime-lib
B /Users/eklavya/.opam/default/lib/ppx_module_timer/runtime
B /Users/eklavya/.opam/default/lib/ppx_sexp_conv/runtime-lib
B /Users/eklavya/.opam/default/lib/sexplib
B /Users/eklavya/.opam/default/lib/sexplib/unix
B /Users/eklavya/.opam/default/lib/sexplib0
B /Users/eklavya/.opam/default/lib/spawn
B /Users/eklavya/.opam/default/lib/splittable_random
B /Users/eklavya/.opam/default/lib/stdio
B /Users/eklavya/.opam/default/lib/time_now
B /Users/eklavya/.opam/default/lib/typerep
B /Users/eklavya/.opam/default/lib/variantslib
B _build/default/.sum.eobjs/byte
S /Users/eklavya/.opam/default/lib/base
S /Users/eklavya/.opam/default/lib/base/caml
S /Users/eklavya/.opam/default/lib/base/md5
S /Users/eklavya/.opam/default/lib/base/shadow_stdlib
S /Users/eklavya/.opam/default/lib/base_bigstring
S /Users/eklavya/.opam/default/lib/base_quickcheck
S /Users/eklavya/.opam/default/lib/bin_prot
S /Users/eklavya/.opam/default/lib/bin_prot/shape
S /Users/eklavya/.opam/default/lib/core
S /Users/eklavya/.opam/default/lib/core_kernel
S /Users/eklavya/.opam/default/lib/core_kernel/base_for_tests
S /Users/eklavya/.opam/default/lib/fieldslib
S /Users/eklavya/.opam/default/lib/jane-street-headers
S /Users/eklavya/.opam/default/lib/ocaml
S /Users/eklavya/.opam/default/lib/ocaml/threads
S /Users/eklavya/.opam/default/lib/parsexp
S /Users/eklavya/.opam/default/lib/ppx_assert/runtime-lib
S /Users/eklavya/.opam/default/lib/ppx_bench/runtime-lib
S /Users/eklavya/.opam/default/lib/ppx_compare/runtime-lib
S /Users/eklavya/.opam/default/lib/ppx_enumerate/runtime-lib
S /Users/eklavya/.opam/default/lib/ppx_expect/collector
S /Users/eklavya/.opam/default/lib/ppx_expect/common
S /Users/eklavya/.opam/default/lib/ppx_expect/config
S /Users/eklavya/.opam/default/lib/ppx_hash/runtime-lib
S /Users/eklavya/.opam/default/lib/ppx_inline_test/config
S /Users/eklavya/.opam/default/lib/ppx_inline_test/runtime-lib
S /Users/eklavya/.opam/default/lib/ppx_module_timer/runtime
S /Users/eklavya/.opam/default/lib/ppx_sexp_conv/runtime-lib
S /Users/eklavya/.opam/default/lib/sexplib
S /Users/eklavya/.opam/default/lib/sexplib/unix
S /Users/eklavya/.opam/default/lib/sexplib0
S /Users/eklavya/.opam/default/lib/spawn
S /Users/eklavya/.opam/default/lib/splittable_random
S /Users/eklavya/.opam/default/lib/stdio
S /Users/eklavya/.opam/default/lib/time_now
S /Users/eklavya/.opam/default/lib/typerep
S /Users/eklavya/.opam/default/lib/variantslib
S .
FLG -w @a-4-29-40-41-42-44-45-48-58-59-60-40 -strict-sequence -strict-formats -short-paths -keep-locs

Also, on further experimentation with the imports I observed that if the file has some other modules opened then the completion correctly opts for the core but if I comment out those core modules then it falls back to std.

After commenting out the Float module usage

Is it possible to rectify this?