From eeb707ec548271190dd2f37321ff94e21fe63461 Mon Sep 17 00:00:00 2001 From: Amir Chaudhry Date: Tue, 19 Aug 2014 20:27:15 +0100 Subject: [PATCH 1/6] Add first draft of @def-lkb's post This guest post covers both ocp-indent and merlin --- turn-your-editor-into-an-ocaml-ide.md | 130 ++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 turn-your-editor-into-an-ocaml-ide.md diff --git a/turn-your-editor-into-an-ocaml-ide.md b/turn-your-editor-into-an-ocaml-ide.md new file mode 100644 index 0000000..99e3a44 --- /dev/null +++ b/turn-your-editor-into-an-ocaml-ide.md @@ -0,0 +1,130 @@ +title: "Turn your editor into a full fledged OCaml IDE" +authors: "Frederic Bour" {"https://github.com/def-lkb"} +date: "2014-08-20" +--BODY-- + +This post is short presentation of a couple of tools you can use with your +editor to have a smoother experience while developping in OCaml. + +Right now, your favorite editor has to be *emacs* or *vim*. Using these tools +from other editors is certainly doable, some porting efforts already exist for +[Acme](https://github.com/raphael-proust/merlin-acme) and +[Sublime Text 3](https://github.com/def-lkb/sublime-text-merlin). + +# Overview + +One of these tools, [ocp-indent](http://www.typerex.org/ocp-indent.html), +handles the task of indenting your OCaml files. It is an OCaml executable than +can be used from the command line or directly from your editor. + +The other is [merlin](http://the-lambda-church.github.io/merlin/) and runs some +"static analysis" on your file. This translates into error reporting, source +browsing, auto-completion and more. + +## Ocp-indent for indentation + +Most editors provides some kind of indentation "out of the box". +However recently a good chunk of the OCaml community has moved to using +ocp-indent for fine-tuned indentation: + +- it follows language evolution closely, nicely handling recent features, +- it will indent the same even if your co-worker has a different editor, +- it is more flexible, for instance by enabling project-specific style; + +Indeed the indentation behavior of ocp-indent can be configured through several +options, directing how it will behave when encountering different constructions +of the OCaml language. These options can be set in a configuration file or +direcly as parameters when invoked from the command line. An example +configuration file is available +[here](https://github.com/OCamlPro/ocp-indent/blob/master/.ocp-indent). + +Finally, ocp-indent can also recognize some common syntax extensions of the +OCaml ecosystem and will keep a meaningful indentation in presence of these, +while your editor probably will not. + +## Merlin for analysis + +Merlin will enhance your experience editing OCaml code by providing interactive +feedback about your code. + +Under the hood, it maintains a "code model" of the file you are editing. For +other files in your project, it will use the output produced by the compiler; +rebuild regularly after edition to keep it synchronized. + +From this code model, it provides a lot of useful features: + +- scope/context-aware completion, like IntelliSense; +- querying the type of any expression in the file; +- quick reporting of type and syntax errors, for short editing cycle; +- jumping to definition; +- list usages of identifiers in current buffer. + +# Quick start + +Assuming opam is already installed on your system, you just need to invoke + + $ opam install ocp-indent merlin + +to install these two tools. + +**Emacs.** You will have to add `opam/share` to `'load-path` and load plugin +specific file. This can be done +by adding the following lines to your `.emacs`: + +```lisp +(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) +``` + +For more information about merlin setup, you can look at +[the dedicated wiki](https://github.com/the-lambda-church/merlin/wiki). + +**Vim & ocp-indent.** We recommend using the +[ocp-indent-vim](https://github.com/def-lkb/ocp-indent-vim) plugin instead of +the default one. It provides interactive indentation "as you type", while the +official mode only provide an indenting function to call manually but +no passive indentation. + +This mode does require vim to be compiled with python support, while the +official one doesn't. + +Installing is as simple as cloning +[ocp-indent-vim](https://github.com/def-lkb/ocp-indent-vim) and adding the +directory to your runtime-path. + +Assuming your clone is in `~/my-clone-of/ocp-indent-vim`, add this to `.vimrc`: + +```viml +set rtp+=~/my-clone-of/ocp-indent-vim +``` + +**Vim & merlin.** A comprehensive guide to the installation procedure for +merlin is available on [the dedicated +wiki](https://github.com/the-lambda-church/merlin/wiki). Once again if you +just want to get started, the following lines are enough. + +Loading merlin in vim boils down to adding plugin directory in the +runtime-path. However as merlin depends on your current opam switch, a more +flexible way is to find the current switch and use it as base directory. + +This code does exactly that: find current opam share directory, then add +merlin plugin directory. Add it to your `.vimrc`: + +```viml +let g:opamshare = substitute(system('opam config var share'),'\n$','','''') +execute "set rtp+=" . g:opamshare . "/merlin/vim" +``` + +## Integrating with your project + +To maintain synchronization with the compiler, merlin needs some information +about the structure of your project: build and source directories, package +dependencies, syntax extensions. +You can see merlin's .merlin [here](https://github.com/the-lambda-church/merlin/blob/master/.merlin). + +You have to put it at the root directory of your project, and the .merlin will be loaded next time you open an OCaml file in the editor. + +To benefit of code navigation accross files you'll also need to generate "cmt" files. Pass the `-bin-annot` flag to the compiler. From d352e20921f6ced3ca0472886884324627cb9209 Mon Sep 17 00:00:00 2001 From: Jeremy Yallop Date: Wed, 20 Aug 2014 12:42:08 +0100 Subject: [PATCH 2/6] Spelling etc. --- turn-your-editor-into-an-ocaml-ide.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/turn-your-editor-into-an-ocaml-ide.md b/turn-your-editor-into-an-ocaml-ide.md index 99e3a44..755eca0 100644 --- a/turn-your-editor-into-an-ocaml-ide.md +++ b/turn-your-editor-into-an-ocaml-ide.md @@ -4,9 +4,9 @@ date: "2014-08-20" --BODY-- This post is short presentation of a couple of tools you can use with your -editor to have a smoother experience while developping in OCaml. +editor to have a smoother experience while developing in OCaml. -Right now, your favorite editor has to be *emacs* or *vim*. Using these tools +Right now, your favourite editor has to be *emacs* or *vim*. Using these tools from other editors is certainly doable, some porting efforts already exist for [Acme](https://github.com/raphael-proust/merlin-acme) and [Sublime Text 3](https://github.com/def-lkb/sublime-text-merlin). @@ -14,7 +14,7 @@ from other editors is certainly doable, some porting efforts already exist for # Overview One of these tools, [ocp-indent](http://www.typerex.org/ocp-indent.html), -handles the task of indenting your OCaml files. It is an OCaml executable than +handles the task of indenting your OCaml files. It is an OCaml executable that can be used from the command line or directly from your editor. The other is [merlin](http://the-lambda-church.github.io/merlin/) and runs some @@ -23,7 +23,7 @@ browsing, auto-completion and more. ## Ocp-indent for indentation -Most editors provides some kind of indentation "out of the box". +Most editors provide some kind of indentation "out of the box". However recently a good chunk of the OCaml community has moved to using ocp-indent for fine-tuned indentation: @@ -31,10 +31,10 @@ ocp-indent for fine-tuned indentation: - it will indent the same even if your co-worker has a different editor, - it is more flexible, for instance by enabling project-specific style; -Indeed the indentation behavior of ocp-indent can be configured through several +Indeed the indentation behaviour of ocp-indent can be configured through several options, directing how it will behave when encountering different constructions of the OCaml language. These options can be set in a configuration file or -direcly as parameters when invoked from the command line. An example +directly as parameters when invoked from the command line. An example configuration file is available [here](https://github.com/OCamlPro/ocp-indent/blob/master/.ocp-indent). @@ -85,10 +85,10 @@ For more information about merlin setup, you can look at **Vim & ocp-indent.** We recommend using the [ocp-indent-vim](https://github.com/def-lkb/ocp-indent-vim) plugin instead of the default one. It provides interactive indentation "as you type", while the -official mode only provide an indenting function to call manually but +official mode only provides an indenting function to call manually but no passive indentation. -This mode does require vim to be compiled with python support, while the +This mode does require vim to be compiled with Python support, while the official one doesn't. Installing is as simple as cloning @@ -127,4 +127,4 @@ You can see merlin's .merlin [here](https://github.com/the-lambda-church/merlin/ You have to put it at the root directory of your project, and the .merlin will be loaded next time you open an OCaml file in the editor. -To benefit of code navigation accross files you'll also need to generate "cmt" files. Pass the `-bin-annot` flag to the compiler. +To benefit of code navigation across files you'll also need to generate "cmt" files. Pass the `-bin-annot` flag to the compiler. From 6e123793fabfdef9de2df4e14d74b15d18d5d028 Mon Sep 17 00:00:00 2001 From: Jeremy Yallop Date: Wed, 20 Aug 2014 12:45:30 +0100 Subject: [PATCH 3/6] Reword according to @Chris00's suggestion. --- turn-your-editor-into-an-ocaml-ide.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/turn-your-editor-into-an-ocaml-ide.md b/turn-your-editor-into-an-ocaml-ide.md index 755eca0..ecd3311 100644 --- a/turn-your-editor-into-an-ocaml-ide.md +++ b/turn-your-editor-into-an-ocaml-ide.md @@ -6,8 +6,9 @@ date: "2014-08-20" This post is short presentation of a couple of tools you can use with your editor to have a smoother experience while developing in OCaml. -Right now, your favourite editor has to be *emacs* or *vim*. Using these tools -from other editors is certainly doable, some porting efforts already exist for +At the time of writing, an interface to these tools is only available +for Emacs and Vim. However, using the tools from other editors is definitely +possible and some efforts exist for [Acme](https://github.com/raphael-proust/merlin-acme) and [Sublime Text 3](https://github.com/def-lkb/sublime-text-merlin). From 11e08fa4402419a6bd28779c7099bb7ea9adb804 Mon Sep 17 00:00:00 2001 From: Jeremy Yallop Date: Wed, 20 Aug 2014 13:02:04 +0100 Subject: [PATCH 4/6] Rewording. --- turn-your-editor-into-an-ocaml-ide.md | 68 +++++++++++++-------------- 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/turn-your-editor-into-an-ocaml-ide.md b/turn-your-editor-into-an-ocaml-ide.md index ecd3311..a99a8be 100644 --- a/turn-your-editor-into-an-ocaml-ide.md +++ b/turn-your-editor-into-an-ocaml-ide.md @@ -3,23 +3,22 @@ authors: "Frederic Bour" {"https://github.com/def-lkb"} date: "2014-08-20" --BODY-- -This post is short presentation of a couple of tools you can use with your +This post is a short presentation of a couple of tools you can use with your editor to have a smoother experience while developing in OCaml. -At the time of writing, an interface to these tools is only available -for Emacs and Vim. However, using the tools from other editors is definitely -possible and some efforts exist for -[Acme](https://github.com/raphael-proust/merlin-acme) and +At the time of writing, interfaces to these tools are available for +Emacs and Vim. Efforts are underway to add support for other editors, +including [Acme](https://github.com/raphael-proust/merlin-acme) and [Sublime Text 3](https://github.com/def-lkb/sublime-text-merlin). # Overview -One of these tools, [ocp-indent](http://www.typerex.org/ocp-indent.html), +The first tool, [ocp-indent](http://www.typerex.org/ocp-indent.html), handles the task of indenting your OCaml files. It is an OCaml executable that can be used from the command line or directly from your editor. -The other is [merlin](http://the-lambda-church.github.io/merlin/) and runs some -"static analysis" on your file. This translates into error reporting, source +The second tool, [merlin](http://the-lambda-church.github.io/merlin/) performs +"static analysis" of your source files. The analysis is then used to provide error reporting, source browsing, auto-completion and more. ## Ocp-indent for indentation @@ -30,18 +29,16 @@ ocp-indent for fine-tuned indentation: - it follows language evolution closely, nicely handling recent features, - it will indent the same even if your co-worker has a different editor, -- it is more flexible, for instance by enabling project-specific style; +- it is more flexible, for instance by supporting project-specific styles; Indeed the indentation behaviour of ocp-indent can be configured through several -options, directing how it will behave when encountering different constructions -of the OCaml language. These options can be set in a configuration file or -directly as parameters when invoked from the command line. An example -configuration file is available -[here](https://github.com/OCamlPro/ocp-indent/blob/master/.ocp-indent). +options, directing how it will behave when encountering different OCaml language constructs. +These options can either be set in a configuration file (such as +[this example configuration](https://github.com/OCamlPro/ocp-indent/blob/master/.ocp-indent)) +or passed directly as parameters when ocp-indent is invoked from the command line. -Finally, ocp-indent can also recognize some common syntax extensions of the -OCaml ecosystem and will keep a meaningful indentation in presence of these, -while your editor probably will not. +Finally, ocp-indent will also recognize a number of common syntax extensions of the +OCaml ecosystem and indent them meaningfully, while your editor probably will not. ## Merlin for analysis @@ -50,15 +47,15 @@ feedback about your code. Under the hood, it maintains a "code model" of the file you are editing. For other files in your project, it will use the output produced by the compiler; -rebuild regularly after edition to keep it synchronized. +rebuild regularly after editing to keep the model synchronized with your code. From this code model, it provides a lot of useful features: - scope/context-aware completion, like IntelliSense; - querying the type of any expression in the file; -- quick reporting of type and syntax errors, for short editing cycle; -- jumping to definition; -- list usages of identifiers in current buffer. +- quick reporting of type and syntax errors, shortening the editing cycle; +- jumping to definitions; +- listing uses of identifiers in the current buffer. # Quick start @@ -68,9 +65,8 @@ Assuming opam is already installed on your system, you just need to invoke to install these two tools. -**Emacs.** You will have to add `opam/share` to `'load-path` and load plugin -specific file. This can be done -by adding the following lines to your `.emacs`: +**Emacs.** You will have to add `opam/share` to `'load-path` and then load the plugin-specific +file. This can be done by adding the following lines to your `.emacs`: ```lisp (setq opam-share (substring (shell-command-to-string "opam config var share 2> /dev/null") 0 -1)) @@ -81,7 +77,7 @@ by adding the following lines to your `.emacs`: ``` For more information about merlin setup, you can look at -[the dedicated wiki](https://github.com/the-lambda-church/merlin/wiki). +[the dedicated merlin wiki](https://github.com/the-lambda-church/merlin/wiki). **Vim & ocp-indent.** We recommend using the [ocp-indent-vim](https://github.com/def-lkb/ocp-indent-vim) plugin instead of @@ -104,15 +100,15 @@ set rtp+=~/my-clone-of/ocp-indent-vim **Vim & merlin.** A comprehensive guide to the installation procedure for merlin is available on [the dedicated -wiki](https://github.com/the-lambda-church/merlin/wiki). Once again if you -just want to get started, the following lines are enough. +merlin wiki](https://github.com/the-lambda-church/merlin/wiki). Once again, if you +just want to get started the following lines contain everything you need. -Loading merlin in vim boils down to adding plugin directory in the -runtime-path. However as merlin depends on your current opam switch, a more -flexible way is to find the current switch and use it as base directory. +Loading merlin in vim boils down to adding the plugin directory to the +runtime path. However as merlin depends on your current opam switch, a more +flexible way is to find the current switch and use it as the base directory. -This code does exactly that: find current opam share directory, then add -merlin plugin directory. Add it to your `.vimrc`: +This code does exactly that: it finds the current opam share directory, then adds +the merlin plugin subdirectory to the current runtime path. Add it to your `.vimrc`: ```viml let g:opamshare = substitute(system('opam config var share'),'\n$','','''') @@ -123,9 +119,9 @@ execute "set rtp+=" . g:opamshare . "/merlin/vim" To maintain synchronization with the compiler, merlin needs some information about the structure of your project: build and source directories, package -dependencies, syntax extensions. -You can see merlin's .merlin [here](https://github.com/the-lambda-church/merlin/blob/master/.merlin). +dependencies, syntax extensions. This structure can be described in a `.merlin` file in the root directory of your project. +The [`.merlin` file for the merlin project](https://github.com/the-lambda-church/merlin/blob/master/.merlin) illustrates the syntax. -You have to put it at the root directory of your project, and the .merlin will be loaded next time you open an OCaml file in the editor. +The `.merlin` file will be loaded the next time you open an OCaml file in the editor. -To benefit of code navigation across files you'll also need to generate "cmt" files. Pass the `-bin-annot` flag to the compiler. +To benefit from code navigation across files you'll also need to turn on generation of "cmt" files by passing the `-bin-annot` flag to the OCaml compiler. From 99ec180ae85d965861701285b90a636866f22aaf Mon Sep 17 00:00:00 2001 From: Frederic Bour Date: Wed, 20 Aug 2014 18:04:13 +0200 Subject: [PATCH 5/6] Add merlin screenshot --- turn-your-editor-into-an-ocaml-ide-merlin.png | Bin 0 -> 19333 bytes turn-your-editor-into-an-ocaml-ide.md | 2 ++ 2 files changed, 2 insertions(+) create mode 100644 turn-your-editor-into-an-ocaml-ide-merlin.png diff --git a/turn-your-editor-into-an-ocaml-ide-merlin.png b/turn-your-editor-into-an-ocaml-ide-merlin.png new file mode 100644 index 0000000000000000000000000000000000000000..9632497e36ab3ad65b5431fa5380e16326283250 GIT binary patch literal 19333 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 k4|A@3acSi Date: Thu, 21 Aug 2014 07:23:11 -0500 Subject: [PATCH 6/6] Edits to merlin post; add multiple authors experimentally --- turn-your-editor-into-an-ocaml-ide.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/turn-your-editor-into-an-ocaml-ide.md b/turn-your-editor-into-an-ocaml-ide.md index afb10df..7044448 100644 --- a/turn-your-editor-into-an-ocaml-ide.md +++ b/turn-your-editor-into-an-ocaml-ide.md @@ -1,10 +1,13 @@ title: "Turn your editor into a full fledged OCaml IDE" -authors: "Frederic Bour" {"https://github.com/def-lkb"} -date: "2014-08-20" +authors: [ "Frederic Bour" {"https://github.com/def-lkb"} + "Thomas Refis" {"https://github.com/trefis"} ] +date: "2014-08-21" --BODY-- This post is a short presentation of a couple of tools you can use with your -editor to have a smoother experience while developing in OCaml. +editor to have a smoother experience while developing in OCaml. We are working +towards making these tools work out-of-the-box with OPAM, and hence will be +blogging about them here along with the OPAM tool itself. At the time of writing, interfaces to these tools are available for Emacs and Vim. Efforts are underway to add support for other editors, @@ -42,7 +45,7 @@ OCaml ecosystem and indent them meaningfully, while your editor probably will no ## Merlin for analysis -Merlin will enhance your experience editing OCaml code by providing interactive +Merlin enhances your experience editing OCaml code by providing interactive feedback about your code. Under the hood, it maintains a "code model" of the file you are editing. For @@ -126,4 +129,7 @@ The [`.merlin` file for the merlin project](https://github.com/the-lambda-church The `.merlin` file will be loaded the next time you open an OCaml file in the editor. -To benefit from code navigation across files you'll also need to turn on generation of "cmt" files by passing the `-bin-annot` flag to the OCaml compiler. +To benefit from code navigation across files you'll also need to turn on +generation of "cmt" files by passing the `-bin-annot` flag to the OCaml +compiler. You can do this in `ocamlbuild` by adding the `bin_annot` tag +into the `_tags` file with OCaml 4.01 and higher.