2010-09-01 37 views
5

Tôi có đoạn code sau trong Emacs dưới scala-mode (từ 2,8 gói Scala):Emacs scala-mode newline-and-indent weirdness

object t1 { 
    def main (args: List[String]) = { 
    println("Hello") 
    } 
} 

Tôi cũng có chìa khóa trở lại của tôi thiết lập để newline-and-indent. Khi tôi liên tục nhấn trở lại sau cú đúp cuối cùng, nó đi đến cột ngoài cùng bên trái cho một dòng trống. Khi tôi nhấn trở lại lần nữa, nó indents hai khoảng trắng. Sau đó, nó vẫn ở sự thụt đầu dòng này sau đó. Rõ ràng nó không nên làm điều này.

Tuy nhiên, khi tôi liên tục chạy newline-and-indent bởi M-x và nhập newline-and-indent, tôi không nhận được dấu hai đầu trống. Điều tương tự cũng xảy ra với reindent-then-newline-and-indent.

Tại sao có sự khác biệt này?

Trả lời

5

Sự cố của bạn xuất phát từ thực tế là bạn bật lại enter đến newline-and-indent, dường như không thành ngữ khi sử dụng scala-mode. newline-and-indent kết thúc bằng cách gọi indent-according-to-mode, kiểm tra một số cài đặt không mong muốn, hoạt động xung quanh nếu cần và nếu mọi thứ đều ổn, hãy gọi số indent-line-function, là biến cục bộ bộ đệm.

Vì đây là chế độ dành riêng cho từng chế độ, các chế độ tự xác định indent-line-function của riêng chúng. Hầu hết có hành vi khá nhất quán, nhưng chức năng Scala là scala-indent-line, nhìn thấy ở đây:

(defun scala-indent-line() 
    "Indent current line as smartly as possible. 
When called repeatedly, indent each time one stop further on the right." 
    (interactive) 
    (if (or (eq last-command this-command) 
      (eq last-command 'scala-undent-line)) 
     (scala-indent-line-to (+ (current-indentation) scala-mode-indent:step)) 
    (let 
    ((indentation (scala-indentation))) 
     (scala-indent-line-to indentation)))) 

Điều buồn cười về việc này là nó phát hiện các cuộc gọi lặp đi lặp lại và indents hơn nữa trong mỗi lần. Khi sử dụng M-x, last-command không phải là scala-indent-line, là execute-extended-command. Vì vậy, khi sử dụng M-x, nó tiếp tục thụt lề ở mức thụt lề chính xác. Tuy nhiên, khi bị ràng buộc với một khóa, nó sẽ thông báo rằng nó đã được thực hiện ngay lập tức trước đó và thụt thêm một mức.

Hiệu ứng không tích lũy ... Tôi nghĩ điều này là do lệnh lẻ được đặt ở cuối hàm, ban đầu thụt lề dòng, nhưng sau đó kiểm tra thụt lề chính xác với (scala-indentation) và thụt lề tương ứng.

Tôi không phải là 100% về điều này, nhưng ngay từ cái nhìn đầu tiên đó là những gì dường như đang diễn ra.

+2

Sau đó, giải pháp là không để cho nó vào đường dẫn mã đó. Các công trình sau: (local-set-key [return] '(lambda() (tương tác) (setq last-command nil) (newline-and-indent)))))) – qrest