haskell / haskell-mode

Emacs mode for Haskell
http://haskell.github.io/haskell-mode/
GNU General Public License v3.0
1.33k stars 344 forks source link

haskell-cabal-subsection-arrange-lines should take in account comments #1097

Open geraldus opened 8 years ago

geraldus commented 8 years ago

This is a tricky case I want to discuss. Consider following dependencies list of scaffolded Yesod application with three extra dependencies I've added manually at the end:

    build-depends: base                          >= 4          && < 5
                 , yesod                         >= 1.4.1      && < 1.5
                 …
                 , classy-prelude                >= 0.10.2
                 …
                 , template-haskell
                 …
                 , unordered-containers
                 , containers
                 , vector
                 , time
                 -- extra
                 , lambdacms-core
                 , blaze-html
                 , wai

Now if I run haskell-cabal-subsection-arrange-lines it becomes:

    build-depends: aeson                         >= 0.6        && < 0.10
                 , base                          >= 4          && < 5
                 …
                 , yesod-static                  >= 1.4.0.3    && < 1.6
                 -- extra
                 , lambdacms-core
                 , blaze-html
                 , wai

So, as you can see, everything till comment is rearranged as expected, but lines after comment leaved untouched. It is not matter where the point stands when re-arrange command is executed, the result is the same. In my current case I used comment to split dependency list into sections, but others can place comments for other needs. So, in my current case I expect the second section would be sorted independently of first one leaving comment as section separator (there is an easy way — wrap second section by region and call sort-lines).

Definitely it would be better if haskell-cabal-subsection-arrange-lines to sort whole list, but it's not clear how to deal with comments. I can think of few scenarios:

I think all this scenarios could be covered by some optional parameter, defaulting to current behaviour.

What do you think?

gracjan commented 8 years ago

This is relevant:

https://github.com/haskell/cabal/issues/2681

gracjan commented 8 years ago

@geraldus: Your example is better formatted like this:

    -- standard dependencies
    build-depends: base                          >= 4          && < 5
                 , yesod                         >= 1.4.1      && < 1.5
                 …
                 , classy-prelude                >= 0.10.2
                 …
                 , template-haskell
                 …
                 , unordered-containers
                 , containers
                 , vector
                 , time

    -- extra dependencies
    build-depends: lambdacms-core
                 , blaze-html
                 , wai

Then C-c C-s can format whole value as is.

geraldus commented 8 years ago

@gracjan indeed! I didn't know it is allowed to have several build-depends sections, thanks! Ok, let's discuss "comments as comments" cases in this case.

bergey commented 8 years ago

My preference would be:

I think that captures the styles I see most often. But obviously we can't support all possible styles, so I'm fine with whatever you decide to implement. If you decide not to treat comments as section separators, I have a slight preference for comments describing the following line.