|
4 | 4 |
|
5 | 5 | ;; Author: Antoine R. Dumont <eniotna.t AT gmail.com> |
6 | 6 | ;; Maintainer: Antoine R. Dumont <eniotna.t AT gmail.com> |
7 | | -;; Version: 0.0.5 |
| 7 | +;; Version: 0.0.6 |
8 | 8 | ;; Package-Requires: ((purescript-mode "13.10") (dash "2.9.0") (s "1.9.0") (f "0.17.1") (deferred "0.3.2")) |
9 | 9 | ;; Keywords: purescript psci repl major mode |
10 | 10 | ;; URL: https://github.com/ardumont/emacs-psci |
|
77 | 77 |
|
78 | 78 | ;; private functions |
79 | 79 |
|
| 80 | +(defun psci/log (msg) |
| 81 | + "Log MSG for psci." |
| 82 | + (message (format "psci - %s" msg))) |
| 83 | + |
80 | 84 | (defun psci/--project-root! () |
81 | | - "Determine the project's root folder." |
82 | | - (->> psci/project-module-file |
83 | | - (locate-dominating-file default-directory) |
84 | | - expand-file-name)) |
| 85 | + "Determine the project's root folder. |
| 86 | +Beware, can return nil if no .psci file is found." |
| 87 | + (-when-let (project-root (->> psci/project-module-file |
| 88 | + (locate-dominating-file default-directory))) |
| 89 | + (expand-file-name project-root))) |
85 | 90 |
|
86 | 91 | (defun psci/--process-name (buffer-name) |
87 | 92 | "Compute the buffer's process name based on BUFFER-NAME." |
@@ -133,31 +138,34 @@ Assumes the location of the modules is the project root folder." |
133 | 138 | "Compute the current file's module name." |
134 | 139 | (save-excursion |
135 | 140 | (goto-char (point-min)) |
136 | | - (let ((regexp "^module \\\([a-zA-Z0-9\\\.]+\\\) ")) |
| 141 | + (let ((regexp "^module\\s-+\\\([a-zA-Z0-9\\\.]+\\\)\\b")) |
137 | 142 | (search-forward-regexp regexp) |
138 | 143 | (match-string 1)))) |
139 | 144 |
|
140 | 145 | ;; public functions |
141 | 146 |
|
142 | 147 | ;;;###autoload |
143 | 148 | (defun psci () |
144 | | - "Run an inferior instance of `psci' inside Emacs." |
| 149 | + "Run an inferior instance of `psci' inside Emacs. |
| 150 | +Relies on .psci file for determining the project's root folder." |
145 | 151 | (interactive) |
146 | | - (let* ((psci-program psci/file-path) |
147 | | - (buffer (comint-check-proc psci/buffer-name))) |
148 | | - ;; pop to the "*psci*" buffer if the process is dead, the |
149 | | - ;; buffer is missing or it's got the wrong mode. |
150 | | - (pop-to-buffer-same-window |
151 | | - (if (or buffer (not (derived-mode-p 'psci-mode)) |
152 | | - (comint-check-proc (current-buffer))) |
153 | | - (get-buffer-create (or buffer (psci/--process-name psci/buffer-name))) |
154 | | - (current-buffer))) |
155 | | - ;; create the comint process if there is no buffer. |
156 | | - (unless buffer |
157 | | - (setq default-directory (psci/--project-root!)) |
158 | | - (apply 'make-comint-in-buffer psci/buffer-name buffer |
159 | | - psci-program psci/arguments) |
160 | | - (psci-mode)))) |
| 152 | + (-if-let (project-root-folder (psci/--project-root!)) |
| 153 | + (let* ((psci-program psci/file-path) |
| 154 | + (buffer (comint-check-proc psci/buffer-name))) |
| 155 | + ;; pop to the "*psci*" buffer if the process is dead, the |
| 156 | + ;; buffer is missing or it's got the wrong mode. |
| 157 | + (pop-to-buffer-same-window |
| 158 | + (if (or buffer (not (derived-mode-p 'psci-mode)) |
| 159 | + (comint-check-proc (current-buffer))) |
| 160 | + (get-buffer-create (or buffer (psci/--process-name psci/buffer-name))) |
| 161 | + (current-buffer))) |
| 162 | + ;; create the comint process if there is no buffer. |
| 163 | + (unless buffer |
| 164 | + (setq default-directory (psci/--project-root!)) |
| 165 | + (apply 'make-comint-in-buffer psci/buffer-name buffer |
| 166 | + psci-program psci/arguments) |
| 167 | + (psci-mode))) |
| 168 | + (psci/log "No .psci file so we cannot determine the root project folder. Please, add one."))) |
161 | 169 |
|
162 | 170 | (defvar psci-mode-map |
163 | 171 | (let ((map (nconc (make-sparse-keymap) comint-mode-map))) |
|
0 commit comments