Emacs ruby-mode缩进行为

14
类 Foo
  属性 访问器 :a,
                :time, # 自纪元以来的毫秒数
                :b,
                :c
end

在文本模式下,紧随 'a' 后列出的变量将缩进如上所述,但在 ruby 模式下,它们将与 'attr_accessor' 对齐。如何在此情况下使 ruby 模式像文本模式一样缩进?请注意,我希望能够选择整个文件并按 c-m-\ 键获取上述缩进,以及所有其他 ruby-mode.el 缩进规则。


2
请注意,Emacs会正确缩进以下代码:class Foo attr_accessor(:a, :time, # 自纪元以来的毫秒数 :b, :c) end - Rémi
“lisp” 不是这个问题的正确标签。 - drdo
添加括号可以解决问题,谢谢! - John
哇,这太糟糕了。我们的编码风格是不使用括号。还有其他方法吗?我不确定ruby-deep-indent-paren-style到底意味着什么,但它的值为“space”应该可以工作,对吧? - slacy
3个回答

12
这个技巧在大多数情况下都是可行的。
(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

不用谢!我已经使用这个调整了几个月,没有遇到任何重大问题。 - Dmitry
这看起来很酷。当你说“没有任何重大问题”时,你只是谦虚吗?我应该注意哪些小问题? - event_jr
从我的角度来看,如果您在其中一个args中有多行块,且它没有包含在括号中,并且ruby-deep-indent-paren具有默认值,则块体相对于行开头而不是调用方法名称结束的列进行缩进;如果在此之后有任何参数,看起来会很奇怪。但是那个调用本来就很丑陋。如果您遇到更严重的情况,请告诉我。 - Dmitry
我已经开始改进你的代码,并很快会分享到gist上。我看到你也为js2-mode做出了贡献。感谢你的工作! - event_jr
3
也许“改进”这个词有点过了。 ;) 但我确实涵盖了一些边角情况,并且完全使用周围的建议删除了ruby-indent-line。https://github.com/lewang/le_emacs_libs/blob/master/ruby-mode-indent-fix.el - event_jr
显示剩余4条评论

4

来自Remi(在评论中)的说明:

请注意,Emacs将正确缩进class Foo attr_accessor(:a, :time, # ms since epoch :b, :c) end - Rémi Dec 11 '10 at 8:50

您可以添加括号使其正确缩进 - 我在此处添加此内容,因为我正在寻找未回答的问题,而这个问题出现了(错误地出现,因为它已在评论中回答)。


哇,这太糟糕了。我不想加括号来让Ruby在这种情况下正确缩进。你有找到其他方法让它正常工作吗? - slacy

2
当使用 Emacs 24.4 或更高版本时,默认情况下,您的示例将像这样缩进。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接