Ruby luôn thụt lề 2 khoảng trắng?


7

Tôi muốn sử dụng thụt lề 2 không gian mọi lúc như:

sidekiq_options({
  retry: true
})

Tôi đã thử cài đặt .emacs.d/init.elthành:

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

Nhưng tôi vẫn nhận được những thứ trông như:

sidekiq_options({
                  retry: true
                })

Do cách Ruby phân tích mã, bạn sẽ có thể bỏ qua các dấu ngoặc nhọn cho đối số băm cuối cùng. Giải quyết câu hỏi một cách gọn gàng:>
wasamasa

Câu trả lời:


1

Tôi không phải là người dùng ruby ​​nhưng bạn có thể thử như sau:

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

Vâng, tôi thực sự đã có những người trong đó rồi (họ dường như không ảnh hưởng ruby-mode).
zlotnika

Kiểm tra độ rộng của tab khi bạn ở chế độ ruby. Có lẽ một số móc đã thay đổi nó. Tương tự như vậy, mã này phải nằm trong mã hook chế độ ruby ​​của bạn.
jtgd ngày

Ngoài ra, có vẻ như đó có thể là sự cố với các điểm dừng tab, vì tab có vẻ rộng hơn 8. Nó cũng có vẻ như nó đang cố gắng thụt lề để xếp hàng với {'s. Nó có thể không hoàn toàn là một vấn đề WIDTH tab.
jtgd ngày

0

Tất cả bạn nên làm là để thiết lập ruby-indent-level. Ví dụ (setq-local ruby-indent-level 2).

CHỈNH SỬA :

Bạn có thể sử dụng enh-ruby-mode, có thể cài đặt từ melpa và (setq enh-ruby-deep-indent-paren nil).

Điều này dẫn đến việc thụt lề sau:

sidekiq_options({
  retry: true
})

Tôi đã thử điều đó - nó không giúp được gì. Đó không phải là mức độ thụt đầu dòng là vấn đề. Đó là vết lõm sâu.
zlotnika

Bạn có thể giảm thiểu nó một chút bằng cách cài đặt (setq ruby-deep-indent-paren nil), nhưng nó sẽ thụt lề bởi 4 khoảng trắng, vì ({.
theldoria

0

Nhìn vào mã của ruby-mode, có vẻ như không có cách nào để cấu hình nó. Một cách giải quyết là chức năng ghi đè. Hãy thử mã dưới đây và xem nếu nó hoạt động:

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

Phần tôi chỉnh sửa nằm ngay bên dưới FIXME, thay đổi nó thành (smie-rule-parent), và nó dường như hoạt động với tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.