From f6aaefe6d1bf023e9f8a189bc4a497dcdd7e0211 Mon Sep 17 00:00:00 2001 From: memeplex Date: Sat, 12 Oct 2019 17:04:01 -0300 Subject: [PATCH] Indent python multiline strings to start and previous levels * progmodes/python.el (python-indent--calculate-indentation): add an additional indentation point to match indentation of previous line in a multiline string. Then Tab iterates between 0, the start indentation level and the previous line level. This is useful when writing docstrings in numpy/google formats. --- lisp/progmodes/python.el | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index ae5aff3..33837f5 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -1,3 +1,4 @@ + ;;; python.el --- Python's flying circus support for Emacs -*- lexical-binding: t -*- ;; Copyright (C) 2003-2019 Free Software Foundation, Inc. @@ -1069,11 +1070,18 @@ python-indent--calculate-indentation (`(:no-indent . ,_) (prog-first-column)) ; usually 0 (`(,(or :after-line :after-comment - :inside-string :after-backslash) . ,start) ;; Copy previous indentation. (goto-char start) (current-indentation)) + (`(,(or :inside-string + :inside-docstring) . ,start) + ;; Copy previous indentation inside string + (let ((prev (progn (forward-line -1) + (current-indentation))) + (base (progn (goto-char start) + (current-column)))) + (sort (delete-dups (list 0 prev base)) #'<))) (`(,(or :inside-paren-at-closing-paren :inside-paren-at-closing-nested-paren) . ,start) (goto-char (+ 1 start)) @@ -1082,12 +1090,6 @@ python-indent--calculate-indentation (current-indentation) ;; Align with opening paren. (current-column))) - (`(:inside-docstring . ,start) - (let* ((line-indentation (current-indentation)) - (base-indent (progn - (goto-char start) - (current-indentation)))) - (max line-indentation base-indent))) (`(,(or :after-block-start :after-backslash-first-line :after-backslash-assignment-continuation -- 2.20.1