Function: python-mode

python-mode is an autoloaded, interactive and byte-compiled function defined in python.el.gz.

Signature

(python-mode)

Documentation

Major mode for editing Python files.

<backtab> python-indent-dedent-line
C-M-h python-mark-defun
C-M-i completion-at-point
C-M-u python-nav-backward-up-list
C-M-x python-shell-send-defun
C-c < python-indent-shift-left
C-c > python-indent-shift-right
C-c C-c python-shell-send-buffer
C-c C-d python-describe-at-point
C-c C-e python-shell-send-statement
C-c C-f python-eldoc-at-point
C-c C-j imenu
C-c C-l python-shell-send-file
C-c C-p run-python
C-c C-r python-shell-send-region
C-c C-s python-shell-send-string
C-c C-t c python-skeleton-class
C-c C-t d python-skeleton-def
C-c C-t f python-skeleton-for
C-c C-t i python-skeleton-if
C-c C-t m python-skeleton-import
C-c C-t t python-skeleton-try
C-c C-t w python-skeleton-while
C-c C-v python-check
C-c C-z python-shell-switch-to-shell
DEL python-indent-dedent-line-backspace
M-a python-nav-backward-block
M-e python-nav-forward-block

In addition to any hooks its parent mode prog-mode might have run, this mode runs the hook python-mode-hook, as the final or penultimate step during initialization.

Key Bindings

Source Code

;; Defined in /usr/src/emacs/lisp/progmodes/python.el.gz
;;;###autoload
(define-derived-mode python-mode prog-mode "Python"
  "Major mode for editing Python files.

\\{python-mode-map}"
  (setq-local tab-width 8)
  (setq-local indent-tabs-mode nil)

  (setq-local comment-start "# ")
  (setq-local comment-start-skip "#+\\s-*")

  (setq-local parse-sexp-lookup-properties t)
  (setq-local parse-sexp-ignore-comments t)

  (setq-local forward-sexp-function python-forward-sexp-function)

  (setq-local font-lock-defaults
              `(,python-font-lock-keywords
                nil nil nil nil
                (font-lock-syntactic-face-function
                 . python-font-lock-syntactic-face-function)))

  (setq-local syntax-propertize-function
              python-syntax-propertize-function)

  (setq-local indent-line-function #'python-indent-line-function)
  (setq-local indent-region-function #'python-indent-region)
  ;; Because indentation is not redundant, we cannot safely reindent code.
  (setq-local electric-indent-inhibit t)
  (setq-local electric-indent-chars
              (cons ?: electric-indent-chars))

  ;; Add """ ... """ pairing to electric-pair-mode.
  (add-hook 'post-self-insert-hook
            #'python-electric-pair-string-delimiter 'append t)

  (setq-local paragraph-start "\\s-*$")
  (setq-local fill-paragraph-function #'python-fill-paragraph)
  (setq-local normal-auto-fill-function #'python-do-auto-fill)

  (setq-local beginning-of-defun-function #'python-nav-beginning-of-defun)
  (setq-local end-of-defun-function #'python-nav-end-of-defun)

  (add-hook 'completion-at-point-functions
            #'python-completion-at-point nil 'local)

  (add-hook 'post-self-insert-hook
            #'python-indent-post-self-insert-function 'append 'local)

  (setq-local imenu-create-index-function
              #'python-imenu-create-index)

  (setq-local add-log-current-defun-function
              #'python-info-current-defun)

  (add-hook 'which-func-functions #'python-info-current-defun nil t)

  (setq-local skeleton-further-elements
              '((abbrev-mode nil)
                (< '(backward-delete-char-untabify (min python-indent-offset
                                                        (current-column))))
                (^ '(- (1+ (current-indentation))))))

  (with-no-warnings
    ;; suppress warnings about eldoc-documentation-function being obsolete
   (if (null eldoc-documentation-function)
       ;; Emacs<25
       (setq-local eldoc-documentation-function #'python-eldoc-function)
     (if (boundp 'eldoc-documentation-functions)
         (add-hook 'eldoc-documentation-functions #'python-eldoc-function nil t)
       (add-function :before-until (local 'eldoc-documentation-function)
                     #'python-eldoc-function))))

  (add-to-list
   'hs-special-modes-alist
   '(python-mode
     "\\s-*\\_<\\(?:def\\|class\\)\\_>"
     ;; Use the empty string as end regexp so it doesn't default to
     ;; "\\s)".  This way parens at end of defun are properly hidden.
     ""
     "#"
     python-hideshow-forward-sexp-function
     nil))

  (setq-local outline-regexp (python-rx (* space) block-start))
  (setq-local outline-heading-end-regexp ":[^\n]*\n")
  (setq-local outline-level
              (lambda ()
                "`outline-level' function for Python mode."
                (1+ (/ (current-indentation) python-indent-offset))))

  (setq-local prettify-symbols-alist python-prettify-symbols-alist)

  (python-skeleton-add-menu-items)

  (make-local-variable 'python-shell-internal-buffer)

  (when python-indent-guess-indent-offset
    (python-indent-guess-indent-offset))

  (add-hook 'flymake-diagnostic-functions #'python-flymake nil t))