Ruby immer 2 Leerzeichen einrücken?

7

Ich möchte die ganze Zeit 2-Leerzeichen-Einrückungen verwenden wie:

sidekiq_options({
  retry: true
})

Ich habe versucht, Folgendes .emacs.d/init.eleinzustellen:

(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)

Aber ich bekomme immer noch Dinge, die aussehen wie:

sidekiq_options({
                  retry: true
                })
zlotnika
quelle
Aufgrund der Art und Weise, wie Ruby Code analysiert, sollten Sie in der Lage sein, die geschweiften Klammern für das letzte Hash-Argument wegzulassen. Löst die Frage auf ordentliche Weise:>
wasamasa

Antworten:

1

Ich bin kein Ruby-Benutzer, aber Sie können Folgendes versuchen:

(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
quelle
Ja, ich hatte die tatsächlich schon da drin (sie schienen einfach nicht zu beeinflussen ruby-mode).
Zlotnika
Überprüfen Sie die Tab-Breite, während Sie sich im Ruby-Modus befinden. Vielleicht hat es ein Haken geändert. Ebenso sollte dieser Code in Ihrem Ruby-Modus-Hook-Code enthalten sein.
jtgd
Es sieht auch so aus, als ob es sich möglicherweise um ein Problem mit Tabulatoren handelt, da das Tabulator viel breiter als 8 aussieht. Es sieht auch so aus, als würde versucht, einzurücken, um mit den {'s übereinzustimmen. Möglicherweise handelt es sich nicht ausschließlich um ein Tab-WIDTH-Problem.
jtgd
0

Alles was Sie tun müssen, ist einzustellen ruby-indent-level. Zum Beispiel (setq-local ruby-indent-level 2).

BEARBEITEN :

Sie können verwenden enh-ruby-mode, installierbar von melpa, und (setq enh-ruby-deep-indent-paren nil).

Dies führte zu folgendem Einzug:

sidekiq_options({
  retry: true
})
Theldoria
quelle
Ich habe das versucht - es hilft nicht. Es ist nicht die Einrückungsstufe, die das Problem darstellt. Es ist die tiefe Einkerbung.
Zlotnika
Sie können es ein wenig abschwächen, indem Sie es einstellen (setq ruby-deep-indent-paren nil), aber es wird aufgrund der um 4 Leerzeichen eingerückt ({.
Theldoria
0

Wenn man sich den Code von ansieht ruby-mode, scheint es keine Möglichkeit zu geben, ihn zu konfigurieren. Eine Problemumgehung überschreibt die Funktion. Probieren Sie den folgenden Code aus und prüfen Sie, ob er funktioniert:

(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))
    ))

Der Teil, den ich bearbeitet habe, befindet sich direkt unter dem FIXMEund wurde geändert (smie-rule-parent), und er schien für mich zu funktionieren.

Jesse
quelle