From 10aad175451ba020cacb1a79253fec93d2021bf0 Mon Sep 17 00:00:00 2001 From: Antero Mejr Date: Fri, 22 Sep 2023 15:09:19 +0000 Subject: Add geiser-repl-superparen-mode minor mode. Disabled by default. Adds new custom variables "geiser-repl-superparen-character" and "geiser-repl-superparen-mode-p". --- elisp/geiser-mode.el | 2 ++ elisp/geiser-repl.el | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/elisp/geiser-mode.el b/elisp/geiser-mode.el index ad2e419..72efa29 100644 --- a/elisp/geiser-mode.el +++ b/elisp/geiser-mode.el @@ -330,6 +330,8 @@ With prefix, try to enter the current buffer's module." (mode "Autodoc mode" ("\C-c\C-d\C-a" "\C-c\C-da") geiser-autodoc-mode) (mode "Autoeval mode" ("\C-c\C-d\C-e" "\C-c\C-de") geiser-repl-autoeval-mode) + (mode "Superparen mode" ("\C-c\C-d\C-s" "\C-c\C-ds") + geiser-repl-superparen-mode) -- ("Compile buffer" "\C-c\C-k" geiser-compile-current-buffer) ("Switch to REPL" "\C-c\C-z" geiser-mode-switch-to-repl) diff --git a/elisp/geiser-repl.el b/elisp/geiser-repl.el index a0c4b44..5f2743e 100644 --- a/elisp/geiser-repl.el +++ b/elisp/geiser-repl.el @@ -227,6 +227,14 @@ See also `geiser-repl-startup-hook'." "Whether `geiser-repl-autoeval-mode' gets enabled by default in REPL buffers." :type 'boolean) +(geiser-custom--defcustom geiser-repl-superparen-mode-p nil + "Whether `geiser-repl-superparen-mode' gets enabled by default in REPL buffers." + :type 'boolean) + +(geiser-custom--defcustom geiser-repl-superparen-character ?\] + "The character that represents a closing super parentheses." + :type 'character) + (geiser-custom--defface repl-input 'comint-highlight-input geiser-repl "evaluated input highlighting") @@ -834,6 +842,41 @@ This mode may cause issues with structural editing modes such as paredit." (message "Geiser Autoeval %s" (if geiser-repl-autoeval-mode "enabled" "disabled")))) + +;;; geiser-repl-superparen-mode minor mode: + +(defun geiser-repl--superparen-function () + (if (char-equal (char-before) geiser-repl-superparen-character) + (progn (delete-backward-char 1) + (insert-char ?\) (geiser-repl--nesting-level))))) + +(defvar-local geiser-repl-superparen-mode-string " S" + "Modeline indicator for geiser-repl-superparen-mode") + +(define-minor-mode geiser-repl-superparen-mode + "Toggle the Geiser REPL's Superparen mode. +With no argument, this command toggles the mode. +Non-null prefix argument turns on the mode. +Null prefix argument turns off the mode. + +When Superparen mode is enabled, entering the `geiser-repl-superparen-char' +character, which is ']' by default, will close all parentheses of the expression +currently being typed. + +This mode may cause issues with structural editing modes such as paredit." + :init-value nil + :lighter geiser-repl-superparen-mode-string + :group 'geiser-repl + + (if geiser-repl-superparen-mode + (add-hook 'post-self-insert-hook #'geiser-repl--superparen-function nil t) + (remove-hook 'post-self-insert-hook #'geiser-repl--superparen-function t)) + (when (called-interactively-p nil) + (if geiser-repl-superparen-mode + (message "Geiser Superparen enabled, using the %c character." + geiser-repl-superparen-character) + (message "Geiser Superparen disabled.")))) + ;;; geiser-repl mode: @@ -985,6 +1028,8 @@ buffer." (mode "Autodoc mode" ("\C-c\C-da" "\C-c\C-d\C-a") geiser-autodoc-mode) (mode "Autoeval mode" ("\C-c\C-de" "\C-c\C-d\C-e") geiser-repl-autoeval-mode) + (mode "Superparen mode" ("\C-c\C-ds" "\C-c\C-d\C-s") + geiser-repl-superparen-mode) ("Symbol documentation" ("\C-c\C-dd" "\C-c\C-d\C-d") geiser-doc-symbol-at-point "Documentation for symbol at point" :enable (geiser--symbol-at-point)) @@ -1041,6 +1086,8 @@ buffer." (setq geiser-autodoc-mode-string "/E") (when geiser-repl-autoeval-mode-p (geiser-repl-autoeval-mode 1)) + (when geiser-repl-superparen-mode-p + (geiser-repl-superparen-mode 1)) ;; enabling compilation-shell-minor-mode without the annoying highlighter (compilation-setup t)) -- cgit v1.2.3