2010-09-27 6 views
6

Tôi mới bắt đầu sử dụng các emacs, và có một tính năng tôi thực sự thích, và tìm kiếm xung quanh một chút là không kết quả. Tôi hy vọng một người khác đã làm điều này bởi vì tôi không muốn học elisp chỉ được nêu ra.Làm thế nào tôi có thể nhận được emacs để chèn niềng răng tự động

void foo()<cursor> 

Tôi muốn gõ một "{" gây ra điều này xảy ra

void foo(){ 
    <cursor> 
} 

Tôi muốn này chỉ xảy ra trong cc-mode, và chỉ ở phần cuối của một dòng khi không Một chuỗi/chú thích/etc

Điều đầu tiên nghĩ đến là "{" để làm điều này luôn luôn (tôi có thể tìm ra cách làm điều này), nhưng sẽ rất khó để làm cho nó chỉ xảy ra ở đúng thời điểm.

mọi gợi ý sẽ được đánh giá cao.

+0

Tôi nghĩ rằng đây là bản sao của http://stackoverflow.com/questions/1023770/automatically-closing-braces-in-emacs –

+0

Tôi nhìn câu hỏi đó, nhưng đó chỉ là về việc thêm các đóng ngoặc/cú đúp/etc. Tôi muốn nó để dòng mới hai lần, thụt lề, và đặt lại vị trí con trỏ vào dòng trống cũng như – Bwmat

Trả lời

5

này sẽ làm điều đó:

(defun my-c-mode-insert-lcurly() 
    (interactive) 
    (insert "{") 
    (let ((pps (syntax-ppss))) 
    (when (and (eolp) (not (or (nth 3 pps) (nth 4 pps)))) ;; EOL and not in string or comment 
     (c-indent-line) 
     (insert "\n\n}") 
     (c-indent-line) 
     (forward-line -1) 
     (c-indent-line)))) 

(define-key c-mode-base-map "{" 'my-c-mode-insert-lcurly) 
+0

cảm ơn, điều này rất hữu ích. – Bwmat

2

Hãy thử yasnippet (hoặc trên trang Wiki của Emacs yasnippet). Có rất nhiều gói cho Emacs hỗ trợ làm điều này, nhưng yasnippet dường như có động lực hiện tại và rất mở rộng. Kiểm tra các video.

+0

Điều đó trông rất tuyệt, tôi sẽ xem xét nó – Bwmat

+0

Điều này dường như không lý tưởng, tôi cần nhấn tab để mở rộng nó và nó không hoạt động nếu không có một khoảng trống giữa "{" và bất kỳ cái gì ở trước nó. – Bwmat

+0

Bạn có thể sửa đổi mẫu để xóa không gian. Sửa đổi/tạo mẫu là khá dễ dàng. –

1

Bạn sẽ cần phải nghiên cứu sâu vào các emacs-lisp để làm điều này chính xác như bạn muốn, vì YASnippet sẽ làm điều gì đó tốt đẹp cho bạn nhưng không chính xác những gì bạn đang yêu cầu.

Tôi nghĩ cách đơn giản nhất để thực hiện việc này là liên kết một hàm với phím RET, trong bản đồ khóa chế độ cc.

Chức năng nên kiểm tra với các nhân vật trước đây là một { và nếu như vậy, thực hiện các yêu cầu RET, RET, TAB, }, Up, TAB để có được con trỏ bạn muốn và đóng } được chèn vào.

Bạn có thể làm cho đối tượng địa lý trở nên mạnh mẽ hơn bằng cách kiểm tra cân bằng } nhưng điều này sẽ phức tạp hơn và tôi khuyên bạn nên xem nó cảm thấy như thế nào nếu không có tính năng đánh bóng bổ sung này.

Nếu bạn thích tôi có thể viết hàm và ràng buộc khóa-bản đồ cho bạn, nhưng vì bạn đã hỏi ý tưởng về cách thực hiện, tôi sẽ để bạn yêu cầu thêm trợ giúp nếu bạn cần .

Ngoài ra, tôi thấy rằng autopair.el thực hiện điều này độc đáo đủ cho tôi, và tôi làm dòng mới bản thân mình;)

+0

đó là những gì tôi nghĩ. là có một cách dễ dàng để, bên trong chức năng lisp, kiểm tra xem tôi đang ở trong một bình luận/chuỗi và cho dù tôi đang ở cuối dòng? Tôi biết cc-mode làm điều này trong nội bộ và nó sẽ làm cho nó thực sự dễ dàng nếu tôi chỉ có thể sử dụng đó. – Bwmat

+0

Bạn có thể sử dụng điểm-tại-điểm để xác định bối cảnh bạn đang ở. – ocodo

3

tôi chân thành khuyên bạn thử ra các tuyệt vời autopair chế độ nhỏ - nó rất nhiều không chỉ đơn giản là chèn niềng răng và làm cho Emacs hơn rất nhiều IDE như trong khu vực đó. Tôi đoán kết hợp nó với các thiết lập niềng răng điện trong chế độ cc sẽ cung cấp cho bạn nhiều hơn hoặc ít hơn các hành vi mà bạn tìm kiếm.

8

trên emacs mới nhất bạn có thể sử dụng:

electric-pair-mode is an interactive compiled Lisp function. 

(electric-pair-mode &optional ARG) 

Automatically pair-up parens when inserting an open paren. 

này được tích hợp trong Emacs 24.1 (trên thực tế CVS)

1

Bạn có thể muốn giữ tùy chọn của một cơ quan chức năng rỗng, trong trường hợp đó bạn sẽ muốn đóng ngoặc nhọn để ở trên cùng một dòng. Nếu đúng như vậy, bạn có thể thử giải pháp thay thế sau:

  1. Dựa trên các gói được đề cập trong các trả lời trước để tự động thêm dấu ngoặc đóng.
  2. Khi bạn muốn thêm câu lệnh vào nội dung chức năng, bạn nhấn phím Return (trong khi dấu ngoặc đóng được thêm tự động vẫn nằm dưới con trỏ). Các 'Return' chính là ràng buộc như sau:

    ;; automatic first line in function            
    (defun my-c-mode-insert-funline() 
        (interactive) 
        (newline-and-indent) 
        (when (looking-at "}") 
        (newline-and-indent) 
        (forward-line -1) 
        (c-indent-line))) 
    (global-set-key (kbd "RET") 'my-c-mode-insert-funline) 
    
2

bật điện-cặp-mode trong emacs 24 hoặc phiên bản mới hơn.

(electric-pair-mode 1)