This report is for python.el in the current master (c10828bd8520db83cc06a2ad5de6f8a1ad74b83c). Pressing C-M-a one time correctly positions the point at the beginning of the current class or defun statement. Pressing C-M-a multiple times is futile, as the point gets stucked where the first movement left it. This is not consistent with the usual emacs behavior and it's not very convenient to navigate code anyway. The problem is in python-nav--beginning-of-defun: (when (and (> arg 0) (python-info-looking-at-beginning-of-defun)) (end-of-line 1)) This puts the point at the end of the line when the point is at a defun or class line and the navigation is backward. So the next re-search-backward will match the current line. This is fine when the point is *after* the column where the defun or class statement starts, but not quite so when the point is *over the indentation* whitespace (that is, before the beginning of the defun/class keyword). One simple solution is to add another condition: (when (and (> arg 0) (> (current-column) (current-indentation)) (python-info-looking-at-beginning-of-defun)) (end-of-line 1))