From 22803067f9117772f954aa5abec4487d234df2a5 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 | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index ae5aff3..f2a88f9 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,20 @@ 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-indentation)))) + (if (/= prev base) + (sort (list 0 prev base) #'<) + base))) (`(,(or :inside-paren-at-closing-paren :inside-paren-at-closing-nested-paren) . ,start) (goto-char (+ 1 start)) @@ -1082,12 +1092,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