unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#21922: Indentation of Emacs Lisp list constants is surprising
@ 2015-11-14 18:29 Clément Pit--Claudel
  2015-11-15 19:28 ` Eli Zaretskii
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Clément Pit--Claudel @ 2015-11-14 18:29 UTC (permalink / raw)
  To: 21922

[-- Attachment #1: Type: text/plain, Size: 3899 bytes --]

Hi all,

I'm posting this following a suggestion from Stefan on a discussion on
Emacs' stackexchange site at https://emacs.stackexchange.com/questions/16942/

Emacs' indentation of Emacs Lisp code is really great, except for one thing:

(defconst one-to-ten '(one two three
                           four five six seven
                           eight nine ten))

Is this actually the preferred way to indent this block? As opposed to

(defconst one-to-ten '(one two three
                       four five six seven
                       eight nine ten))

I find it especially confusing when compared to the default for alists:

(defconst one-to-ten '((one . 1) (two . 2) (three . 3)
                       (four . 4) (five . 5) (six . 6) (seven . 7)
                       (eight . 8) (nine . 9) (ten . 10)))

Is there a reason for this behaviour? I could possibly understand it for 
back-quoted lists, as it would yield better indentation for macros, but 
what about lists? On stackexchange, Oleh suggested using  

(setq lisp-indent-function 'common-lisp-indent-function)

Cheers,
Clément.

In GNU Emacs 25.1.50.1 (x86_64-unknown-linux-gnu, GTK+ Version 3.10.8)
 of 2015-11-14
Repository revision: 02bf89f857e04b8023ce03eadcfa87c82918e957
Windowing system distributor 'The X.Org Foundation', version 11.0.11501000
System Description:	Linux Mint 17.2 Rafaela

Configured using:
 'configure --with-x-toolkit=gtk3'

Configured features:
XPM JPEG TIFF GIF PNG RSVG IMAGEMAGICK SOUND GPM DBUS GCONF GSETTINGS
NOTIFY ACL LIBSELINUX GNUTLS LIBXML2 FREETYPE M17N_FLT LIBOTF XFT ZLIB
TOOLKIT_SCROLL_BARS GTK3 X11

Important settings:
  value of $LC_TIME: en_DK.UTF-8
  value of $LANG: en_US.UTF-8
  value of $XMODIFIERS: @im=ibus
  locale-coding-system: utf-8-unix

Major mode: Lisp Interaction

Minor modes in effect:
  tooltip-mode: t
  global-eldoc-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  line-number-mode: t
  transient-mark-mode: t

Recent messages:
For information about GNU Emacs and the GNU system, type C-h C-a.

Load-path shadows:
None found.

Features:
(shadow sort gnus-util mail-extr emacsbug message dired format-spec
rfc822 mml mml-sec mm-decode mm-bodies mm-encode mail-parse rfc2231
mailabbrev gmm-utils mailheader sendmail rfc2047 rfc2045 ietf-drums
mm-util help-fns help-mode easymenu cl-loaddefs pcase cl-lib mail-prsvr
mail-utils time-date mule-util tooltip eldoc electric uniquify
ediff-hook vc-hooks lisp-float-type mwheel x-win term/common-win x-dnd
tool-bar dnd fontset image regexp-opt fringe tabulated-list newcomment
elisp-mode lisp-mode prog-mode register page menu-bar rfn-eshadow timer
select scroll-bar mouse jit-lock font-lock syntax facemenu font-core
frame cl-generic cham georgian utf-8-lang misc-lang vietnamese tibetan
thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian
slovak czech european ethiopic indian cyrillic chinese charscript
case-table epa-hook jka-cmpr-hook help simple abbrev minibuffer
cl-preloaded nadvice loaddefs button faces cus-face macroexp files
text-properties overlay sha1 md5 base64 format env code-pages mule
custom widget hashtable-print-readable backquote dbusbind inotify
dynamic-setting system-font-setting font-render-setting move-toolbar gtk
x-toolkit x multi-tty make-network-process emacs)

Memory information:
((conses 16 80441 7581)
 (symbols 48 19255 0)
 (miscs 40 38 110)
 (strings 32 12779 4612)
 (string-bytes 1 365820)
 (vectors 16 10757)
 (vector-slots 8 419611 2876)
 (floats 8 143 70)
 (intervals 56 194 0)
 (buffers 976 11)
 (heap 1024 25940 1037))




[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* bug#21922: Indentation of Emacs Lisp list constants is surprising
  2015-11-14 18:29 bug#21922: Indentation of Emacs Lisp list constants is surprising Clément Pit--Claudel
@ 2015-11-15 19:28 ` Eli Zaretskii
  2015-11-16  0:33 ` Dmitry Gutov
  2019-09-24  3:16 ` bug#21922: Patch for fixing the "straight-quote" case Luis Henriquez-Perez
  2 siblings, 0 replies; 5+ messages in thread
From: Eli Zaretskii @ 2015-11-15 19:28 UTC (permalink / raw)
  To: Clément Pit--Claudel; +Cc: 21922

> From: Clément Pit--Claudel <clement.pitclaudel@live.com>
> Date: Sat, 14 Nov 2015 13:29:54 -0500
> 
> I'm posting this following a suggestion from Stefan on a discussion on
> Emacs' stackexchange site at https://emacs.stackexchange.com/questions/16942/
> 
> Emacs' indentation of Emacs Lisp code is really great, except for one thing:
> 
> (defconst one-to-ten '(one two three
>                            four five six seven
>                            eight nine ten))
> 
> Is this actually the preferred way to indent this block? As opposed to
> 
> (defconst one-to-ten '(one two three
>                        four five six seven
>                        eight nine ten))
> 
> I find it especially confusing when compared to the default for alists:
> 
> (defconst one-to-ten '((one . 1) (two . 2) (three . 3)
>                        (four . 4) (five . 5) (six . 6) (seven . 7)
>                        (eight . 8) (nine . 9) (ten . 10)))
> 

FWIW, Stefan was wrong: Emacs behaved like that since at least
Emacs 22, so recent changes didn't change this in any way.





^ permalink raw reply	[flat|nested] 5+ messages in thread

* bug#21922: Indentation of Emacs Lisp list constants is surprising
  2015-11-14 18:29 bug#21922: Indentation of Emacs Lisp list constants is surprising Clément Pit--Claudel
  2015-11-15 19:28 ` Eli Zaretskii
@ 2015-11-16  0:33 ` Dmitry Gutov
  2019-09-24  3:16 ` bug#21922: Patch for fixing the "straight-quote" case Luis Henriquez-Perez
  2 siblings, 0 replies; 5+ messages in thread
From: Dmitry Gutov @ 2015-11-16  0:33 UTC (permalink / raw)
  To: Clément Pit--Claudel, 21922

Hi Clément,

On 11/14/2015 08:29 PM, Clément Pit--Claudel wrote:

> I'm posting this following a suggestion from Stefan on a discussion on
> Emacs' stackexchange site at https://emacs.stackexchange.com/questions/16942/

See Stefan's comment under your question. I also think it's a bug.

> Is there a reason for this behaviour? I could possibly understand it for
> back-quoted lists, as it would yield better indentation for macros, but
> what about lists?

We'll have to keep back-quoted lists an exception either way, for 
macros, and because of that we'll sometimes mis-indent "value" lists as 
well, because it can be handy to use backquotes for them, too.

That might be the main reason we haven't bothered to fix this yet. But 
someone should look into fixing the straight-quote case at least, and 
propose a patch.

> On stackexchange, Oleh suggested using
>
> (setq lisp-indent-function 'common-lisp-indent-function)

We recommend against this, e.g. because it would cause a lot of 
indentation changes in the Emacs codebase.






^ permalink raw reply	[flat|nested] 5+ messages in thread

* bug#21922: Patch for fixing the "straight-quote" case
  2015-11-14 18:29 bug#21922: Indentation of Emacs Lisp list constants is surprising Clément Pit--Claudel
  2015-11-15 19:28 ` Eli Zaretskii
  2015-11-16  0:33 ` Dmitry Gutov
@ 2019-09-24  3:16 ` Luis Henriquez-Perez
  2019-10-09  3:41   ` Noam Postavsky
  2 siblings, 1 reply; 5+ messages in thread
From: Luis Henriquez-Perez @ 2019-09-24  3:16 UTC (permalink / raw)
  To: 21922

[-- Attachment #1: Type: text/plain, Size: 1584 bytes --]

Hi,

In regards to the issue on the indentation of quoted lists, I'd like to
propose a patch.

It would be changing the predicate of this conditional in the function
`calculate-lisp-indent`.

(if
    (= (point) calculate-lisp-indent-last-sexp)
    ;; Containing sexp has nothing before this line
    ;; except the first element.  Indent under that element.
    nil
  ;; Skip the first element, find start of second (the first
  ;; argument of the function call) and indent under.
  (progn (forward-sexp 1)
         (parse-partial-sexp (point)
                             calculate-lisp-indent-last-sexp
                             0 t)))

It would to this:

(or
 (= (point) calculate-lisp-indent-last-sexp)

 (when-let (point (char-before containing-sexp))
   (char-equal point ?'))

 (let ((quoted-p nil)
       (point nil)
       (positions (nreverse (butlast (elt state 9)))))
   (while (and positions (not quoted-p))
     (setq point (pop positions))
     (setq quoted-p
           (or
            (and (char-before point)
                 (char-equal (char-before point) ?'))
            (save-excursion
              (goto-char (1+ point))
              (looking-at-p "quote[\t\n\f\s]+(")))))
   quoted-p))

This code checks if the `containing-sexp` is quoted and if so indents it
normally (under the first element).

It works for forms quoted with the quote abbreviation ie:
'(a b c d
  e f g)

It also works for explicit quoting:
(quote (a b c
            d e))

Additionally it works for nested lists that are quoted.

'((a b c
   d e))

Please let me know what you think.

[-- Attachment #2: Type: text/html, Size: 3101 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* bug#21922: Patch for fixing the "straight-quote" case
  2019-09-24  3:16 ` bug#21922: Patch for fixing the "straight-quote" case Luis Henriquez-Perez
@ 2019-10-09  3:41   ` Noam Postavsky
  0 siblings, 0 replies; 5+ messages in thread
From: Noam Postavsky @ 2019-10-09  3:41 UTC (permalink / raw)
  To: Luis Henriquez-Perez; +Cc: 21922

Luis Henriquez-Perez <luishenriquezperez@gmail.com> writes:

>  (when-let (point (char-before containing-sexp))
>    (char-equal point ?'))

>             (and (char-before point)
>                  (char-equal (char-before point) ?'))

You can use eq instead of char-equal, and then the extra check for nil
isn't needed.

>             (save-excursion
>               (goto-char (1+ point))
>               (looking-at-p "quote[\t\n\f\s]+(")))))

I would suggest (looking-at-p "[[:whitespace:]\n]*quote\_>") instead,
and maybe move the save-excursion outside of the loop.

Overall, the approach looks reasonable to me.





^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2019-10-09  3:41 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-11-14 18:29 bug#21922: Indentation of Emacs Lisp list constants is surprising Clément Pit--Claudel
2015-11-15 19:28 ` Eli Zaretskii
2015-11-16  0:33 ` Dmitry Gutov
2019-09-24  3:16 ` bug#21922: Patch for fixing the "straight-quote" case Luis Henriquez-Perez
2019-10-09  3:41   ` Noam Postavsky

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).