Emacs ruby-mode indentation behavior

前端 未结 3 1847
悲哀的现实
悲哀的现实 2020-12-14 20:33
class Foo
  attr_accessor :a,
                :time, # ms since epoch
                :b,
                :c
end

In text mode, the variables listed after \'a\'

相关标签:
3条回答
  • 2020-12-14 20:51

    This hack should work in the majority of cases.

    (defadvice ruby-indent-line (after line-up-args activate)
      (let (indent prev-indent arg-indent)
        (save-excursion
          (back-to-indentation)
          (when (zerop (car (syntax-ppss)))
            (setq indent (current-column))
            (skip-chars-backward " \t\n")
            (when (eq ?, (char-before))
              (ruby-backward-sexp)
              (back-to-indentation)
              (setq prev-indent (current-column))
              (skip-syntax-forward "w_.")
              (skip-chars-forward " ")
              (setq arg-indent (current-column)))))
        (when prev-indent
          (let ((offset (- (current-column) indent)))
            (cond ((< indent prev-indent)
                   (indent-line-to prev-indent))
                  ((= indent prev-indent)
                   (indent-line-to arg-indent)))
            (when (> offset 0) (forward-char offset))))))
    

    Example:

    class Comment < ActiveRecord::Base
      after_create :send_email_to_author,
                   :if => :author_wants_emails?,
                   :unless => Proc.new { |comment| comment.post.ignore_comments? }
    end
    
    0 讨论(0)
  • 2020-12-14 21:00

    From Remi (in comments): Note that Emacs will correctly indent class Foo attr_accessor(:a, :time, # ms since epoch :b, :c) end – Rémi Dec 11 '10 at 8:50

    You can add parens and have it indent properly -- I'm adding this here because I'm looking for unanswered questions, and this one comes up (incorrectly, since it has been answered in the comments).

    0 讨论(0)
  • 2020-12-14 21:02

    When using Emacs 24.4 or newer, your example will be indented like this by default.

    0 讨论(0)
提交回复
热议问题