【问题标题】:Emacs ruby-mode indentation behaviorEmacs ruby​​ 模式缩进行为
【发布时间】:2011-05-23 16:49:37
【问题描述】:
Foo 类 attr_accessor :a, :time, # 自纪元以来的毫秒数 :乙, :C 结尾

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

【问题讨论】:

  • 请注意,Emacs 将正确缩进 class Foo attr_accessor(:a, :time, # ms since epoch :b, :c) end
  • "lisp" 不是这个问题的正确标签
  • 添加括号有效,谢谢!
  • 哇,这太糟糕了。我们的编码风格是没有括号。还有其他方法吗?我不确定 ruby​​-deep-indent-paren-style 到底是什么意思——但它的“空间”值意味着这应该有效,对吧?

标签: ruby emacs indentation


【解决方案1】:

当使用 Emacs 24.4 或更新版本时,您的示例默认会像这样缩进。

【讨论】:

    【解决方案2】:

    来自雷米(以 cmets 为单位): 请注意,Emacs 将正确缩进 class Foo attr_accessor(:a, :time, # ms since epoch :b, :c) end – Rémi 2010 年 12 月 11 日 8:50

    您可以添加括号并正确缩进 - 我在这里添加这个是因为我正在寻找未回答的问题,并且这个问题出现了(不正确,因为它已在 cmets 中得到回答)。

    【讨论】:

    • 哇,这太糟糕了。在这种情况下,我不想添加括号来让 Ruby 正确缩进。你有没有找到其他方法来解决这个问题?
    【解决方案3】:

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

    (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
    

    【讨论】:

    • 不客气!我已经使用这个调整几个月了,没有任何重大问题。
    • 这看起来很酷。当你说“没有任何大问题”时,你只是谦虚吗?我应该注意哪些小问题?
    • 在我的头顶上,如果您在其中一个 args 中有一个多行块,并且它没有被包裹在括号中,并且 ruby-deep-indent-paren 具有默认值,则块体相对于行的开头,而不是被调用方法名称结束的列;如果在这之后有任何争论,这看起来很奇怪。但无论如何,那个电话看起来很难看。如果您遇到更严重的事情,请告诉我。
    • 我已经开始改进您的代码,并将尽快分享。我看到你也为 js2-mode 做出了贡献。感谢您的工作!
    • 也许“改进”是一个很强的词。 ;) 但是我确实涵盖了更多的极端案例,并且我已经完全删除了 ruby​​-indent-line 并提供了周围的建议。 github.com/lewang/le_emacs_libs/blob/master/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 2010-10-14
    • 2014-05-24
    • 1970-01-01
    相关资源
    最近更新 更多