2017-03-15 25 views
20

Tôi có tập tin .clang-format tiếp theo trong thư mục gốc của dự án của tôi:Làm thế nào để tự động thụt lề một lớp C++ với 4 dấu cách bằng cách sử dụng định dạng clang?

--- 
AlignTrailingComments: true 
AllowShortFunctionsOnASingleLine: false 
AllowShortIfStatementsOnASingleLine: true 
AllowShortLoopsOnASingleLine: true 
BreakBeforeBinaryOperators: false 
IndentWidth: 4 
SortIncludes: false 
NamespaceIndentation: All 
... 

Vấn đề xảy ra khi tôi chạy kêu vang-format trên c của tôi ++ tiêu đề, các lớp học trở thành autoindented như thế này:

enter image description here

Như bạn có thể thấy, nhãn công khai & riêng chỉ được thụt vào với 2 dấu cách. Nhưng những gì tôi đang cố gắng để đạt được là sản phẩm dưới đây (thụt đầu dòng được bằng tay tinh chỉnh):

enter image description here

Bằng cách đó mã sụp đổ trở thành một cái gì đó thực sự thú vị để làm.

Làm cách nào để tinh chỉnh định dạng .clang của tôi để đạt được hiệu ứng này?

EDIT:

Tôi đã cố gắng sử dụng các giá trị unsuccesfully AccessModifierOffset, tôi đã sử dụng {} -2,0,2,4 exampe dưới đây:

enter image description here

Như bạn có thể thấy tuyên bố bên trong khối công cộng sẽ không được thụt lề đúng cách.

EDIT2:

Tôi đã thử các giải pháp @Henrique Jung và đó là chắc chắn không phải những gì tôi đang yêu cầu, nếu sử dụng kết hợp đó kết quả sẽ là một cái gì đó như thế này:

enter image description here

Và như bạn có thể thấy, nội dung bên trong các hàm được thụt vào 8 dấu cách thay vì 4, không tốt.

EDIT3:

Tôi đã đưa ra một số tiền thưởng vài tháng trước vì vậy tôi sẽ thử lại vì điều này thực sự thú vị. Nếu tôi có đủ kiến ​​thức về mã nguồn định dạng clang tôi sẽ cho nó một shot, tiếc là tôi không ... Tôi hy vọng một số dev dev sẽ có một cái nhìn này và đưa ra một số gợi ý.

+0

thử "AccessModifierOffset". Đây là bản sao có thể có của một câu hỏi SO khác: http://stackoverflow.com/questions/29198963/how-can-i-tell-clang-format-to-indent-visibility-modifiers – caoanan

+0

@caoanan Không thực sự, tôi đã đã thử AccessModifierOffset vài ngày trước và vì một lý do nào đó nó không thụt lề đúng các lớp. Trong khi đó là sự thật rằng nó sẽ thụt lề công cộng/tư nhân/bảo vệ nó không thụt lề các báo cáo bên dưới chúng. Hãy nhìn vào câu hỏi của tôi, tôi đã đưa cho bạn một ví dụ – BPL

+0

Eh, nếu chỉ tôi có thể dán một ảnh chụp màn hình [vào đây] (http://clang-format.me/). Có vẻ như bạn thích cài đặt kiểu Webkit. –

Trả lời

0

Tôi đã quản lý để đạt được hiệu quả bạn muốn bằng cách thay đổi cả hai AccessModifierOffset với IndentWidth. Về cơ bản, đầu tiên được sử dụng như một bù đắp của thứ hai, vì vậy nếu bạn tạo bạn .clang định dạng như thế này bạn sẽ có được những gì bạn muốn:

AccessModifierOffset: -4 
IndentWidth:  8 

Nếu AccessModifierOffset là 0, các từ khóa public sẽ có mặt tại cùng mức độ thụt đầu dòng như các thành viên. Tuy nhiên, việc thay đổi IndentWidth sẽ thụt lề tất cả mã bằng 8 dấu cách, ngay cả những mã bên ngoài khai báo lớp. Đây là mã mẫu:

class Foo { 
    public: 
     Foo(); 
     virtual ~Foo(); }; 

int main(int argc, char *argv[]) { 
     std::cout << "Hello world" << std::endl; 
     return 0; 
} 
+0

Cảm ơn câu trả lời, nhưng đó chắc chắn không phải những gì tôi yêu cầu, tôi đã chỉnh sửa câu trả lời của mình để giải thích lý do ... xem std :: cout và return 0 statements, họ thụt vào 8 dấu cách thay vì 4, tôi muốn 4. – BPL

+0

Vâng tôi biết có một tác dụng phụ, tuy nhiên tôi không thể tìm thấy một biến thụt lề cụ thể cho các thành viên. –

1

Gần như tôi có thể nói, định dạng clang không có tùy chọn để thụt lề nội dung hàm khác với nội dung lớp không sửa đổi truy cập.Tức là, hãy xem xét mã sau:

class A { 
    public: 
    void foo() {} 
} 

void bar() { 
    int a; 
} 

Trong mã này, dòng "void foo() {}" sẽ luôn được thụt vào cùng một số tiền như "int a;" theo định dạng clang.

Điều gần gũi nhất với phong cách bạn dường như muốn có sẵn sẽ đến từ không thụt các bổ từ truy cập, ví dụ:

class A { 
public: 
    void foo() {} 
} 

void bar() { 
    int a; 
} 

này được thực hiện, ví dụ, do WebKit, Mozilla, và LLVM phong cách. Nó đạt được bằng cách đặt:

IndentWidth: 4 
AccessModifierOffset: -4 
Các vấn đề liên quan