From 1b2a881c9b3ef9158cbf28a65b9e94c2dbc6cec2 Mon Sep 17 00:00:00 2001 From: akater Date: Fri, 29 May 2020 00:26:09 -0400 Subject: [PATCH] * lisp/emacs-lisp/lisp-mode.el: Add new indentation convention (calculate-lisp-indent): To distinguish code and data when indenting, introduce the convention that a space between an open paren and a symbol indicate that this should be indented as a simple data list. --- etc/NEWS | 4 ++++ lisp/emacs-lisp/lisp-mode.el | 8 ++++++-- test/manual/indent/elisp.el | 5 +++++ test/manual/indent/lisp.lisp | 5 +++++ 4 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 test/manual/indent/elisp.el create mode 100644 test/manual/indent/lisp.lisp diff --git a/etc/NEWS b/etc/NEWS index cb17a93f069..64cf0abbdb4 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -128,6 +128,10 @@ displayed and which are kept hidden. ** Emacs Lisp mode *** The mode-line now indicates whether we're using lexical or dynamic scoping. +*** A space between an open paren and a symbol changes the indentation rule. +The presence of a space between an open paren and a symbol now is +taken as a statement by the programmer that this should be indented +as a data list rather than as a piece of code. ** Dired diff --git a/lisp/emacs-lisp/lisp-mode.el b/lisp/emacs-lisp/lisp-mode.el index 7098a41f274..1311d94cb01 100644 --- a/lisp/emacs-lisp/lisp-mode.el +++ b/lisp/emacs-lisp/lisp-mode.el @@ -956,6 +956,7 @@ is the buffer position of the start of the containing expression." ;; setting this to a number inhibits calling hook (desired-indent nil) (retry t) + whitespace-after-open-paren calculate-lisp-indent-last-sexp containing-sexp) (cond ((or (markerp parse-start) (integerp parse-start)) (goto-char parse-start)) @@ -985,6 +986,7 @@ is the buffer position of the start of the containing expression." nil ;; Innermost containing sexp found (goto-char (1+ containing-sexp)) + (setq whitespace-after-open-paren (looking-at (rx whitespace))) (if (not calculate-lisp-indent-last-sexp) ;; indent-point immediately follows open paren. ;; Don't call hook. @@ -999,9 +1001,11 @@ is the buffer position of the start of the containing expression." calculate-lisp-indent-last-sexp) ;; This is the first line to start within the containing sexp. ;; It's almost certainly a function call. - (if (= (point) calculate-lisp-indent-last-sexp) + (if (or (= (point) calculate-lisp-indent-last-sexp) + whitespace-after-open-paren) ;; Containing sexp has nothing before this line - ;; except the first element. Indent under that element. + ;; except the first element, or the first element is + ;; preceded by whitespace. Indent under that element. nil ;; Skip the first element, find start of second (the first ;; argument of the function call) and indent under. diff --git a/test/manual/indent/elisp.el b/test/manual/indent/elisp.el new file mode 100644 index 00000000000..f3874b5c3e0 --- /dev/null +++ b/test/manual/indent/elisp.el @@ -0,0 +1,5 @@ +(defun x () + (print (quote ( thingy great + stuff))) + (print (quote (thingy great + stuff)))) diff --git a/test/manual/indent/lisp.lisp b/test/manual/indent/lisp.lisp new file mode 100644 index 00000000000..f3874b5c3e0 --- /dev/null +++ b/test/manual/indent/lisp.lisp @@ -0,0 +1,5 @@ +(defun x () + (print (quote ( thingy great + stuff))) + (print (quote (thingy great + stuff)))) -- 2.39.5