2010-12-10 3 views
14
 
class Foo 
    attr_accessor :a, 
       :time, # ms since epoch 
       :b, 
       :c 
end 

В текстовом режиме переменные, перечисленные после 'a', будут отступать, как указано выше, но в рубиновом режиме они будут заподлицо с attr_accessor. Как я могу получить рубиновый режим для отступов, как текстовый режим в этой ситуации? Обратите внимание, что я хотел бы иметь возможность выбрать весь файл и нажать c-m- \, чтобы получить вышеуказанный отступ в дополнение ко всем другим правилам отступов ruby-mode.el.Emacs ruby-mode indentation behavior

+2

Обратите внимание, что Emacs будет correcly отступ класса Foo attr_accessor (: а, : время, # мс начиная с эпохой : б, : с) конца –

+0

"сюсюкать" не правильный тег для этого вопроса – drdo

+0

добавления Парсенс работает, спасибо! – John

ответ

4

От Remi (в комментариях): Обратите внимание, что Emacs будет правильно отступ класс Foo attr_accessor (: а,: время, # мс начиная с эпохи: B,: в) конец - Рэй 11 декабря '10 в 8:50

Вы можете добавить parens и иметь отступ должным образом. Я добавляю это здесь, потому что я ищу ответы на оставшиеся без ответа вопросы, и этот вопрос появляется (неправильно, так как на него были даны ответы в комментариях).

+0

Вау, это отстой. Я не хочу добавлять скобки, чтобы в этом случае правильно получить отступ Ruby. Вы нашли какой-либо другой способ сделать эту работу? – slacy

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 
+0

прекрасный! спасибо! – aL3xa

+0

Добро пожаловать! Я использую эту настройку в течение нескольких месяцев без каких-либо серьезных проблем. – Dmitry

+0

Это выглядит круто. Когда вы говорите «без каких-либо серьезных проблем», вы просто скромны? О каких мелких проблемах я должен знать? –

2

При использовании Emacs 24.4 или более поздней версии, ваш пример будет сдвинута, как это по умолчанию.