Skip to content

Commit

Permalink
Change indent-sexp advice not to indent first line
Browse files Browse the repository at this point in the history
Closes #293.
Closes #391.

Move lisp-mode advice to its own file, improve comments/doc strings
  • Loading branch information
greghendershott committed Jan 30, 2024
1 parent 5a739e2 commit d3ab936
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 19 deletions.
19 changes: 1 addition & 18 deletions 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
Expand Down Expand Up @@ -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.
Expand Down
65 changes: 65 additions & 0 deletions 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
3 changes: 2 additions & 1 deletion 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"))
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit d3ab936

Please sign in to comment.