]> git.eshelyaron.com Git - emacs.git/commitdiff
* lisp/electric.el (electric-indent-inhibit): New var.
authorStefan Monnier <monnier@iro.umontreal.ca>
Mon, 7 Oct 2013 18:51:26 +0000 (14:51 -0400)
committerStefan Monnier <monnier@iro.umontreal.ca>
Mon, 7 Oct 2013 18:51:26 +0000 (14:51 -0400)
(electric-indent-post-self-insert-function): Use it.
* lisp/progmodes/python.el (python-mode): Set it.

lisp/ChangeLog
lisp/electric.el
lisp/progmodes/python.el

index 64fedd321917a6adfa27a0d4798162e5a015ebaa..520e41afc68957fbe3539d1ba987326d28ddb714 100644 (file)
@@ -1,5 +1,9 @@
 2013-10-07  Stefan Monnier  <monnier@iro.umontreal.ca>
 
+       * electric.el (electric-indent-inhibit): New var.
+       (electric-indent-post-self-insert-function): Use it.
+       * progmodes/python.el (python-mode): Set it.
+
        * progmodes/ruby-mode.el (ruby-smie-rules): Tweak handling of
        open braces.
 
index 36ec4a00b881fe18df21de540b2857c26f11d28a..b62de874b9383750c2f7c9ca6460267af8a3835b 100644 (file)
@@ -187,7 +187,7 @@ Returns nil when we can't find this char."
                            (eq (char-before) last-command-event)))))
       pos)))
 
-;; Electric indentation.
+;;; Electric indentation.
 
 ;; Autoloading variables is generally undesirable, but major modes
 ;; should usually set this variable by adding elements to the default
@@ -202,6 +202,11 @@ Each function is called with one argument (the inserted char), with
 point right after that char, and it should return t to cause indentation,
 `no-indent' to prevent indentation or nil to let other functions decide.")
 
+(defvar-local electric-indent-inhibit nil
+  "If non-nil, reindentation is not appropriate for this buffer.
+This should be set by major modes such as `python-mode' since
+Python does not lend itself to fully automatic indentation.")
+
 (defun electric-indent-post-self-insert-function ()
   ;; FIXME: This reindents the current line, but what we really want instead is
   ;; to reindent the whole affected text.  That's the current line for simple
@@ -229,12 +234,13 @@ point right after that char, and it should return t to cause indentation,
                     (unless (eq act 'do-indent) (nth 8 (syntax-ppss))))))))
       ;; For newline, we want to reindent both lines and basically behave like
       ;; reindent-then-newline-and-indent (whose code we hence copied).
-      (when (< (1- pos) (line-beginning-position))
+      (when (<= pos (line-beginning-position))
         (let ((before (copy-marker (1- pos) t)))
           (save-excursion
-            (unless (memq indent-line-function
-                          '(indent-relative indent-to-left-margin
-                                            indent-relative-maybe))
+            (unless (or (memq indent-line-function
+                              '(indent-relative indent-to-left-margin
+                                                indent-relative-maybe))
+                        electric-indent-inhibit)
               ;; Don't reindent the previous line if the indentation function
               ;; is not a real one.
               (goto-char before)
@@ -248,7 +254,9 @@ point right after that char, and it should return t to cause indentation,
             ;; Remove the trailing whitespace after indentation because
             ;; indentation may (re)introduce the whitespace.
             (delete-horizontal-space t))))
-      (unless (memq indent-line-function '(indent-to-left-margin))
+      (unless (or (memq indent-line-function '(indent-to-left-margin))
+                  (and electric-indent-inhibit
+                       (> pos (line-beginning-position))))
         (indent-according-to-mode)))))
 
 ;;;###autoload
@@ -281,7 +289,7 @@ insert a character from `electric-indent-chars'."
                          (delq #'electric-indent-post-self-insert-function
                                (cdr bp))))))))
 
-;; Electric pairing.
+;;; Electric pairing.
 
 (defcustom electric-pair-pairs
   '((?\" . ?\"))
@@ -414,7 +422,7 @@ See options `electric-pair-pairs' and `electric-pair-skip-self'."
     (remove-hook 'self-insert-uses-region-functions
                  #'electric-pair-will-use-region)))
 
-;; Automatically add newlines after/before/around some chars.
+;;; Electric newlines after/before/around some chars.
 
 (defvar electric-layout-rules '()
   "List of rules saying where to automatically insert newlines.
index 5f919bf495fbeb1c43bd6a4171efcb21b359d5c0..ce727391ce8fcc90a626230b0d00c2707b3bdf28 100644 (file)
@@ -3544,6 +3544,8 @@ list is returned as is."
       (reverse acc))))
 
 \f
+(defvar electric-indent-inhibit)
+
 ;;;###autoload
 (define-derived-mode python-mode prog-mode "Python"
   "Major mode for editing Python files.
@@ -3572,7 +3574,9 @@ if that value is non-nil."
   (set (make-local-variable 'indent-line-function)
        #'python-indent-line-function)
   (set (make-local-variable 'indent-region-function) #'python-indent-region)
-
+  ;; Because indentation is not redundant, we cannot safely reindent code.
+  (setq-local electric-indent-inhibit t)
+  
   (set (make-local-variable 'paragraph-start) "\\s-*$")
   (set (make-local-variable 'fill-paragraph-function)
        'python-fill-paragraph)