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.
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.
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.