├── Makefile ├── README.org ├── psci-dev.el ├── psci.el └── todo.org /Makefile: -------------------------------------------------------------------------------- 1 | ARCHIVE=psci.el 2 | 3 | pr: 4 | hub pull-request -b ardumont:master 5 | 6 | install-clean: 7 | ~/bin/emacs/emacs-install-clean.sh ./$(ARCHIVE) 8 | -------------------------------------------------------------------------------- /README.org: -------------------------------------------------------------------------------- 1 | #+title: psci-mode [[http://melpa.org/#/psci][file:http://melpa.org/packages/psci-badge.svg]] [[http://stable.melpa.org/#/psci][file:http://stable.melpa.org/packages/psci-badge.svg]] 2 | #+author: ardumont 3 | 4 | A major mode to try and improve the purescript repl experience within emacs. 5 | 6 | * TOC :TOC: 7 | - [[#description][Description]] 8 | - [[#what][What]] 9 | - [[#how][How]] 10 | - [[#why][Why]] 11 | - [[#when][When]] 12 | - [[#who][Who]] 13 | - [[#install][Install]] 14 | - [[#git][Git]] 15 | - [[#package-repositories][Package repositories]] 16 | - [[#el-get][el-get]] 17 | - [[#start-and-setup][Start and setup]] 18 | - [[#start][Start]] 19 | - [[#setup][Setup]] 20 | - [[#use][Use]] 21 | - [[#runtime-dependencies][Runtime dependencies]] 22 | - [[#contributions][Contributions]] 23 | - [[#pr][PR]] 24 | - [[#issues][Issues]] 25 | - [[#miscellaneous][Miscellaneous]] 26 | 27 | * Description 28 | ** What 29 | 30 | Major mode for [[http://www.purescript.org/][purescript]]'s repl psci. 31 | 32 | ** How 33 | 34 | Based on comint-mode (command interpreter). 35 | Following [[http://www.masteringemacs.org/article/comint-writing-command-interpreter][this tutorial]]. 36 | 37 | ** Why 38 | 39 | The [[https://github.com/dysinger/purescript-mode][purescript-mode]] (forked from [[https://github.com/haskell/haskell-mode][haskell-mode]]) does not provide any repl integration (yet?). 40 | The experience inside the terminal is somewhat tedious at the moment. 41 | So I thought of giving it a shot. 42 | 43 | ** When 44 | 45 | How about now? 46 | (work in progress) 47 | 48 | ** Who 49 | 50 | [[https://github.com/ardumont][me]] 51 | 52 | * Install 53 | 54 | Many different installation possible: 55 | 56 | ** Git 57 | 58 | Clone the repository, and: 59 | 60 | #+begin_src sh 61 | M-x package-install-file RET /path/to/emacs-psci/psci.el 62 | #+end_src 63 | 64 | *Note* Provided you already use melpa, the needed deps should be installed. 65 | 66 | ** Package repositories 67 | *** Melpa 68 | 69 | [[http://melpa.org/#/getting-started][Their documentation:]] 70 | 71 | #+begin_src emacs-lisp 72 | (require 'package) 73 | (add-to-list 'package-archives '("melpa" . "http://melpa.org/packages") t) 74 | (package-initialize) 75 | #+end_src 76 | 77 | *Note* Providing [[https://github.com/milkypostman/melpa/pull/2124][PR]] is merged. 78 | 79 | *** Melpa-stable 80 | 81 | [[http://stable.melpa.org/#/getting-started][Their documentation:]] 82 | 83 | #+begin_src emacs-lisp 84 | (require 'package) 85 | (add-to-list 'package-archives '("melpa-stable" . "http://stable.melpa.org/packages/") t 86 | (package-initialize) 87 | #+end_src 88 | 89 | *** Marmalade 90 | 91 | [[https://marmalade-repo.org/#download][Their documentation:]] 92 | 93 | #+begin_src emacs-lisp 94 | (require 'package) 95 | (add-to-list 'package-archives '("marmalade" . "https://marmalade-repo.org/packages/")) 96 | (package-initialize) 97 | #+end_src 98 | 99 | *** Install 100 | 101 | With melpa, melpa-stable, marmalade: 102 | 103 | #+begin_src sh 104 | M-x package-install RET psci RET 105 | #+end_src 106 | 107 | ** el-get 108 | 109 | [[https://github.com/dimitri/el-get][Their documentation:]] 110 | 111 | #+begin_src sh 112 | M-x el-get-install RET psci RET 113 | #+end_src 114 | 115 | *Note* Providing [[https://github.com/dimitri/el-get/pull/1973][PR]] is merged. 116 | 117 | * Start and setup 118 | ** Start 119 | 120 | #+begin_src sh 121 | M-x psci 122 | #+end_src 123 | 124 | This will open a psci repl within emacs from your current project root folder (using [[https://github.com/bbatsov/projectile][projectile]] or project.el to determine that). 125 | 126 | ** Setup 127 | 128 | *** bindings 129 | 130 | Add the inferior-psci-mode to the purescript-mode will permit access to some default bindings: 131 | 132 | #+begin_src emacs-lisp 133 | (add-hook 'purescript-mode-hook 'inferior-psci-mode) 134 | #+end_src 135 | 136 | *** repl toggle 137 | 138 | I encounter (thanks to @purcell) a simple mode that I quite like which is called [[https://github.com/tomterl/repl-toggle][repl-toggle]]. 139 | This permits, using the same universal binding `C-c C-z`, to go back and forth between the repl and the buffer. 140 | 141 | #+begin_src emacs-lisp 142 | (require 'repl-toggle) 143 | (require 'psci) 144 | (add-to-list 'rtog/mode-repl-alist '(purescript-mode . psci)) 145 | #+end_src 146 | 147 | * Use 148 | 149 | Default bindings available from a purescript buffer: 150 | 151 | |-------------+--------------------------------+----------------------------------------------------------------------------------------------| 152 | | Keybindings | Interactive commands | Description | 153 | |-------------+--------------------------------+----------------------------------------------------------------------------------------------| 154 | | C-c C-l | M-x psci/load-current-file! | Equivalent of `:m /path/to/current/module/file.purs` - Load for importing | 155 | | C-c M-n | M-x psci/load-module! | Equivalent of `:i your.current.module.name` - Import for use in PSCI | 156 | | C-c C-r | M-x psci/load-project-modules! | Load or reload files defined in the project file .psci | 157 | | N/A | M-x psci/reset! | Equivalent of `:r` - Reset | 158 | | N/A | M-x psci/quit! | Equivalent of `:q` - Quit | 159 | | C-c C-z | | Provided you use the previous setup, this will switch back and forth between repl and buffer | 160 | |-------------+--------------------------------+----------------------------------------------------------------------------------------------| 161 | 162 | * Runtime dependencies 163 | 164 | A purescript dev platform ready. 165 | I based this development on the online book https://leanpub.com/purescript/. 166 | 167 | * Contributions 168 | 169 | ** PR 170 | 171 | More than welcome. 172 | Send me a PR and I will gladly merge it. 173 | 174 | Simply, use fork, branch, and rebase to the latest commit. 175 | Also, I prefer code that is understandable (ymmv) and doc-stringified. 176 | 177 | ** Issues 178 | 179 | Issues, there will be. 180 | 181 | Open issues [[https://github.com/purescript-emacs/emacs-psci/issues][on the tracker]], I'll do my best to answer. 182 | 183 | Just, be sure to be clear, complete and concise about what your trouble is. 184 | 185 | I'm open to suggestions but I'm far from being omniscient. Please, add information links, this helps everyone. 186 | 187 | * Miscellaneous 188 | 189 | I tend to rely on other people's code. 190 | That's why I use a lot of dependencies. 191 | I'll remove the unnecessary dependencies (for the moment, none but surely, some code can be rewritten without the deps) later. 192 | -------------------------------------------------------------------------------- /psci-dev.el: -------------------------------------------------------------------------------- 1 | ;;; psci-dev.el --- Utilities for helping in dev psci 2 | 3 | ;;; Commentary: 4 | 5 | ;;; Code: 6 | 7 | (require 'psci) 8 | 9 | ;; ELISP> (with-current-buffer "*psci*" 10 | ;; (psci/--debug-setup!)) 11 | ;; ("comint-prompt-regexp" "^> " 12 | ;; "paragraph-separate" "\\'" 13 | ;; "paragraph-start" "^> " 14 | ;; "comint-input-sender" comint-simple-send 15 | ;; "comint-get-old-input" comint-get-old-input-default 16 | ;; "comint-process-echoes" nil 17 | ;; "comint-prompt-read-only" t 18 | ;; "comint-eol-on-send" t 19 | ;; "comint-input-filter-functions" nil 20 | ;; "font-lock-defaults" (purescript-font-lock-keywords t) 21 | ;; "comment-start" "-- " 22 | ;; "comment-use-syntax" t) 23 | 24 | (defun psci/--debug-setup! () 25 | "A function to debug the current major mode's runtime setup." 26 | (list "comint-prompt-regexp" comint-prompt-regexp 27 | "paragraph-separate" paragraph-separate 28 | "paragraph-start" paragraph-start 29 | "comint-input-sender" comint-input-sender 30 | "comint-get-old-input" comint-get-old-input 31 | "comint-process-echoes" comint-process-echoes 32 | "comint-prompt-read-only" comint-prompt-read-only 33 | "comint-eol-on-send" comint-eol-on-send 34 | "comint-input-filter-functions" comint-input-filter-functions 35 | "font-lock-defaults" font-lock-defaults 36 | "comment-start" comment-start 37 | "comment-use-syntax" comment-use-syntax)) 38 | 39 | (provide 'psci-dev) 40 | ;;; psci-dev.el ends here 41 | -------------------------------------------------------------------------------- /psci.el: -------------------------------------------------------------------------------- 1 | ;;; psci.el --- Major mode for purescript repl psci 2 | 3 | ;; Copyright (C) 2014 Antoine R. Dumont 4 | 5 | ;; Author: Antoine R. Dumont 6 | ;; Maintainer: Antoine R. Dumont 7 | ;; Version: 0.0.6 8 | ;; Package-Requires: ((emacs "25.1") (purescript-mode "13.10") (dash "2.9.0") (inheritenv "0.2")) 9 | ;; Keywords: languages purescript psci repl 10 | ;; URL: https://github.com/purescript-emacs/emacs-psci 11 | 12 | ;; This file is NOT part of GNU Emacs. 13 | 14 | ;; This program is free software; you can redistribute it and/or modify 15 | ;; it under the terms of the GNU General Public License as published by 16 | ;; the Free Software Foundation; either version 3, or (at your option) 17 | ;; any later version. 18 | ;; 19 | ;; This program is distributed in the hope that it will be useful, 20 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of 21 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 22 | ;; GNU General Public License for more details. 23 | ;; 24 | ;; You should have received a copy of the GNU General Public License 25 | ;; along with GNU Emacs; see the file COPYING. If not, write to the 26 | ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 27 | ;; Boston, MA 02110-1301, USA. 28 | 29 | ;;; Commentary: 30 | 31 | ;; Provides a simple interface to evaluate Purescript expression. 32 | ;; Input is handled by the comint package. 33 | 34 | ;; To start psci repl: 35 | ;; M-x psci. Type C-h m in the *psci* buffer for more info. 36 | 37 | ;; To activate some basic bindings, you can add the following hook 38 | ;; to purescript-mode: 39 | ;; (add-hook 'purescript-mode-hook 'inferior-psci-mode) 40 | 41 | ;; To come back and forth between a purescript-mode buffer and 42 | ;; repl, you could use repl-toggle (available on melpa): 43 | ;; (require 'repl-toggle) 44 | ;; (add-to-list 'rtog/mode-repl-alist '(purescript-mode . psci)) 45 | 46 | ;; More informations: https://ardumont/emacs-psci 47 | ;; Issue tracker: https://github.com/purescript-emacs/emacs-psci/issues 48 | 49 | ;;; Code: 50 | 51 | (require 'comint) 52 | (require 'dash) 53 | (require 'purescript-font-lock) 54 | (require 'inheritenv) 55 | 56 | ;; constants or variables 57 | 58 | (defvar psci/buffer-name "psci" 59 | "Buffer name of the psci buffer.") 60 | 61 | (defcustom psci/purs-path "purs" 62 | "Path to the \"purs\" binary." 63 | :group 'psci 64 | :type 'string) 65 | 66 | (defcustom psci/psc-package-path "psc-package" 67 | "Path to the \"psc-package\" binary." 68 | :group 'psci 69 | :type 'string) 70 | 71 | (defcustom psci/spago-path "spago" 72 | "Path to the \"spago\" binary." 73 | :group 'psci 74 | :type 'string) 75 | 76 | (defcustom psci/arguments '("src/**/*.purs" "bower_components/purescript-*/src/**/*.purs") 77 | "Command-line arguments to pass to `psci' function." 78 | :group 'psci 79 | :type '(repeat string)) 80 | 81 | (defvar psci/prompt "> " 82 | "The psci prompt.") 83 | 84 | ;; private functions 85 | 86 | (defun psci--project-root! () 87 | "Determine the project's root folder. 88 | Beware, can return nil if no .psci file is found." 89 | (cond 90 | ((and (fboundp 'projectile-project-root) (projectile-project-p)) 91 | (projectile-project-root)) 92 | ((fboundp 'project-root) 93 | (project-root (project-current t))) 94 | (t 95 | default-directory))) 96 | 97 | (defun psci--process-name (buffer-name) 98 | "Compute the buffer's process name based on BUFFER-NAME." 99 | (format "*%s*" buffer-name)) 100 | 101 | (defun psci--file-content (filename) 102 | "Load FILENAME's content as a string. 103 | When FILENAME is nil or not a real file, returns nil." 104 | (when (and filename (file-exists-p filename)) 105 | (with-temp-buffer 106 | (insert-file-contents filename) 107 | (buffer-substring-no-properties (point-min) (point-max))))) 108 | 109 | (defun psci--run-psci-command! (command) 110 | "Run psci COMMAND as string." 111 | (-when-let (process (get-buffer-process (psci--process-name psci/buffer-name))) 112 | (comint-simple-send process command))) 113 | 114 | (defun psci--compute-module-name! () 115 | "Compute the current file's module name." 116 | (save-excursion 117 | (goto-char (point-min)) 118 | (let ((regexp "^module\\s-+\\\([a-zA-Z0-9\\\.]+\\\)\\b")) 119 | (search-forward-regexp regexp) 120 | (match-string 1)))) 121 | 122 | (defun psci--cleanup-sources-filter-predicate! (source) 123 | "Predicate to see if SOURCE is suitable to be given to the psci repl." 124 | (not (string-empty-p source))) 125 | 126 | (defun psci--get-psc-package-sources! () 127 | "Find extra source path globs using purescript package tools,if they appear to be used." 128 | (-filter 'psci--cleanup-sources-filter-predicate! 129 | (cond 130 | ((file-exists-p "psc-package.json") 131 | (inheritenv (process-lines (psci--executable-find-relative psci/psc-package-path) "sources"))) 132 | ((or (file-exists-p "spago.dhall") (file-exists-p "spago.yaml")) 133 | (inheritenv (process-lines (psci--executable-find-relative psci/spago-path) "sources")))))) 134 | 135 | (defun psci--executable-find-relative (path) 136 | "If PATH is a relative path to an executable, return its full path. 137 | Otherwise, just return PATH." 138 | (let ((relative (expand-file-name path))) 139 | (if (file-executable-p relative) 140 | relative 141 | path))) 142 | 143 | ;; public functions 144 | 145 | ;;;###autoload 146 | (defun psci (project-root-folder) 147 | "Run an inferior instance of \"psci\" inside Emacs, in PROJECT-ROOT-FOLDER. 148 | If not supplied, the root folder will be guessed using 149 | `projectile-project-root', or `project-root' from project.el (if 150 | available), otherwise it will default to the current buffer's 151 | directory." 152 | (interactive (list (read-directory-name "Project root: " 153 | (psci--project-root!)))) 154 | (let* ((default-directory project-root-folder) 155 | (psci-program psci/purs-path) 156 | (extra-sources (psci--get-psc-package-sources!)) 157 | (buffer (comint-check-proc psci/buffer-name))) 158 | ;; pop to the "*psci*" buffer if the process is dead, the 159 | ;; buffer is missing or it's got the wrong mode. 160 | (pop-to-buffer 161 | (if (or buffer (not (derived-mode-p 'psci-mode)) 162 | (comint-check-proc (current-buffer))) 163 | (get-buffer-create (or buffer (psci--process-name psci/buffer-name))) 164 | (current-buffer))) 165 | ;; create the comint process if there is no buffer. 166 | (unless buffer 167 | (let ((full-arg-list (append psci/arguments extra-sources))) 168 | (apply 'make-comint-in-buffer psci/buffer-name buffer 169 | psci-program nil "repl" full-arg-list)) 170 | (psci-mode)))) 171 | 172 | (defvar psci-mode-map 173 | (let ((map (nconc (make-sparse-keymap) comint-mode-map))) 174 | (define-key map "\t" 'completion-at-point) 175 | map) 176 | "Basic mode map for `psci'.") 177 | 178 | (defun psci-completion-preoutput-filter (string) 179 | (setq psci-completion-captured-output (concat psci-completion-captured-output string)) 180 | "") 181 | 182 | (defun psci-tidy-completion-output (response) 183 | (let* ((response-lines (split-string response "\n" t nil)) 184 | (response-lines-without-prompt (nbutlast response-lines))) 185 | response-lines-without-prompt)) 186 | 187 | 188 | (defun psci-tab-completion () 189 | (let* ((line (thing-at-point 'line t)) 190 | (command (format ":complete %s" line))) 191 | (-when-let (process (get-buffer-process (psci--process-name psci/buffer-name))) 192 | (add-hook 'comint-preoutput-filter-functions 'psci-completion-preoutput-filter nil t) 193 | (comint-simple-send process command) 194 | (accept-process-output process) 195 | (remove-hook 'comint-preoutput-filter-functions 'psci-completion-preoutput-filter t) 196 | (let ((response psci-completion-captured-output)) 197 | (setq psci-completion-captured-output "") 198 | (when (not (string-prefix-p "Unrecognized directive." response)) 199 | (save-excursion 200 | (let* ((end (point)) 201 | (start (+ (re-search-backward comint-prompt-regexp) 202 | (length psci/prompt))) 203 | (results (psci-tidy-completion-output response))) 204 | (list start end results)))))))) 205 | 206 | (defvar psci-dynamic-complete-functions 207 | '(psci-tab-completion)) 208 | 209 | ;;;###autoload 210 | (define-derived-mode psci-mode comint-mode "psci" 211 | "Major mode for `run-psci'. 212 | 213 | \\" 214 | (setq-local comint-prompt-regexp (concat "^" (regexp-quote psci/prompt))) 215 | (setq-local paragraph-separate "\\'") ;; so commands like M-{ and M-} work. 216 | (setq-local paragraph-start comint-prompt-regexp) 217 | (setq-local comint-input-sender-no-newline nil) 218 | (setq-local comint-input-sender 'comint-simple-send) 219 | (setq-local comint-get-old-input 'comint-get-old-input-default) 220 | (setq-local comint-process-echoes nil) 221 | (setq-local comint-prompt-read-only t) ;; read-only prompt 222 | (setq-local comint-eol-on-send t) 223 | (setq-local comint-input-filter-functions nil) 224 | (setq-local font-lock-defaults '(purescript-font-lock-keywords t)) 225 | (setq-local comment-start "-- ") 226 | (setq-local comment-use-syntax t) 227 | (setq-local comment-use-syntax t) 228 | (setq-local comint-dynamic-complete-functions psci-dynamic-complete-functions) 229 | (setq-local psci-completion-captured-output "")) 230 | 231 | ;;;###autoload 232 | (defun psci/load-current-file! () 233 | "Load the current file in the psci repl." 234 | (interactive) 235 | (save-buffer) 236 | (call-interactively 'psci/reset!) 237 | (call-interactively 'psci/load-module!)) 238 | 239 | ;;;###autoload 240 | (defun psci/load-module! () 241 | "Load the module inside the repl session." 242 | (interactive) 243 | (-when-let (module-name (psci--compute-module-name!)) 244 | (psci--run-psci-command! (format "import %s" module-name)))) 245 | 246 | ;;;###autoload 247 | (defun psci/reset! () 248 | "Reset the current status of the repl session." 249 | (interactive) 250 | (psci--run-psci-command! ":clear")) 251 | 252 | ;;;###autoload 253 | (defun psci/quit! () 254 | "Quit the psci session." 255 | (interactive) 256 | (psci--run-psci-command! ":quit")) 257 | 258 | (defvar inferior-psci-mode-map 259 | (let ((map (make-sparse-keymap))) 260 | (define-key map (kbd "C-c C-l") 'psci/load-current-file!) 261 | (define-key map (kbd "C-c M-n") 'psci/load-module!) 262 | map) 263 | "Basic mode map for `inferior-psci-mode'.") 264 | 265 | (defgroup psci nil "psci customisation group." 266 | :tag "psci" 267 | :version "0.0.4" 268 | :group 'purescript 269 | :prefix "psci/") 270 | 271 | ;;;###autoload 272 | (define-minor-mode inferior-psci-mode "psci minor mode to define default bindings." 273 | :lighter " ip" 274 | :keymap inferior-psci-mode-map 275 | :group 'psci) 276 | 277 | (provide 'psci) 278 | ;;; psci.el ends here 279 | -------------------------------------------------------------------------------- /todo.org: -------------------------------------------------------------------------------- 1 | #+title: backlog 2 | #+author: ardumont 3 | 4 | * 0.0.7 [%] 5 | - [ ] Add :b binding 6 | - [ ] Add `:s import` binding 7 | - [ ] Add `:s loaded` binding 8 | - [ ] Make psci's default completion work 9 | * DONE 0.0.6 [100%] 10 | CLOSED: [2015-01-14 Wed 09:03] 11 | - [X] Prepare backlog 12 | - [X] Update version 13 | - [X] Add TOC to the README.org (Cheers to org-toc!) 14 | - [X] `M-x psci` errors if there is no .psci file. - CLOSE #3 15 | - [X] Need better regex for `psci/--compute-module-name!` - CLOSE #4 16 | * DONE 0.0.5 [100%] 17 | CLOSED: [2014-10-30 Thu 18:17] 18 | - [X] Prepare backlog 19 | - [X] Improve mode description header 20 | - [X] Update version 21 | - [X] Reorganize code for a better readability 22 | - [X] Reorganize var at the beginning of the buffer 23 | - [X] Add missing autoload property on psci function 24 | - [X] Remove dead code 25 | - [X] Reorganize private functions at the beginning of the buffer 26 | - [X] Improve psci minor mode's dosctring description 27 | - [X] Add quit session command 28 | - [X] Update documentation about quit command 29 | * DONE 0.0.4 [100%] 30 | CLOSED: [2014-10-29 Wed 20:08] 31 | - [X] Update version 32 | - [X] Add an interactive command for displaying the current version 33 | - [X] Use compatible with old emacs version api (replace `(setq-local var val)` with `(set (make-local-variable 'var) val)`) 34 | - [X] `shell-quote-argument` around shell code 35 | - [X] Remove projectile dependencies and compute the root folder using emacs primitives (thanks @purcell again) 36 | - [X] Update el-get PR to remove projectile dependencies - https://github.com/dimitri/el-get/pull/1973 37 | - [X] Add a minor mode instead of modifying purescript-mode-map 38 | - [X] Update heading information about the minor-mode activation and setup 39 | - [X] Update documentation about the minor-mode activation and setup 40 | - [X] Avoid version function and var. Use directly the package information. 41 | - [X] Update call to setq default-directory 42 | * DONE 0.0.3 [100%] 43 | CLOSED: [2014-10-29 Wed 18:54] 44 | - [X] Update version 45 | - [X] Add to marmalade - https://marmalade-repo.org/packages/psci 46 | - [X] Add to el-get - https://github.com/ardumont/el-get/blob/add-psci-recipe/recipes/psci.rcp 47 | - [X] Update documentation regarding installation steps 48 | - [X] Update documentation regarding usage 49 | * DONE 0.0.2 [100%] 50 | CLOSED: [2014-10-29 Wed 18:03] 51 | - [X] Run the psci command from the folder containing the .psci file 52 | - [X] Improve the modules (re)loading by removing existing files (.psci_modules/node_modules folder) 53 | - [X] Improve the module (re)loading by removing existings files (inside .psci_modules folder) 54 | - [X] Create melpa recipe https://github.com/ardumont/melpa/blob/add-new-recipe-psci/recipes/psci 55 | * DONE 0.0.1 [100%] 56 | CLOSED: [2014-10-29 Wed 16:37] 57 | - [X] Prepare backlog 58 | - [X] First implementation 59 | - [X] Add some documentation 60 | - [X] Ensure everything is ok [100%] 61 | - [X] Fix prompt regexp 62 | - [X] Ensure the psci-mode-map is loaded 63 | - [X] Load file in the current session 64 | - [X] Load module in the current session 65 | - [X] Add purescript-mode-hook function to extend bindings to load file or module 66 | - [X] Permit the loading of dependencies modules 67 | - [X] Send the reset command 68 | --------------------------------------------------------------------------------