neovimhaskell / haskell-vim

Custom Haskell Vimscripts
BSD 2-Clause "Simplified" License
682 stars 84 forks source link

do-block inside if/then confuses indentation of else block #127

Open DestyNova opened 3 years ago

DestyNova commented 3 years ago

I typed in this example:

main = do
  let n = 1

  if n > 0
     then do
       print 1
       else print 2

The else is indented too far and should be directly under the then. If I use << to unindent the else line, it only moves left by one space and I have to manually delete a space from the beginning of the line. I'm not sure if there's a specific interaction between the do and the if-then-else.

However, another example shows if the else block doesn't immediately follow on the next line from the then, it doesn't indent properly. If I hit enter after the then, the cursor lines up at the same level as then. Hitting tab inserts a single space, then I type the number 123, hit enter and type else, which lines up with the 123, ending with a similar result to the do example:

  let n = 1
  if n > 0
     then
      123
      else
      0
DestyNova commented 3 years ago

Update: I was able to make manual alignment easier with let g:haskell_indent_if = 2, although it still autoindents else too far after one or more newlines.

DestyNova commented 3 years ago

I've added a testcase for this situation in PR #128, but I don't know enough vimscript to fix it ATM.