emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: ruby-mode broken with indentation?


From: Stefan Monnier
Subject: Re: ruby-mode broken with indentation?
Date: Sun, 03 Nov 2013 17:51:41 -0500
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3.50 (gnu/linux)

> I've fixed the examples above in revision 114901, but I'm not sure if that
> was a good approach. Stefan, could you take a look?

I think this was actually a bug in smie.el.
The patch below seems to do the right thing.  Not sure how ti might
affect other major modes using SMIE, but at least my sml-mode test suite
seems unaffected.


        Stefan


=== modified file 'lisp/emacs-lisp/smie.el'
--- lisp/emacs-lisp/smie.el     2013-10-24 21:16:20 +0000
+++ lisp/emacs-lisp/smie.el     2013-11-03 22:46:30 +0000
@@ -1236,15 +1236,7 @@
     (goto-char (cadr (smie-indent--parent)))
     (cons 'column
           (+ (or offset 0)
-             ;; Use smie-indent-virtual when indenting relative to an opener:
-             ;; this will also by default use current-column unless
-             ;; that opener is hanging, but will additionally consult
-             ;; rules-function, so it gives it a chance to tweak
-             ;; indentation (e.g. by forcing indentation relative to
-             ;; its own parent, as in fn a => fn b => fn c =>).
-             (if (or (not (numberp (car smie--parent)))
-                    (smie-indent--hanging-p))
-                 (smie-indent-virtual) (current-column))))))
+             (smie-indent-virtual)))))
 
 (defvar smie-rule-separator-outdent 2)
 
@@ -1837,6 +1829,14 @@
       (edebug-instrument-function smie-rules-function)
     (error "Sorry, don't know how to instrument a lambda expression")))
 
+(defun smie--next-indent-change ()
+  (interactive)
+  (while
+      (let ((tick (buffer-modified-tick)))
+        (indent-according-to-mode)
+        (eq tick (buffer-modified-tick)))
+    (forward-line 1)))
+
 ;;; User configuration
 
 ;; This is designed to be a completely independent "module", so we can play

=== modified file 'lisp/progmodes/ruby-mode.el'
--- lisp/progmodes/ruby-mode.el 2013-11-02 05:18:11 +0000
+++ lisp/progmodes/ruby-mode.el 2013-11-03 22:48:27 +0000
@@ -467,16 +467,6 @@
            (t ";")))
          (t tok)))))))
 
-(defun ruby-smie--rule-parent-skip-assign ()
-  (let* ((parent (smie-indent--parent))
-         (tok (caddr parent)))
-    (if (and (stringp tok) (string-match-p "[+-*&|^]?=\\'" tok))
-        (progn
-          (goto-char (cadr parent))
-          (let (smie--parent)
-            (smie-rule-parent)))
-      (smie-rule-parent))))
-
 (defun ruby-smie-rules (kind token)
   (pcase (cons kind token)
     (`(:elem . basic) ruby-indent-level)
@@ -499,7 +489,7 @@
       ((and (equal token "{")
             (not (smie-rule-prev-p "(" "{" "[" "," "=>" "=" "return" ";")))
        ;; Curly block opener.
-       (ruby-smie--rule-parent-skip-assign))
+       (smie-rule-parent))
       ((smie-rule-hanging-p)
        ;; Treat purely syntactic block-constructs as being part of their 
parent,
        ;; when the opening statement is hanging.
@@ -508,7 +498,7 @@
        (cons 'column  (smie-indent-virtual)))))
     (`(:after . ,(or "=" "iuwu-mod")) 2)
     (`(:after . " @ ") (smie-rule-parent))
-    (`(:before . "do") (ruby-smie--rule-parent-skip-assign))
+    (`(:before . "do") (smie-rule-parent))
     (`(,(or :before :after) . ".")
      (unless (smie-rule-parent-p ".")
        (smie-rule-parent ruby-indent-level)))




reply via email to

[Prev in Thread] Current Thread [Next in Thread]