2009-03-19 33 views
31

Tôi đang chạy các emacs 23 với chế độ C++ - và có một số vấn đề về thụt lề. Giả sử tôi có mã này:Emacs C++ - chế độ thụt lề không chính xác?

void foo() 
{ 
    if (cond) 
    { <--- 
     int i; 
     ... 
    } <--- 
} 

Đây có vẻ là hành vi mặc định của thụt đầu dòng tự động. Tuy nhiên tôi muốn thay đổi nó để nó sẽ như thế này:

void foo() 
{ 
    if (cond) 
    { 
     int i; 
     ... 
    } 
} 

Có cách nào để làm điều này một cách dễ dàng bằng cách cấu hình C++ chế độ hoặc emacs tôi nộp?

+2

Đối với hồ sơ, điều này chế độ thụt đầu dòng là kiểu GNU Tất cả các chương trình GNU được yêu cầu theo phong cách thụt lề này – greyfade

+23

vâng tôi đọc ở đâu đó, nhưng tôi không thể đứng đó –

+3

Thực tiễn tốt là viết mã cho người dùng của bạn chứ không phải chính bạn. Mã GNU sử dụng các kiểu khác –

Trả lời

35

Tôi có sau đây trong tập tin emacs của tôi:

(defun my-c++-mode-hook() 
    (setq c-basic-offset 4) 
    (c-set-offset 'substatement-open 0)) 
(add-hook 'c++-mode-hook 'my-c++-mode-hook) 

Bạn có thể xác định bù đắp để chỉnh sửa bằng cách nhấn [Ctrl-c Ctrl-s] trên bất kỳ dòng. Trên dòng đầu tiên với một cú đúp sau if nó sẽ nói substatement-open.

+5

Được thăng hạng cho đầu mũi tên [ctrl-c ctrl-s] – user98166

21

Đây là của tôi ... điều này phù hợp với thiết lập mặc định cho studio trực quan.

(defun my-c-mode-common-hook() 
;; my customizations for all of c-mode, c++-mode, objc-mode, java-mode 
(c-set-offset 'substatement-open 0) 
;; other customizations can go here 

(setq c++-tab-always-indent t) 
(setq c-basic-offset 4)     ;; Default is 2 
(setq c-indent-level 4)     ;; Default is 2 

(setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60)) 
(setq tab-width 4) 
(setq indent-tabs-mode t) ; use spaces only if nil 
) 

(add-hook 'c-mode-common-hook 'my-c-mode-common-hook) 
+1

Cảm ơn bạn rất nhiều! ở đâu ... miễn là tôi có thể nhớ. –

+6

(setq c-default-style "bsd" c-basic-offset 4) Hoàn thành rất nhiều điều đó trong các dòng ít hơn. Mặc dù các chế độ thụt lề tab nên ở lại. –

9

Câu trả lời ngắn: Đặt dòng này vào emacs tập tin của bạn:

(c-set-offset 'substatement-open 0) 

Long trả lời: ...

Đối với những người trong chúng ta ai là người mới đến emacs-lisp, có một phương pháp khá đơn giản tại http://www.cs.cmu.edu/:

  • tới dòng bạn muốn thụt

  • Loại CC CO (đó là chữ "O", không phải không)

  • Nhấn Nhập để chấp nhận các đề nghị mặc định

  • Loại "0" (đó là một số không) mà không mất thêm thụt đầu dòng, nhấn Nhập

  • Loại Tab để reindent dòng.

  • Tương lai "{" trong trường hợp này sẽ có cài đặt tab chính xác, cho đến khi bạn khởi động lại các emac.

Những điều tốt đẹp về phương pháp này, là bạn có thể thực sự thấy mã lisp mà bạn muốn thay đổi. Bạn có thể đặt trong tập tin emacs của bạn:

(c-set-offset 'SYNTACTIC-SYMBOL OFFSET) 

Ngoài ra, bạn có thể muốn kiểm tra các chương trình AStyle để tự động định dạng C++ nguồn bên ngoài của emacs.

+0

Đây có vẻ là cách tiếp cận thuận tiện nhất, nhưng có cách nào để xác định một kiểu kết hợp tất cả các thay đổi của bạn không? –

2

Câu trả lời được chấp nhận thực sự là sai. Emacswiki sẽ không giúp.

Chèn mã sau vào ~ /.emacs:

(defun fix-c-indent-offset-according-to-syntax-context (key val) 
    ;; remove the old element 
    (setq c-offsets-alist (delq (assoc key c-offsets-alist) c-offsets-alist)) 
    ;; new value 
    (add-to-list 'c-offsets-alist '(key . val))) 

(add-hook 'c-mode-common-hook 
      (lambda() 
      (when (derived-mode-p 'c-mode 'c++-mode 'java-mode) 
       ;; indent 
       (fix-c-indent-offset-according-to-syntax-context 'substatement-open 0)) 
      )) 

Xem http://blog.binchen.org/posts/ccjava-code-indentation-in-emacs.html để biết chi tiết kỹ thuật.

Vấn đề chính là đặt bù trừ c-set là không đáng tin cậy để phát hiện ngữ cảnh cú pháp nữa (Emacs24.3.1). Vì vậy, cách đáng tin cậy duy nhất là phân tích mã emacs ban đầu. Các bước chi tiết để hack mã được liệt kê trong bài viết của tôi, về cơ bản bạn cần đọc hàm c-indent-line được định nghĩa trong /usr/share/emacs/24.3/lisp/progmodes/cc-cmds.el

Một số người phàn nàn rằng thiết lập của tôi không hoạt động. Trên thực tế, nó hoạt động ở tất cả các phiên bản ổn định của Emacs (23.4, 24.3, 24.4) nếu bạn không thay đổi thiết lập mặc định (Indention có cấu hình khác nhau, thiết lập của tôi dựa trên cấu hình mặc định).

Điểm mấu chốt của tôi là, về vấn đề cụ thể này, bạn cần đọc mã.

+0

hoạt động như một sự quyến rũ – iceman

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