2010-11-12 36 views
23

Xin hãy giúp tôi thiết lập thụt đầu dòng thích hợp trong Emacs Haskell-modeEmacs Haskell thụt đầu dòng

Khi tôi đang cố gắng để gõ xuống một cái gì đó giống như ADT hoặc một kỷ lục, tôi nhận được trên cột sai sau khi nhấn <ENTER>, và nhấn <TAB>sẽ không chuyển sang bên phải cho đến khi tôi nhập | hoặc ';'!

data MyADT = Oh 
      | Hi 
      | Hello 
      | <- the cursor is here again! 

Đang cố gắng để giải quyết vấn đề tôi đặt

(define-key global-map (kbd "RET") 'reindent-then-newline-and-indent) 

trong tập tin .emacs của tôi, nhưng nó sẽ không thụt dòng hiện trên ấn <enter> quá!

Một hành vi kỳ lạ: thụt đầu dòng của trường hợp

oneChar c = case lookup c simpleEscapes of 
    | <- what? here?! 
+1

Trường hợp 'case' là hành vi đúng. – jrockway

+1

Nếu bạn nhấn tab hai lần, nó sẽ chèn '|' trong thụt lề chính xác. – edon

+0

nếu chưa có '|', thì không. Vì vậy, tôi phải gõ một cái gì đó trong dòng trước khi nhấn tab –

Trả lời

3

tôi nhận xét dòng

;;(add-hook 'haskell-mode-hook 'turn-on-haskell-indent) 

Và bây giờ tôi nhận được một "tab" hành vi tốt: ít nhất, nó cho phép tôi để lựa chọn một cột và không buộc tôi vào cột mà nó thích. Nhưng không có tự động thụt lề chút nào làm phiền tôi một chút, vì vậy tôi hy vọng đó là giải pháp tạm thời

9

Có vẻ như bạn nhập <Enter> và sau đó "|" và sau đó <Tab>. Nếu tôi làm điều đó, tôi sẽ có được kết quả tương tự. Nhưng nếu tôi gõ <Enter> và sau đó <Tab> và sau đó <Tab> một lần nữa nó sẽ tự động chèn các "|" và dòng nó lên một cách chính xác, như vậy:

data MyADT = Oh 
      | Hi 
      |<Cursor> 

Khi tôi kiểm tra phiên bản Haskell-mode của tôi sử dụng M-x eval-expression haskell-version <Enter> tôi nhận được "v2_4" .

Emacs haskell-mode không phân tích đầy đủ mã nguồn, vì vậy các tính năng "tự động" là gần đúng, tôi nghĩ vậy. Nhập <Tab> nhiều lần vào một chu kỳ dòng mới thông qua một số thụt đầu dòng có thể và đôi khi chèn văn bản như "|" cho các loại dữ liệu đại số.

4

Nhớ lại: Tôi không phải là người dùng Haskell, vì vậy hãy dùng loại này với một hạt muối.

Khi bạn bấm RET sau Hello, Emacs không biết bạn đang đi để thêm một | (quick search cho thấy bạn có thể có những biểu tượng khác). Những người Haskell đã coi thụt đầu dòng thích hợp để được xếp hàng ngay bên dưới H trong Hello. Nếu thụt đầu dòng được tự động xếp hàng với số | trên dòng trên, thì tất cả các trường hợp mà bạn không nhập | sẽ dẫn đến thụt lề không đúng. Damned nếu bạn làm, damned nếu bạn không ...

Chế độ lập trình khác (C/C++, Lisp, Tcl, ...) có cùng một vấn đề - họ không thể biết trước những gì bạn đang đi để đưa vào dòng tiếp theo, do đó, thụt đầu dòng của tôi không phải là những gì bạn mong muốn.

Một giải pháp là sử dụng các phím "electric", để nói rằng chúng chèn ký tự và cũng buộc phải thụt lề lại. Bạn có thể dễ dàng xác định | được điện với đoạn mã sau:

(defun haskell-electric-|() 
    "it's electric! (insert | and indent as long as the | follows whitespace)" 
    (interactive) 
    (insert "|") 
    (if (string-match-p "^\\s-*|" (buffer-substring (line-beginning-position) 
                (point))) 
     (haskell-indentation-indent-line))) 
(define-key haskell-mode-map "|" 'haskell-electric-|) 

tôi đã thêm một tấm séc để đảm bảo rằng | chèn trước nó là khoảng trắng, bạn có thể tùy chỉnh mà tuy nhiên bạn muốn hoặc loại bỏ việc kiểm tra hoàn toàn.

Tôi cho rằng cũng có thể có các biểu tượng khác trong Haskell sẽ đáng để làm điện.

Các vấn đề liên quan