diff options
author | Aryadev Chavali <aryadev@aryadevchavali.com> | 2021-07-26 01:40:37 +0100 |
---|---|---|
committer | Aryadev Chavali <aryadev@aryadevchavali.com> | 2021-07-26 01:40:37 +0100 |
commit | a6f1a172de8dcc73944671aa13aaff4c31afd7fe (patch) | |
tree | 4086c86b3006d7486e7ee5e11e1376e2c2fb700f /Emacs | |
parent | b3f78e588b55e8676997377b14868689986b12a9 (diff) | |
download | dotfiles-a6f1a172de8dcc73944671aa13aaff4c31afd7fe.tar.gz dotfiles-a6f1a172de8dcc73944671aa13aaff4c31afd7fe.tar.bz2 dotfiles-a6f1a172de8dcc73944671aa13aaff4c31afd7fe.zip |
(Emacs)+haskell-multiedit
Just some code to make editing in the Haskell REPL a nicer
experience. Allows me to write multi-line code in a separate buffer
with haskell-mode switched on, then with a simple keybinding paste and
evaluate the full code in the Haskell REPL. The keybindings and
workflow are similar to org-src block editing (create a new buffer,
then paste the contents back into the original buffer).
Diffstat (limited to 'Emacs')
-rw-r--r-- | Emacs/.config/emacs/config.org | 1 | ||||
-rw-r--r-- | Emacs/.config/emacs/haskell-multiedit.el | 66 |
2 files changed, 67 insertions, 0 deletions
diff --git a/Emacs/.config/emacs/config.org b/Emacs/.config/emacs/config.org index a67ee2a..e88b0b4 100644 --- a/Emacs/.config/emacs/config.org +++ b/Emacs/.config/emacs/config.org @@ -2518,6 +2518,7 @@ Here I configure the REPL for Haskell via the (display-buffer-at-bottom) (window-height . 0.25)) :config + (load (concat user-emacs-directory "haskell-multiedit.el")) (+dx/create-toggle-function +shell/toggle-haskell-repl "*haskell*" diff --git a/Emacs/.config/emacs/haskell-multiedit.el b/Emacs/.config/emacs/haskell-multiedit.el new file mode 100644 index 0000000..700e7de --- /dev/null +++ b/Emacs/.config/emacs/haskell-multiedit.el @@ -0,0 +1,66 @@ +;;; haskell-multiedit.el --- Minor mode to edit and evaluate multi-line scripts of Haskell without making a file -*- lexical-binding: t; -*- + +;; Copyright (C) 2021 Aryadev Chavali + +;; Author: Aryadev Chavali <aryadev@aryadevchavali.com> +;; Keywords: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <https://www.gnu.org/licenses/>. + +;;; Commentary: + +;; To be used in a haskell-interactive-mode buffer. It'll generate a +;; new buffer with haskell-mode and this minor mode activated. Once +;; finished with the code, using another keybind it'll close this +;; buffer and paste the code into haskell-interactive-mode, evaluating +;; it all line by line with indenting and multi-line guards. + +;;; Code: + +(defvar haskell-multiedit-mode-map + (make-sparse-keymap)) + +(define-minor-mode haskell-multiedit-mode + "Minor mode for haskell buffers generated by haskell-interactive-mode. +Provides bindings to retrieve content back into the REPL with +full multi-edit commands" + nil + "" + haskell-multiedit-mode-map) + +(with-eval-after-load "haskell" + (defun haskell-multiedit () + (interactive) + (haskell-interactive-mode-return) + (switch-to-buffer "*haskell-temp*") + (haskell-mode) + (haskell-multiedit-mode)) + + (defun haskell-multiedit-evaluate-at-repl () + (interactive) + (let* ((contents (buffer-string)) + (lines (split-string contents "\n"))) + (switch-to-buffer (haskell-session-interactive-buffer (haskell-session))) + (insert ":{") + (haskell-interactive-mode-return) + (mapc #'(lambda (line) (insert line) (haskell-interactive-mode-return)) lines) + (insert ":}") + (haskell-interactive-mode-return))) + + (define-key haskell-interactive-mode-map (kbd "C-c '") #'haskell-multiedit) + (define-key haskell-multiedit-mode-map (kbd "C-c '") #'haskell-multiedit-evaluate-at-repl) + ) + +(provide 'haskell-multiedit) +;;; haskell-interactive-multiedit.el ends here |