2012-06-16 13 views
10

Thỉnh thoảng tôi muốn có các nhận xét tạm thời được để lại hoàn toàn hợp lý trên một dòng (//) hoặc một dãy các dòng /* */. Tuy nhiên, CC Mode ghi đè điều này bằng cách tự động thụt lề khi nhập khóa thứ hai. Nói chung, tôi thích tự động thụt lề cho các từ khóa, v.v. nhưng tôi muốn nó bị vô hiệu hóa cho các nhận xét. (Cập nhật:. Tức là tôi muốn vô hiệu hóa một cách bình luận thụt đầu dòng được kích hoạt bởi các c-electric- key-bindings, nhưng ý kiến ​​vẫn nên thụt thường othewise)Trong emacs, làm thế nào để vô hiệu hóa bình luận auto-indent trong C/C++?

tôi đã cố gắng đưa những dòng này trong .emacs, nhưng nó không ngăn chặn hành vi.

(c-electric-slash nil) 
(c-electric-star nil) 

Trả lời

8

Câu trả lời ngắn:

(eval-after-load 'cc-mode 
    '(progn 
    (define-key c-mode-base-map "/" 'self-insert-command) 
    (define-key c-mode-base-map "*" 'self-insert-command))) 

Đây là cách tôi đi về nó:

Tìm hiểu các chức năng liên kết với /: C-h k /

Nó nói "/ chạy lệnh c-electric-slash, một hàm biên dịch tương tác Lisp trong 'cc-cmds.el'".

(Nếu bạn không nhìn thấy liên kết để cc-cmds.el, sau đó bạn không có các nguồn elisp cài đặt. Giả sử bạn không phải trên Windows, bạn có thể sử dụng quản lý gói của hệ thống để cài đặt các gói emacs-el và cố gắng một lần nữa.)

Làm theo liên kết đó để mở cc-cmds.el. Tìm kiếm c-electric-slash không tìm thấy bất kỳ thông tin nào khác ngoài định nghĩa hàm, do đó các khóa không bị ràng buộc trong tệp này. Tìm kiếm trong cc-mode.el từ thư mục này cho thấy:

(define-key c-mode-base-map "/" 'c-electric-slash) 

Bây giờ chúng ta biết tên của "sơ đồ bàn phím", trong đó ghi đè / keybinding.

Nếu bạn thêm một cái gì đó như thế này để tập tin init của bạn, có thể bạn sẽ nhận được một lỗi khi khởi động:

(define-key c-mode-base-map "/" 'self-insert-command) 

... bởi vì tập tin init của bạn được nạp trước khi cc-mode.el là, và c-mode-base-map không xác định. Vì vậy, chúng tôi sử dụng eval-after-load (như ở đầu câu trả lời của tôi). Đối số đầu tiên, 'cc-mode, phải khớp với câu lệnh provide ở cuối cc-mode.el. Nếu bạn không biết ý nghĩa của progn, hãy làm C-h f progn.

Nếu bạn thích kiểu học tập/khám phá Emacs này, bạn có thể xem xét đọc "How to learn Emacs" của mình.

+0

Brilliant! Thật là một lời giải thích tuyệt vời! .. và nó hoạt động, quá :) ... Cảm ơn bạn ... và tôi ' –

+0

Gợi ý: Cập nhật điều này để sử dụng 'with-eval-after-load' –

+0

Đối với những gì nó có giá trị, tôi đã đấu tranh với vấn đề này trong khi tạo ra một chế độ chính bắt nguồn từ' c-mode'. thêm hai dòng 'define-key' vào định nghĩa sơ đồ bàn phím của tôi (và thay đổi' c-mode-base-map' thành tên bản đồ cục bộ của tôi), tôi có thể loại bỏ hành vi này. – ohruunuruus

0

Tôi đề nghị để nhìn vào c-indent-comment-alist & c-indent-comments-syntactically-p biến. Xem thêm thông tin để giúp cho các biến này (C-h v) và trong các phần "Customizing Indentation" và "Style Variables" của cuốn cẩm nang CC-mode

+0

Tôi chưa đọc tất cả (hãy để một mình vật lộn với các thuật ngữ emacs mới), nhưng tôi có cảm giác rằng đề xuất của bạn thay đổi *** làm thế nào *** những thứ indent.Tôi không muốn thay đổi hành vi thụt đầu dòng: Tôi muốn các dòng chú thích thụt lề bình thường trong hầu hết các tình huống, nhưng tôi không muốn * (c-electric-slash * và * (c-electric-star * để chỉ ra rằng sự thụt đầu dòng) xảy ra *** khi *** '/' hoặc '*' được nhấn. Có lẽ nó đơn giản như việc ràng buộc lại các khóa '/' và '*' từ các hàm * điện * thành 'tự chèn-lệnh' , nhưng chỉ cho * CC Mode * (đó là chút tôi không biết làm thế nào để làm) –