2010-04-12 37 views
23

Tôi có một namespace lồng nhau nhân:Emacs - ghi đè thụt đầu dòng

namespace first {namespace second {namespace third { 
       // emacs indents three times 
    // I want to intend here 
} } } 

indents để emacs đến vị trí thứ ba. Tuy nhiên tôi chỉ muốn có một sự thụt đầu dòng duy nhất.
Có thể thực hiện hiệu ứng này đơn giản không?

Trả lời

23

Sử dụng một xẹp cột tuyệt đối bên trong namespace:

(defconst my-cc-style 
    '("gnu" 
    (c-offsets-alist . ((innamespace . [4]))))) 

(c-add-style "my-cc-style" my-cc-style) 

Sau đó sử dụng c-set-phong cách sử dụng phong cách riêng của bạn.

Lưu ý rằng thao tác này chỉ hoạt động trong C++ - chế độ, chế độ c không biết 'innamespace'.

1

Nếu bạn chỉ muốn nhập một tab chữ, thay vì thay đổi lược đồ thụt lề của các emacs, C-q TAB sẽ hoạt động.

1

Thật không may, tôi không nghĩ rằng emacs có một phong cách riêng biệt cho một không gian tên bên trong một không gian tên khác. Nếu bạn vào dòng bên trong và làm C-c, C-o, bạn có thể thay đổi kiểu giới thiệu trên cùng và nếu bạn chạy customize-variable c-offsets-alist, bạn có thể chỉnh sửa tất cả các tùy chọn thụt lề khác nhau, nhưng không tồn tại trong trường hợp sử dụng cụ thể của bạn. Bạn sẽ cần phải viết nó bằng tay trong elisp

4

OK vì vậy đây dường như làm việc trong cả hai emacs 21 và 22 ít nhất:

(defun followed-by (cases) 
    (cond ((null cases) nil) 
     ((assq (car cases) 
       (cdr (memq c-syntactic-element c-syntactic-context))) t) 
     (t (followed-by (cdr cases))))) 

(c-add-style "foo"  
       `((other . personalizations) 
     (c-offsets-alist 
     (more . stuff) 
     (innamespace 
      . (lambda (x) 
      (if (followed-by 
       '(innamespace namespace-close)) 0 '+)))))) 

(Các giải pháp đầu tiên không hỗ trợ cấu trúc như

namespace X { namespace Y { 
    class A; 
    namespace Z { 
     class B; 
    } 
}} 

)

+0

Rất đẹp, cảm ơn. –

1

tác phẩm này cho tôi, kế thừa từ chế độ cc và thay thế không gian tên thụt vào 0, hay còn gọi là vô hiệu hóa nó.

(defconst my-cc-style 
    '("cc-mode" 
    (c-offsets-alist . ((innamespace . [0]))))) 

(c-add-style "my-cc-mode" my-cc-style) 
+0

Vài câu hỏi: làm thế nào để bạn đảm bảo rằng chế độ-cc của tôi dựa trên lựa chọn C trước đây của bạn, và làm thế nào để bạn kích hoạt nó? – GreenAsJade

+1

Kích hoạt nó bằng móc này: (add-hook 'C++ - mode-hook (lambda() (kiểu c-style "kiểu cc của tôi") )) –

10

Với C++ - chế độ trong Emacs 23, tôi phải làm như thế này:

(defun my-c-setup() 
    (c-set-offset 'innamespace [4])) 
(add-hook 'c++-mode-hook 'my-c-setup) 

Để vô hiệu hóa sự thụt vào trong không gian tên hoàn toàn, thay đổi [4] để 0.

+0

Điều này làm việc cho tôi trong Emacs 24.5.1 (với 'innamespace [0]'), trong khi câu trả lời được chấp nhận thì không. – AlwaysLearning

+1

Giải pháp tốt hơn nhiều so với giải pháp được chấp nhận, yêu cầu bạn phải gây rối với phong cách thực tế bạn đang sử dụng (và không cho bạn biết cách thực hiện). Câu trả lời được chấp nhận đã không làm việc cho tôi, điều này không. – GreenAsJade

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