2009-06-12 43 views
6

Chúng tôi muốn làm cho phong cách cú đúp C++ của chúng tôi nhất quán hơn. Ngay bây giờ, mã của chúng tôi chứa hỗn hợp:Niềng răng cải tạo C++ mà không thay đổi thụt đầu dòng?

if (cond) 
{ 
    // ...  
} 
else 
{ 
    // ... 
} 

... và:

if (cond) { 
    // ... 
} else { 
    // ... 
} 

Chúng tôi muốn sử dụng phong cách thứ hai độc quyền.

Tuy nhiên, chúng tôi không muốn thay đổi thụt đầu dòng mã của chúng tôi. Tôi đã thử sử dụng astyle, bcpp, GNU indent và Uncrustify (và tôi đã xem xét các tùy chọn dòng lệnh cho GreatCode). Thật không may, mỗi công cụ này nhấn mạnh vào việc mã hóa lại mã của chúng tôi, và hầu hết trong số chúng đều mangmột danh sách khởi tạo hàm dựng C++ và các macro tiền xử lý khá kém.

Có bất kỳ bộ làm đẹp mã C++ nào có thể sửa lỗi niềng răng trong khi để lại thụt lề một mình không? Nó không phải là một công cụ có sẵn - nếu bạn biết cách làm điều này bằng cách sử dụng một số lớp lót Perl điên rồ, điều đó cũng tốt. Cảm ơn bạn!

Cập nhật: Có, chúng tôi biết rằng điều này sẽ gây khó khăn cho việc đọc các lỗi khác với mã cũ hơn. Đây là một phần làm sạch mã bị trì hoãn lâu dài và chúng tôi đã quyết định rằng lợi thế hàng ngày của định dạng nhất quán vượt quá bất kỳ khó khăn nào về kiểm soát phiên bản.

+0

Các bạn đang đổ mồ hôi những thứ nhỏ. –

Trả lời

7

Đây là một lớp lót Perl nên làm những gì bạn muốn.

perl -pi.bak -e 'BEGIN { undef $/; } s/\s*?(\s?\/\/.*)?\r?\n\s*{/ {\1/g; s/}(\s?\/\/.*)?\r?\n\s*else\b(.*)/} else\2\1/g;' 

Hóa này:

int main(int argc, char *argv[]) 
{ 
    int something = 0; 
    if (something) // 5-12-2007 
    { 
     printf("Hi!\n"); 
    } 
    else // 5-13-2007 
    { 
     printf("Bye\n"); 
    } 
    return 0; 
} 

vào đây:

int main(int argc, char *argv[]) { 
    int something = 0; 
    if (something) { // 5-12-2007 
     printf("Hi!\n"); 
    } else { // 5-13-2007 
     printf("Bye\n"); 
    } 
    return 0; 
} 
+0

Tuyệt vời! Tôi sẽ thử điều này trong một giờ nữa. – emk

+0

Rất cám ơn! Đây là một khởi đầu tốt, và nó có thể được điều chỉnh để xử lý các cấu trúc khác như 'bắt'. – emk

3

Bạn thực sự nên suy nghĩ hai lần và có thể ba lần trước khi thực hiện việc này. Nó sẽ phá hủy hoàn toàn lịch sử sửa đổi của hệ thống kiểm soát mã nguồn của bạn tại thời điểm thay đổi. Bạn đang sử dụng hệ thống kiểm soát mã nguồn, phải không?

+0

có thể tôi đang dày, nhưng tôi không hiểu.Vấn đề duy nhất tôi thấy là các tệp khác biệt trước và sau khi thay đổi sẽ dẫn đến nhiều khác biệt. Tôi không thấy làm thế nào "Nó sẽ phá hủy hoàn toàn lịch sử sửa đổi hệ thống kiểm soát mã nguồn của bạn". – Glen

+3

Chính xác - nhiều sự khác biệt - có thể trên mọi dòng khác, nếu các phương pháp ngắn đang được sử dụng. Điều này sẽ làm cho các diffs vô ích - bạn sẽ không thể chọn ra những thay đổi thực sự từ tiếng ồn gây ra bởi việc định dạng lại. –

+2

Vâng, bạn đã đúng. Nó sẽ không hoàn toàn phá hủy lịch sử sửa đổi của bạn. Nó sẽ chỉ phá hủy khả năng của bạn để so sánh mã mới bị ảnh hưởng với mã cũ hơn trên ranh giới thay đổi. Điều này có thể hoặc có thể không quan trọng đối với bạn hoặc dự án của bạn. – kmarsh

2

Lệnh UNIX Indent (http://en.wikipedia.org/wiki/Indent_(Unix)) (Có sẵn cho PC từ GNU) có hàng triệu tùy chọn để tùy chỉnh chính xác định dạng theo ý bạn.

+0

Theo như tôi có thể nói, hầu hết các lệnh thụt lề luôn luôn mã hóa lại mã nguồn, giống như tất cả các công cụ khác. Bạn có biết cách nào để tắt tính năng này không? Ngoài ra, thụt lề thường không hỗ trợ C++. – emk

+1

Nếu bạn có thể (1) chỉ cho tôi một phiên bản thụt lề với các tùy chọn cần thiết, và (2) giải thích mọi thứ không rõ ràng trong sổ tay, thì tôi sẽ chấp nhận câu trả lời này. Nhưng tôi đã dành nửa giờ nhìn vào dấu phẩy GNU không có may mắn. – emk

1

Sẽ không một bàn tay đầy đủ các regex đơn giản làm các thủ thuật? Như (\). ? \ N.? \ {) -> (\) \ {) để xóa khoảng trống giữa dấu ngoặc đóng và dấu ngoặc nhọn mở.

2
perl -ei '$/=undef;while(<>){s/}\s*?(\s*\/\/^[\r\n]*)?\r?\n\s*else/} else$1/gm;s/(\s*\/\/[^\r\n]*)?\r?\n\s*{/ {$1/gm;print;}' yoursourcefile.cpp 

này đầu tiên Mangles } <eol> <whitespace> else để } else, sau đó loại bỏ end-of-dòng từ <eol> <whitespace> {.

Để áp dụng điều này để một cây nguồn, sử dụng findxargs: vấn đề

find . -name \*.cpp -print0 | xargs -0 perl -ei '$/=undef;while(<>){s/}\s*?(\s*\/\/^[\r\n]*)?\r?\n\s*else/} else$1/gm;s/(\s*\/\/[^\r\n]*)?\r?\n\s*{/ {$1/gm;print;}' 
0

Tôi đã giải quyết như thế này trong quá khứ bằng cách đầu tiên chạy một số công cụ như Astyle làm 95% những gì chúng ta muốn, và sau đó viết một kịch bản Perl hoặc Python qua kết quả để hoàn thành 5% còn lại. Hãy thử nó, nó luôn luôn là thực hành tốt để biết biểu thức thông thường của bạn. :)

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