类 Foo 属性 访问器 :a, :time, # 自纪元以来的毫秒数 :b, :c end在文本模式下,紧随 'a' 后列出的变量将缩进如上所述,但在 ruby 模式下,它们将与 'attr_accessor' 对齐。如何在此情况下使 ruby 模式像文本模式一样缩进?请注意,我希望能够选择整个文件并按 c-m-\ 键获取上述缩进,以及所有其他 ruby-mode.el 缩进规则。
类 Foo 属性 访问器 :a, :time, # 自纪元以来的毫秒数 :b, :c end在文本模式下,紧随 'a' 后列出的变量将缩进如上所述,但在 ruby 模式下,它们将与 'attr_accessor' 对齐。如何在此情况下使 ruby 模式像文本模式一样缩进?请注意,我希望能够选择整个文件并按 c-m-\ 键获取上述缩进,以及所有其他 ruby-mode.el 缩进规则。
(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))))))
例子:
class Comment < ActiveRecord::Base
after_create :send_email_to_author,
:if => :author_wants_emails?,
:unless => Proc.new { |comment| comment.post.ignore_comments? }
end
ruby-deep-indent-paren
具有默认值,则块体相对于行开头而不是调用方法名称结束的列进行缩进;如果在此之后有任何参数,看起来会很奇怪。但是那个调用本来就很丑陋。如果您遇到更严重的情况,请告诉我。 - Dmitry来自Remi(在评论中)的说明:
请注意,Emacs将正确缩进class Foo attr_accessor(:a, :time, # ms since epoch :b, :c) end - Rémi Dec 11 '10 at 8:50
您可以添加括号使其正确缩进 - 我在此处添加此内容,因为我正在寻找未回答的问题,而这个问题出现了(错误地出现,因为它已在评论中回答)。