class Foo attr_accessor :a, :time, # ms since epoch :b, :c end
在文本模式下,'a'後面列出的變量將按照上面所述縮進,但在紅寶石模式下,它們將替換爲'attr_accessor'。在這種情況下,我怎樣才能讓ruby模式縮進文本模式?請注意,我希望能夠選擇整個文件,並且除了所有其他ruby-mode.el縮進規則之外,還可以通過c-m- \獲得上述縮進。Emacs紅寶石模式壓痕行爲
class Foo attr_accessor :a, :time, # ms since epoch :b, :c end
在文本模式下,'a'後面列出的變量將按照上面所述縮進,但在紅寶石模式下,它們將替換爲'attr_accessor'。在這種情況下,我怎樣才能讓ruby模式縮進文本模式?請注意,我希望能夠選擇整個文件,並且除了所有其他ruby-mode.el縮進規則之外,還可以通過c-m- \獲得上述縮進。Emacs紅寶石模式壓痕行爲
從雷米(在評論): 注意,Emacs會正確地縮進類Foo attr_accessor(:一,:時間,因爲時代#MS:B,:C)結束 - 雷米12月11日'10在8:50
你可以添加parens並讓它正確縮進 - 我在這裏添加這個是因爲我正在尋找沒有答案的問題,並且這個問題出現了(錯誤地,因爲它已經在評論中得到了回答)。
哇,這很糟糕。在這種情況下,我不想添加括號來讓Ruby正確縮進。你有沒有找到任何其他方式來完成這項工作? – slacy 2011-09-28 23:17:19
這種黑客應該在大多數情況下工作。
(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
當使用Emacs 24.4或更高,您的示例將被默認縮進這樣。
注意,Emacs會正確地將縮進 類Foo attr_accessor(:一, :時間,因爲時代 #MS:B, :C) 結束 – 2010-12-11 08:50:53
「口齒不清」 不是這個問題 – drdo 2010-12-11 12:01:49
加入了正確的標籤parens作品,謝謝! – John 2010-12-12 05:22:09