Ruby sempre recua 2 espaços?

7

Gostaria de usar recuos de 2 espaços o tempo todo, como:

sidekiq_options({
  retry: true
})

Eu tentei definir .emacs.d/init.elpara:

(setq-default indent-tabs-mode nil)
(setq-default tab-width 2)
(setq indent-line-function 'insert-tab)

(setq ruby-deep-indent-paren nil)
(setq ruby-deep-indent-paren-style nil)

Mas ainda tenho coisas parecidas com:

sidekiq_options({
                  retry: true
                })
zlotnika
fonte
Devido à forma como o Ruby analisa o código, você deve poder omitir os colchetes para o último argumento de hash. Resolve a questão de maneira organizada:>
wasamasa

Respostas:

1

Não sou um usuário ruby, mas você pode tentar o seguinte:

(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)   ;; change this to 2 if that is the width
(setq indent-line-function 'insert-tab)
eflanigan00
fonte
Sim, eu já tinha aqueles lá (eles simplesmente não pareciam afetar ruby-mode).
Zlotnika 2/03
Inspecione a largura da guia enquanto estiver no modo rubi. Talvez algum gancho tenha mudado. Da mesma forma, esse código deve estar dentro do seu código de gancho no modo rubi.
Jtgd 03/03/19
Além disso, parece que talvez seja um problema com as paradas de tabulação, já que a tabulação parece muito maior que 8. Também parece que está tentando recuar para alinhar com os {'s. Pode não ser estritamente um problema de largura da guia.
Jtgd 03/03/19
0

Tudo o que você precisa fazer é definir ruby-indent-level. Por exemplo (setq-local ruby-indent-level 2).

EDIT :

Você pode usar enh-ruby-mode, instalável a partir de melpa, e (setq enh-ruby-deep-indent-paren nil).

Isso resultou no seguinte recuo:

sidekiq_options({
  retry: true
})
theldoria
fonte
Eu tentei isso - não ajuda. Não é o nível de indentação que é o problema. É o recuo profundo.
Zlotnika 19/07
Você pode atenuá-lo um pouco, definindo (setq ruby-deep-indent-paren nil), mas ele irá recuar em 4 espaços, por causa do ({.
Theldoria
0

Olhando para o código de ruby-mode, parece que não há como configurá-lo. Uma solução alternativa está substituindo a função. Experimente o código abaixo e veja se funciona:

(defun ruby-smie-rules (kind token)
  (pcase (cons kind token)
    (`(:elem . basic) ruby-indent-level)
    ;; "foo" "bar" is the concatenation of the two strings, so the second
    ;; should be aligned with the first.
    (`(:elem . args) (if (looking-at "\\s\"") 0))
    ;; (`(:after . ",") (smie-rule-separator kind))
    (`(:before . ";")
     (cond
      ((smie-rule-parent-p "def" "begin" "do" "class" "module" "for"
                           "while" "until" "unless"
                           "if" "then" "elsif" "else" "when"
                           "rescue" "ensure" "{")
       (smie-rule-parent ruby-indent-level))
      ;; For (invalid) code between switch and case.
      ;; (if (smie-parent-p "switch") 4)
      ))
    (`(:before . ,(or `"(" `"[" `"{"))
     (cond
      ((and (equal token "{")
            (not (smie-rule-prev-p "(" "{" "[" "," "=>" "=" "return" ";"))
            (save-excursion
              (forward-comment -1)
              (not (eq (preceding-char) ?:))))
       ;; Curly block opener.
       (ruby-smie--indent-to-stmt))
      ((smie-rule-hanging-p)
       ;; Treat purely syntactic block-constructs as being part of their parent,
       ;; when the opening token is hanging and the parent is not an
       ;; open-paren.
       (cond
        ((eq (car (smie-indent--parent)) t) nil)
        ;; When after `.', let's always de-indent,
        ;; because when `.' is inside the line, the
        ;; additional indentation from it looks out of place.
        ((smie-rule-parent-p ".")
         ;; Traverse up the call chain until the parent is not `.',
         ;; or `.' at indentation, or at eol.
         (while (and (not (ruby-smie--bosp))
                     (equal (nth 2 (smie-backward-sexp ".")) ".")
                     (not (ruby-smie--bosp)))
           (forward-char -1))
         (smie-indent-virtual))
        (t (smie-rule-parent))))))
    (`(:after . ,(or `"(" "[" "{"))
     ;; FIXME: Shouldn't this be the default behavior of
     ;; `smie-indent-after-keyword'?
     (save-excursion
       (smie-rule-parent)))
    (`(:before . " @ ")
     (save-excursion
       (skip-chars-forward " \t")
       (cons 'column (current-column))))
    (`(:before . "do") (ruby-smie--indent-to-stmt))
    (`(:before . ".")
     (if (smie-rule-sibling-p)
         (and ruby-align-chained-calls 0)
       (smie-backward-sexp ".")
       (cons 'column (+ (current-column)
                        ruby-indent-level))))
    (`(:before . ,(or `"else" `"then" `"elsif" `"rescue" `"ensure"))
     (smie-rule-parent))
    (`(:before . "when")
     ;; Align to the previous `when', but look up the virtual
     ;; indentation of `case'.
     (if (smie-rule-sibling-p) 0 (smie-rule-parent)))
    (`(:after . ,(or "=" "+" "-" "*" "/" "&&" "||" "%" "**" "^" "&"
                     "<=>" ">" "<" ">=" "<=" "==" "===" "!=" "<<" ">>"
                     "+=" "-=" "*=" "/=" "%=" "**=" "&=" "|=" "^=" "|"
                     "<<=" ">>=" "&&=" "||=" "and" "or"))
     (and (smie-rule-parent-p ";" nil)
          (smie-indent--hanging-p)
          ruby-indent-level))
    (`(:after . ,(or "?" ":")) ruby-indent-level)
    (`(:before . ,(guard (memq (intern-soft token) ruby-alignable-keywords)))
     (when (not (ruby--at-indentation-p))
       (if (ruby-smie--indent-to-stmt-p token)
           (ruby-smie--indent-to-stmt)
         (cons 'column (current-column)))))
    (`(:before . "iuwu-mod")
     (smie-rule-parent ruby-indent-level))
    ))

A parte que editei está logo abaixo do FIXME, alterando para (smie-rule-parent), e pareceu funcionar para mim.

Jesse
fonte