2012-01-20 23 views
5

Khi viết mã Scala trong Emacs, tôi nhận thấy vấn đề thụt đầu dòng sau đây:Scala chế độ thụt đầu dòng trong Emacs

List(1,2,3).foreach{ x => 

Sau đó nhấn Enter.

Sau đó, đóng khung, và đây là những gì kết thúc xảy ra:

List(1,2,3).foreach{ x => 
        } 

Mặc dù đây là một ví dụ cụ thể, vấn đề này xuất hiện trong nhiều cách khác nhau khi tính năng tự động thụt trong Emacs.

Một câu trả lời cho một trong hai câu hỏi này sẽ được đánh giá:

  1. Làm thế nào vấn đề này có thể được cố định để nẹp được đặt ở vị trí thích hợp và bất cứ điều gì trong niềng răng được thụt vào một cấp đến đúng?

  2. Có thể vô hiệu hóa loại thụt lề tự động này (ví dụ như 'đặt noautoindent' trong vi). Tôi đã thử các giải pháp như những đề xuất ở đây: Disable auto indent globally in Emacs mà không thành công.

Cảm ơn bạn trước!

Trả lời

2

I đã thử để giải quyết vấn đề này bằng cách chỉnh sửa tệp scala-mode-indent.el. Nó phá vỡ thụt lề trong một số tình huống khác, nhưng ít nhất bạn sẽ không có tất cả những thụt lề đó nửa màn hình về phía trước.

Comment ra dòng này:

;; (scala-indentation-from-following) 

Và sửa đổi scala-thụt đầu dòng-từ-trước:

(defun scala-indentation-from-preceding() 
    ;; Return suggested indentation based on the preceding part of the 
    ;; current expression. Return nil if indentation cannot be guessed. 
    (save-excursion 
    (scala-backward-spaces) 
    (and 
    (not (bobp)) 
    (if (eq (char-syntax (char-before)) ?\() 
     (scala-block-indentation) 
     (progn 
     (when (eq (char-before) ?\)) 
     (backward-sexp) 
     (scala-backward-spaces)) 
     t 
     ;;(scala-looking-at-backward scala-expr-start-re) 

    )) 
    (if (scala-looking-at-backward scala-expr-start-re) 
     (+ (current-indentation) scala-mode-indent:step) 
     (current-indentation) 
    )))) 

Như tôi đã nói, nó vẫn còn bị phá vỡ sau đó. Tôi có kế hoạch để viết một hỗ trợ tốt hơn trong thời gian ngắn, có thể trong một hoặc hai tuần.

EDIT:

Nếu bạn muốn vô hiệu hóa scala thụt đầu dòng hoàn toàn, xóa bỏ dòng trong scala-mode.el

;; indent-line-function   'scala-indent-line 
+0

Cảm ơn rất nhiều Rogach! Vui lòng cho tôi biết nếu bạn thêm hỗ trợ thêm. – nequitans

+0

@nequitans - bạn được chào đón! Tôi sẽ thêm một câu trả lời cho câu hỏi này, khi tôi làm xong. – Rogach

4

Tôi đã được mã hóa lên một đoạn mã đơn giản - nó làm cho emacs giữ mức thụt lề cho hầu hết thời gian và thụt lề hai khoảng trống ở bên phải khi dòng không trống trước đó kết thúc bằng "{", "(", ">", "=".

Thêm tệp besi.el vào đường dẫn tải.

(provide 'besi) 

(defun besi-indent-line() 
    "Indent current line" 
    (interactive) 
    (scala-indent-line-to (besi-indent))) 

(defun besi-indent() 
    (save-excursion 
    (forward-comment -100000) 
    (backward-char 1) 
    (if (or (looking-at "{") (looking-at "=") (looking-at ">") (looking-at "(")) 
     (+ (current-indentation) 2) 
     (current-indentation)))) 

(defun besi-newline() 
    (interactive) 
    (newline-and-indent)) 

Chỉnh sửa dòng trong scala-mode.el

indent-line-function   'besi-indent-line 

và dòng trong scala-mode-ui.el

("\r"      'besi-newline) 

Ngoài ra thêm một dòng (require 'besi) khi bắt đầu scala-mode.el .

Tải tệp này lên github để dễ tham khảo - besi

+0

Nếu bạn có bất cứ đề nghị/ý kiến, xin vui lòng cho tôi biết! – Rogach