{"id":33239356,"url":"https://github.com/pfitaxel/learn-ocaml.el","last_synced_at":"2025-11-21T13:02:17.867Z","repository":{"id":46621976,"uuid":"190013940","full_name":"pfitaxel/learn-ocaml.el","owner":"pfitaxel","description":"Emacs mode for students using the learn-ocaml platform (https://ocaml-sf.org/learn-ocaml) [maintainer=@erikmd]","archived":false,"fork":false,"pushed_at":"2021-10-14T22:45:00.000Z","size":619,"stargazers_count":7,"open_issues_count":4,"forks_count":1,"subscribers_count":7,"default_branch":"master","last_synced_at":"2024-06-28T12:34:28.680Z","etag":null,"topics":["emacs","learn-ocaml","ocaml"],"latest_commit_sha":null,"homepage":"","language":"Emacs Lisp","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pfitaxel.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-06-03T13:45:53.000Z","updated_at":"2024-04-05T00:56:43.000Z","dependencies_parsed_at":"2022-09-06T17:31:14.534Z","dependency_job_id":null,"html_url":"https://github.com/pfitaxel/learn-ocaml.el","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/pfitaxel/learn-ocaml.el","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pfitaxel%2Flearn-ocaml.el","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pfitaxel%2Flearn-ocaml.el/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pfitaxel%2Flearn-ocaml.el/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pfitaxel%2Flearn-ocaml.el/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pfitaxel","download_url":"https://codeload.github.com/pfitaxel/learn-ocaml.el/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pfitaxel%2Flearn-ocaml.el/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":285620632,"owners_count":27203062,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-11-21T02:00:06.175Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["emacs","learn-ocaml","ocaml"],"created_at":"2025-11-16T19:00:41.513Z","updated_at":"2025-11-21T13:02:17.858Z","avatar_url":"https://github.com/pfitaxel.png","language":"Emacs Lisp","funding_links":[],"categories":["Developer Tools"],"sub_categories":[],"readme":"# learn-ocaml.el\n\n[![Test](https://github.com/pfitaxel/learn-ocaml.el/actions/workflows/test.yml/badge.svg?branch=master)](https://github.com/pfitaxel/learn-ocaml.el/actions/workflows/test.yml)\n[![MELPA](https://melpa.org/packages/learn-ocaml-badge.svg)](https://melpa.org/#/learn-ocaml)\n\n## Summary\n\n**learn-ocaml.el** is an Emacs frontend for students using\n[learn-ocaml](http://ocaml-sf.org/learn-ocaml/).\n\n## Dependencies\n\n### [Emacs](https://www.gnu.org/software/emacs/)\n\n(version `25.1` or later)\n\n### `learn-ocaml-client`\n\n* Browse the [Releases page of learn-ocaml](https://github.com/ocaml-sf/learn-ocaml/releases/).\n* Download the latest version (≥ 0.13.0) of `learn-ocaml-client` from the Release Assets.\n* For Windows 10, the Linux binary should be compatible with WSL.\n* Rename the binary to just `learn-ocaml-client`\n  (instead of e.g. `learn-ocaml-client-linux-x86_64`)\n* Add the executable bit to the binary (`chmod a+x learn-ocaml-client`)\n* (Optional) Put the `learn-ocaml-client` binary in your `PATH`.\n\n**Note:** beyond `learn-ocaml-client`, you may want to install a\ncomprehensive OCaml/Emacs environment (with Tuareg, Merlin, Company):\nfor details, see \u003chttps://github.com/erikmd/tapfa-init.el\u003e (in French)\n\n## Installation (using MELPA)\n\n[MELPA](https://melpa.org/) is a repository of Emacs packages. Skip\nthis step if you already use MELPA. Otherwise, add the following to\nyour `.emacs` and restart Emacs:\n\n```elisp\n(require 'package)\n;; (setq gnutls-algorithm-priority \"NORMAL:-VERS-TLS1.3\") ; see remark below\n(add-to-list 'package-archives '(\"melpa\" . \"https://melpa.org/packages/\") t)\n(package-initialize)\n```\n\n\u003e **Remark:** If you have Emacs 26.1 (which is precisely\n\u003e [the packaged version in Debian 10](https://packages.debian.org/emacs)),\n\u003e you may get the error message `Failed to download 'melpa' archive`\n\u003e during the package refresh step. This is a know bug\n\u003e ([debbug #34341](https://debbugs.gnu.org/cgi/bugreport.cgi?bug=34341))\n\u003e which has been fixed in Emacs 26.3 and 27.1, while a simple workaround\n\u003e consists in uncommenting the line\n\u003e `(setq gnutls-algorithm-priority \"NORMAL:-VERS-TLS1.3\")` above in your\n\u003e `.emacs`.\n\nThen, run \u003ckbd\u003eM-x package-refresh-contents RET\u003c/kbd\u003e followed by\n\u003ckbd\u003eM-x package-install RET learn-ocaml RET\u003c/kbd\u003e to install and\nbyte-compile `learn-ocaml`.\n\n\n## Usage\n\nEnable the minor mode in any buffer:\n\n\u003ckbd\u003eM-x learn-ocaml-mode RET\u003c/kbd\u003e\n\nFollow the instructions regarding the server URL and token (which will\nautomatically be stored in `~/.config/learnocaml/client.json`).\n\nOpen the **`LearnOCaml` menu** or directly start an exercise from the\n**\\*learn-ocaml-exercise-list\\*** buffer.\n\nThen, the `learn-ocaml-mode` will automatically be activated when\nopening **.ml** buffers using `tuareg-mode` and the following\n*keybindings* will be available:\n\n* `(learn-ocaml-grade)`: \u003ckbd\u003eC-c C-m C-m\u003c/kbd\u003e (= \u003ckbd\u003eC-c RET RET\u003c/kbd\u003e)\n\n* `(learn-ocaml-display-exercise-list)`: \u003ckbd\u003eC-c C-m C-l\u003c/kbd\u003e (= \u003ckbd\u003eC-c RET C-l\u003c/kbd\u003e) or \u003ckbd\u003eC-c C-m l\u003c/kbd\u003e (= \u003ckbd\u003eC-c RET l\u003c/kbd\u003e)\n\n## Known limitations\n\n* When used jointly with [Merlin](https://github.com/ocaml/merlin), if\n    the [learn-ocaml](https://github.com/ocaml-sf/learn-ocaml)\n    exercise contains a nonempty prelude, **Merlin** may trigger\n    errors such as `Unbound value foo` although `foo` is defined in\n    the server exercise.  Note that this issue does not impact the\n    **learn-ocaml.el** *grading* feature which already works in this\n    use case.  But ultimately, we will provide a dedicated support to\n    workaround this **Merlin** issue, which thus occurs if the server\n    exercise provides some `prelude.ml` and/or `prepare.ml` code.\n\n## Feedback\n\nBug reports and suggestions are very welcome: feel free to open a new\n[issue](https://github.com/pfitaxel/learn-ocaml.el/issues/new) or PR.\n\n## Developer docs\n\n* **Setup the `learn-ocaml.el` dev environment** by following these refs:\n  * [GH: erikmd/tapfa-init.el](https://github.com/erikmd/tapfa-init.el) (opam (2.x) + OCaml (4.12.0) + GNU Emacs (≥ 25.1) + Tuareg + Merlin)\n  * [git-scm.com/download](https://git-scm.com/download) (Git)\n  * [Gist: Magit](https://gist.github.com/erikmd/82c4b2a50a77c98e8fe6318530c531b7) (Magit)\n  * [Gist: Resources for elisp dev](https://gist.github.com/erikmd/35251ac083e7433f3e780f7eb8856782) (which-key + helpful + edebug-x + Tutorials)\n  * [GH: erikmd/docker-examples](https://github.com/erikmd/docker-examples#prérequis--installer-docker-et-docker-compose) (Docker)\n* **Use the Makefile to start the test environment**:  \n  run `make help` to list the available Makefile commands.\n* **Browse the [tests/README.md](./tests/README.md) file** for further details.\n\n## Authors and Acknowledgments\n\n**learn-ocaml.el** has been developed in University Toulouse III by\nErik Martin-Dorel, Manuel Cabarcos Baulina, and Louis Ayroles, thanks to the support\nof the [OCaml Software Foundation](http://ocaml-sf.org/).\n\n## License\n\n**learn-ocaml.el** is a free software distributed under the [MIT\nLicense](./LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpfitaxel%2Flearn-ocaml.el","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpfitaxel%2Flearn-ocaml.el","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpfitaxel%2Flearn-ocaml.el/lists"}