From: Carlos Pita <[email-masked]>
Date: Wed, 22 Oct 2014 15:11:24 -0300

I've doing some debugging. I found out why the bug happens, but I
still have to think of a way to fix it:

Say you are in a dedenter line like "else:". In python-indent-region
delete-horizontal-space gets executed, so the dedenter "else:" moves
to the first column and the current indentation becomes 0. Now
python-info-dedenter-opening-block-position initializes indentation as
the value returned by (current-indentation), that is 0. Then the
opening block position is calculated and the following code gets
executed:

        (if (<= (current-indentation) indentation)
            (setq position (car positions))
          (setq positions (cdr positions)))))

In this code (current-indentation) returns the indentation of the
opening block, which is fine. But it gets compared to indentation,
which is always 0. So the else branch is taken every time and
positions is set to nil (cdr positions).

Obviously the problem is that at the point
python-info-dedenter-opening-block-position is called the original
dedenter indentation was lost.

Maybe the original indentation should be saved as a dynamic variable
before deleting the horizontal space. Or the horizontal space
shouldn't be deleted at all and indentation should happen as a
displacement from the original position instead of a displacement from
the left margin.