emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/racket-mode d3ab936af1: Change indent-sexp advice not to i


From: ELPA Syncer
Subject: [nongnu] elpa/racket-mode d3ab936af1: Change indent-sexp advice not to indent first line
Date: Wed, 31 Jan 2024 10:03:04 -0500 (EST)

branch: elpa/racket-mode
commit d3ab936af10909874443cadb2e6c952faf2f536f
Author: Greg Hendershott <git@greghendershott.com>
Commit: Greg Hendershott <git@greghendershott.com>

    Change indent-sexp advice not to indent first line
    
    Closes #293.
    Closes #391.
    
    Move lisp-mode advice to its own file, improve comments/doc strings
---
 racket-indent.el    | 19 +---------------
 racket-lisp-mode.el | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 racket-mode.el      |  3 ++-
 3 files changed, 68 insertions(+), 19 deletions(-)

diff --git a/racket-indent.el b/racket-indent.el
index dd344ee834..3493023309 100644
--- a/racket-indent.el
+++ b/racket-indent.el
@@ -1,6 +1,6 @@
 ;;; racket-indent.el -*- lexical-binding: t; -*-
 
-;; Copyright (c) 2013-2022 by Greg Hendershott.
+;; Copyright (c) 2013-2024 by Greg Hendershott.
 ;; Portions Copyright (C) 1985-1986, 1999-2013 Free Software Foundation, Inc.
 
 ;; Author: Greg Hendershott
@@ -32,23 +32,6 @@
 ;; `racket-indent-line'. That just directly calls
 ;; `racket-indent-function'.
 
-;; Having said all that, we still have the matter of `paredit-mode'.
-;; It directly calls `lisp-indent-line' instead of
-;; `indent-line-function'. And, it directly calls `indent-sexp'
-;; instead of `prog-indent-sexp'. Therefore it gets `lisp-mode'
-;; indent, not ours. To address this, advise those two functions to do
-;; the right thing when one of our major modes is active.
-(defun racket--lisp-indent-line-advice (orig &rest args)
-  "If `racket--mode-edits-racket-p' use the variable `indent-line-function'."
-  (apply (if (racket--mode-edits-racket-p) indent-line-function orig)
-         args))
-(defun racket--indent-sexp-advice (orig &rest args)
-  "If `racket--mode-edits-racket-p' use `prog-indent-sexp'."
-  (apply (if (racket--mode-edits-racket-p) #'prog-indent-sexp orig)
-         args))
-(advice-add 'lisp-indent-line :around #'racket--lisp-indent-line-advice)
-(advice-add 'indent-sexp      :around #'racket--indent-sexp-advice)
-
 (defun racket-indent-line (&optional _whole-exp)
   "Indent current line as Racket code.
 
diff --git a/racket-lisp-mode.el b/racket-lisp-mode.el
new file mode 100644
index 0000000000..b5ef93ac0d
--- /dev/null
+++ b/racket-lisp-mode.el
@@ -0,0 +1,65 @@
+;;; racket-lisp-mode.el -*- lexical-binding: t; -*-
+
+;; Copyright (c) 2013-2024 by Greg Hendershott.
+;; Portions Copyright (C) 1985-1986, 1999-2013 Free Software Foundation, Inc.
+
+;; Author: Greg Hendershott
+;; URL: https://github.com/greghendershott/racket-mode
+
+;; SPDX-License-Identifier: GPL-3.0-or-later
+
+;; Some packages like paredit and lispy directly call `lisp-mode'
+;; functions `lisp-indent-line' and `indent-sexp'. (As opposed to
+;; calling functions like `indent-line-to' and `prog-indent-sexp' that
+;; a mode can specialize via `indent-line-function' and
+;; `indent-region-function'.)
+;;
+;; Although that's fine for modes like `scheme-mode' derived from
+;; `lisp-mode', `racket-mode' is not.
+;;
+;; Therefore if users want to use such packages hardwired to call
+;; those two `lisp-mode' function, AFAICT we have no choice but to
+;; advise those two functions. :(
+;;
+;; Furthermore lisp-mode's `indent-sexp' differs from
+;; `prog-indent-sexp' as explained below in the doc string for
+;; `racket-indent-sexp-contents'.
+
+(require 'lisp-mode)
+(require 'racket-util)
+
+(defun racket--lisp-indent-line-advice (orig &rest args)
+  (apply (if (racket--mode-edits-racket-p)
+             indent-line-function
+           orig)
+         args))
+
+(advice-add #'lisp-indent-line :around #'racket--lisp-indent-line-advice)
+
+(defun racket--indent-sexp-advice (orig &rest args)
+  (apply (if (racket--mode-edits-racket-p)
+             #'racket-indent-sexp-contents
+           orig)
+         args))
+
+(advice-add #'indent-sexp :around #'racket--indent-sexp-advice)
+
+(defun racket-indent-sexp-contents ()
+  "Indent each line of the sexp starting just after point.
+
+Unlike `prog-indent-sexp', which indents the entire sexp, this
+does /not/ indent the first line at point, just subsequent lines
+if any. In other words it does not indent the sexp as a whole,
+just its contents. In this regard it behaves like the
+`lisp-mode'-specific function `indent-sexp'."
+  (interactive)
+  (condition-case _
+      (let ((beg-of-2nd-line   (save-excursion (forward-line 1) (point)))
+            (end-of-expression (save-excursion (forward-sexp 1) (point))))
+        (when (< beg-of-2nd-line end-of-expression)
+          (indent-region beg-of-2nd-line end-of-expression)))
+    (scan-error nil)))
+
+(provide 'racket-lisp-mode)
+
+;; racket-lisp-mode.el ends here
diff --git a/racket-mode.el b/racket-mode.el
index 5b1bc8e9de..d995ee2591 100644
--- a/racket-mode.el
+++ b/racket-mode.el
@@ -1,6 +1,6 @@
 ;;; racket-mode.el --- Racket editing, REPL, and more  -*- lexical-binding: t; 
-*-
 
-;; Copyright (c) 2013-2023 by Greg Hendershott.
+;; Copyright (c) 2013-2024 by Greg Hendershott.
 
 ;; Package: racket-mode
 ;; Package-Requires: ((emacs "25.1"))
@@ -36,6 +36,7 @@
 (require 'racket-repl)
 (require 'racket-repl-buffer-name)
 (require 'racket-collection)
+(require 'racket-lisp-mode)
 (require 'racket-bug-report)
 (require 'racket-util)
 (require 'easymenu)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]