unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* [ruby-mode] dot-alignment support for multi-line method chaining
@ 2014-01-21 12:25 Bozhidar Batsov
  2014-01-22 13:41 ` Dmitry Gutov
  0 siblings, 1 reply; 6+ messages in thread
From: Bozhidar Batsov @ 2014-01-21 12:25 UTC (permalink / raw)
  To: emacs-devel

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

Currently when doing method chaining on multiple lines we get the following indentation: 

something.ala
  .one
  .two
  .three

An alternative style that seems to be popular is:

something.ala
               .one
               .two
               .three

Here are some references (not just for Ruby):

* http://en.wikipedia.org/wiki/Fluent_interface
* https://github.com/bbatsov/ruby-style-guide/pull/176#issuecomment-18664622

I guess it will be good if ruby-mode supported the alternative style via some customisable option. 

-- 
Cheers,
Bozhidar


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

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

* Re: [ruby-mode] dot-alignment support for multi-line method chaining
  2014-01-21 12:25 [ruby-mode] dot-alignment support for multi-line method chaining Bozhidar Batsov
@ 2014-01-22 13:41 ` Dmitry Gutov
  2014-01-22 17:28   ` Bozhidar Batsov
  0 siblings, 1 reply; 6+ messages in thread
From: Dmitry Gutov @ 2014-01-22 13:41 UTC (permalink / raw)
  To: Bozhidar Batsov; +Cc: emacs-devel

Hi!

Bozhidar Batsov <bozhidar@batsov.com> writes:

> Currently when doing method chaining on multiple lines we get the
> following indentation: 
>
> something.ala
> .one
> .two
> .three
>
> An alternative style that seems to be popular is:
>
> something.ala
> .one
> .two
> .three

Good suggestion, but it looks harder than the previous ones, and it'll
require modifying (or maybe "fixing") the SMIE grammar. At the moment,
the parent of a "." token is never the previous ".".

I have an experimental patch, included at the end, but it throws up some
grammar priority warnings, and it changes the indentation in the
following example:

zoo.keep.bar!(
   {x: y,
    z: t})

If I modify the code a little, the indentation here will be like this:

zoo.keep.bar!(
     {x: y,
      z: t})

which corresponds to

zoo.keep.bar!(
     {x: y,
      z: t}
   )

which, in turn, is a small modification of

zoo.keep
   .bar!(
     {x: y,
      z: t}
   )

Would you consider this appropriate, for the "fluent interface"
indentation? Or how would you indent it instead?

By the way, do you think it'd be good if the same variable toggled between

foo = foobar
      .baz

and

foo = foobar
  .baz

? Or would that be a different variable?

P.S. Could you use the bug tracker for feature requests next time? Bugs
are easier to keep track of and to get back to later.


=== modified file 'lisp/progmodes/ruby-mode.el'
--- lisp/progmodes/ruby-mode.el	2014-01-17 03:15:02 +0000
+++ lisp/progmodes/ruby-mode.el	2014-01-22 13:25:38 +0000
@@ -351,7 +351,7 @@
              (exp "and" exp) (exp "or" exp))
        (exp  (exp1) (exp "," exp) (exp "=" exp)
              (id " @ " exp)
-             (exp "." id))
+             (id "." exp))
        (exp1 (exp2) (exp2 "?" exp1 ":" exp1))
        (exp2 ("def" insts "end")
              ("begin" insts-rescue-insts "end")
@@ -380,7 +380,7 @@
        (ielsei (itheni) (itheni "else" insts))
        (if-body (ielsei) (if-body "elsif" if-body)))
      '((nonassoc "in") (assoc ";") (right " @ ")
-       (assoc ",") (right "=") (assoc "."))
+       (assoc ",") (right "="))
      '((assoc "when"))
      '((assoc "elsif"))
      '((assoc "rescue" "ensure"))
@@ -399,7 +399,8 @@
        (nonassoc ">" ">=" "<" "<=")
        (nonassoc "==" "===" "!=")
        (nonassoc "=~" "!~")
-       (left "<<" ">>"))))))
+       (left "<<" ">>")
+       (assoc "."))))))
 
 (defun ruby-smie--bosp ()
   (save-excursion (skip-chars-backward " \t")
@@ -622,7 +623,10 @@
        (unless (or (eolp) (forward-comment 1))
          (cons 'column (current-column)))))
     (`(:before . "do") (ruby-smie--indent-to-stmt))
-    (`(:before . ".") ruby-indent-level)
+    (`(:before . ".")
+     (if (smie-rule-sibling-p)
+         0
+       ruby-indent-level))
     (`(:after . "=>") ruby-indent-level)
     (`(:before . ,(or `"else" `"then" `"elsif" `"rescue" `"ensure"))
      (smie-rule-parent))




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

* Re: [ruby-mode] dot-alignment support for multi-line method chaining
  2014-01-22 13:41 ` Dmitry Gutov
@ 2014-01-22 17:28   ` Bozhidar Batsov
  2014-01-30  4:31     ` Dmitry Gutov
  0 siblings, 1 reply; 6+ messages in thread
From: Bozhidar Batsov @ 2014-01-22 17:28 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: emacs-devel

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

On 22 January 2014 15:41, Dmitry Gutov <dgutov@yandex.ru> wrote:

> Hi!
>
> Bozhidar Batsov <bozhidar@batsov.com> writes:
>
> > Currently when doing method chaining on multiple lines we get the
> > following indentation:
> >
> > something.ala
> > .one
> > .two
> > .three
> >
> > An alternative style that seems to be popular is:
> >
> > something.ala
> > .one
> > .two
> > .three
>
> Good suggestion, but it looks harder than the previous ones, and it'll
> require modifying (or maybe "fixing") the SMIE grammar. At the moment,
> the parent of a "." token is never the previous ".".
>
> I have an experimental patch, included at the end, but it throws up some
> grammar priority warnings, and it changes the indentation in the
> following example:
>
> zoo.keep.bar!(
>    {x: y,
>     z: t})
>
> If I modify the code a little, the indentation here will be like this:
>
> zoo.keep.bar!(
>      {x: y,
>       z: t})
>
> which corresponds to
>
> zoo.keep.bar!(
>      {x: y,
>       z: t}
>    )
>
> which, in turn, is a small modification of
>
> zoo.keep
>    .bar!(
>      {x: y,
>       z: t}
>    )
>
> Would you consider this appropriate, for the "fluent interface"
> indentation? Or how would you indent it instead?
>

Hard to read indentation examples in an email, but it seems to me that:

zoo.keep.bar!(
  {x: y,
   z: t}
)

is the only sensible indentation for the third example and the forth should
be:

zoo.keep
     .bar!(
       {x: y,
        z: t}
     )

when using the fluent-api-style indentation.


>
> By the way, do you think it'd be good if the same variable toggled between
>
> foo = foobar
>       .baz
>
> and
>
> foo = foobar
>   .baz
>
> ? Or would that be a different variable?
>

Didn't notice this until now. Seems to me the default indent should be
relative to the `=` (similar to what we do for ops like +, -, etc):

foo = foobar
          .baz


>
> P.S. Could you use the bug tracker for feature requests next time? Bugs
> are easier to keep track of and to get back to later.
>

Sure.


>
>
> === modified file 'lisp/progmodes/ruby-mode.el'
> --- lisp/progmodes/ruby-mode.el 2014-01-17 03:15:02 +0000
> +++ lisp/progmodes/ruby-mode.el 2014-01-22 13:25:38 +0000
> @@ -351,7 +351,7 @@
>               (exp "and" exp) (exp "or" exp))
>         (exp  (exp1) (exp "," exp) (exp "=" exp)
>               (id " @ " exp)
> -             (exp "." id))
> +             (id "." exp))
>         (exp1 (exp2) (exp2 "?" exp1 ":" exp1))
>         (exp2 ("def" insts "end")
>               ("begin" insts-rescue-insts "end")
> @@ -380,7 +380,7 @@
>         (ielsei (itheni) (itheni "else" insts))
>         (if-body (ielsei) (if-body "elsif" if-body)))
>       '((nonassoc "in") (assoc ";") (right " @ ")
> -       (assoc ",") (right "=") (assoc "."))
> +       (assoc ",") (right "="))
>       '((assoc "when"))
>       '((assoc "elsif"))
>       '((assoc "rescue" "ensure"))
> @@ -399,7 +399,8 @@
>         (nonassoc ">" ">=" "<" "<=")
>         (nonassoc "==" "===" "!=")
>         (nonassoc "=~" "!~")
> -       (left "<<" ">>"))))))
> +       (left "<<" ">>")
> +       (assoc "."))))))
>
>  (defun ruby-smie--bosp ()
>    (save-excursion (skip-chars-backward " \t")
> @@ -622,7 +623,10 @@
>         (unless (or (eolp) (forward-comment 1))
>           (cons 'column (current-column)))))
>      (`(:before . "do") (ruby-smie--indent-to-stmt))
> -    (`(:before . ".") ruby-indent-level)
> +    (`(:before . ".")
> +     (if (smie-rule-sibling-p)
> +         0
> +       ruby-indent-level))
>      (`(:after . "=>") ruby-indent-level)
>      (`(:before . ,(or `"else" `"then" `"elsif" `"rescue" `"ensure"))
>       (smie-rule-parent))
>
>

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

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

* Re: [ruby-mode] dot-alignment support for multi-line method chaining
  2014-01-22 17:28   ` Bozhidar Batsov
@ 2014-01-30  4:31     ` Dmitry Gutov
  2014-01-30  8:51       ` Andreas Schwab
  0 siblings, 1 reply; 6+ messages in thread
From: Dmitry Gutov @ 2014-01-30  4:31 UTC (permalink / raw)
  To: Bozhidar Batsov; +Cc: emacs-devel

See http://debbugs.gnu.org/16593

On 22.01.2014 19:28, Bozhidar Batsov wrote:
> Hard to read indentation examples in an email, but it seems to me that:

Yeah, both Gnus and Thunderbird mangle indentation quite a bit for me. 
lists.gnu.org displays it right, though.

> zoo.keep.bar!(
>    {x: y,
>     z: t}
> )
>
> is the only sensible indentation for the third example

It doesn't seem to correspond to the AST, but sure, this looks nicer.

>     By the way, do you think it'd be good if the same variable toggled
>     between
>
>     foo = foobar
>            .baz
>
>     and
>
>     foo = foobar
>        .baz
>
>     ? Or would that be a different variable?
>
>
> Didn't notice this until now. Seems to me the default indent should be
> relative to the `=` (similar to what we do for ops like +, -, etc):

Okay, won't touch this for now, then,



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

* Re: [ruby-mode] dot-alignment support for multi-line method chaining
  2014-01-30  4:31     ` Dmitry Gutov
@ 2014-01-30  8:51       ` Andreas Schwab
  2014-01-30 14:45         ` Dmitry Gutov
  0 siblings, 1 reply; 6+ messages in thread
From: Andreas Schwab @ 2014-01-30  8:51 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: Bozhidar Batsov, emacs-devel

Dmitry Gutov <dgutov@yandex.ru> writes:

> On 22.01.2014 19:28, Bozhidar Batsov wrote:
>> Hard to read indentation examples in an email, but it seems to me that:
>
> Yeah, both Gnus and Thunderbird mangle indentation quite a bit for
> me.

You should ignore the totally stupid html part (adding "text/html" to
mm-discouraged-alternatives will save your life).

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."



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

* Re: [ruby-mode] dot-alignment support for multi-line method chaining
  2014-01-30  8:51       ` Andreas Schwab
@ 2014-01-30 14:45         ` Dmitry Gutov
  0 siblings, 0 replies; 6+ messages in thread
From: Dmitry Gutov @ 2014-01-30 14:45 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: Bozhidar Batsov, emacs-devel

Andreas Schwab <schwab@linux-m68k.org> writes:

> You should ignore the totally stupid html part (adding "text/html" to
> mm-discouraged-alternatives will save your life).

Thanks, this make things better in Gnus, but also makes it apparent that
Bozhidar's messages are written using proportional font, so the examples
still don't line up in a monospace reader.

Thunderbird actually renders the html very similarly to lists.gnu.org,
so both look better.



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

end of thread, other threads:[~2014-01-30 14:45 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-01-21 12:25 [ruby-mode] dot-alignment support for multi-line method chaining Bozhidar Batsov
2014-01-22 13:41 ` Dmitry Gutov
2014-01-22 17:28   ` Bozhidar Batsov
2014-01-30  4:31     ` Dmitry Gutov
2014-01-30  8:51       ` Andreas Schwab
2014-01-30 14:45         ` Dmitry Gutov

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).