ruby - Emacs ruby​​ 模式缩进行为

class Foo
  attr_accessor :a,
                :time, # ms since epoch
                :b,
                :c
end

在文本模式下,'a' 后面列出的变量会像上面写的那样缩进,但在 ruby​​ 模式下,它们将与 'attr_accessor' 齐平。在这种情况下,如何让 ruby​​ 模式像文本模式一样缩进?请注意,除了所有其他 ruby​​-mode.el 缩进规则之外,我希望能够选择整个文件并点击 c-m-\以获得上述缩进。

最佳答案

这个技巧应该在大多数情况下都有效。

(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

https://stackoverflow.com/questions/8907304/

相关文章:

java - java中具有可变数量参数的字符串格式

c# - 很好地显示时间跨度

android - 如果 ScrollView 仅支持一个直接子级,我应该如何使整个布局可滚动?

visual-studio - 如何在 Visual Studio 中自动格式化 XAML 代码?

r - 在r中将多列从字符转换为数字格式

java - 格式化传递给Java函数的多个参数

c - 如何打印有限数量的字符?

xml - 将每个 XQuery 结果放在一个新行上

c++ - 使用 std::cout 的表格布局

java - 如何打印不带逗号的 Double