Làm thế nào tôi có thể tự động định dạng / thụt mã C trong vim?


250

Khi tôi sao chép mã từ một tệp khác, định dạng bị rối, như thế này:

fun()
{
for(...)
{
for(...)
{
if(...)
{
}
}
}
}

Làm thế nào tôi có thể tự động định dạng mã này trong vim?


3
Đối với bất kỳ ai đang tìm cách định dạng và không chỉ thụt lề mã, câu trả lời thứ hai (của tôi) giải quyết điều đó. Nếu bạn chỉ muốn sửa lỗi thụt lề, câu trả lời được chấp nhận là cách đơn giản nhất.
Derek

Câu trả lời:


566

Hãy thử các tổ hợp phím sau:

gg=G

Giải thích: ggđi đến đầu tệp, =là một lệnh để sửa lỗi thụt đầu dòng và Gbảo nó thực hiện thao tác đến cuối tệp.


28
Điều này chỉ thụt lề mã. một cái gì đó không thể được thực hiện để AUTOFORMAT toàn bộ điều?
N 1.1

7
Sự khác biệt là gì?
Ton van den Heuvel

3
@Ton van: Xem câu trả lời của tôi cho sự khác biệt (Không thể giải thích ở đây trong các bình luận).
Lazer

2
-1 Điều này chỉ sửa lỗi thụt lề, không định dạng (đó là những gì được yêu cầu).
oligofren

3
@oligofren Ví dụ của OP chỉ bao gồm các lỗi thụt lề và anh ấy chấp nhận câu trả lời, vì vậy tôi đoán đó là những gì anh ấy muốn nói.
Amir Rachum

78

Tôi thích sử dụng chương trình Phong cách nghệ thuật. Theo trang web của họ :

Artistic Style là một công cụ mã hóa, định dạng và làm đẹp mã nguồn cho các ngôn ngữ lập trình C, C ++, C # và Java.

Nó chạy trong Window, Linux và Mac. Nó sẽ làm những việc như thụt lề, thay thế các tab bằng dấu cách hoặc ngược lại, đặt khoảng trắng xung quanh các thao tác bạn thích (chuyển đổi if(x<2)thành ( x<2 )nếu đó là cách bạn thích), đặt dấu ngoặc trên cùng một dòng như định nghĩa hàm hoặc di chuyển chúng sang dòng bên dưới, vv Tất cả các tùy chọn được điều khiển bởi các tham số dòng lệnh.

Để sử dụng nó trong vim, chỉ cần đặt tùy chọn formatprg cho nó, sau đó sử dụng lệnh gq. Vì vậy, ví dụ, tôi có trong .vimrc của mình:

autocmd BufNewFile,BufRead *.cpp set formatprg=astyle\ -T4pb

để bất cứ khi nào tôi mở tệp .cpp, formatprg được đặt với các tùy chọn tôi thích. Sau đó, tôi có thể nhập gg để đi đến đầu tệp và gqGđịnh dạng toàn bộ tệp theo tiêu chuẩn của tôi. Nếu tôi chỉ cần định dạng lại một chức năng duy nhất, tôi có thể đi đến đỉnh của chức năng, sau đó nhập gq][và nó sẽ định dạng lại chức năng đó.

Các tùy chọn tôi có cho astyle, -T4pbchỉ là sở thích của tôi. Bạn có thể xem qua tài liệu của họ và thay đổi các tùy chọn để định dạng mã theo cách bạn muốn.

Đây là một bản demo. Trước astyle:

int main(){if(x<2){x=3;}}

float test()
{
if(x<2)
x=3;
}

Sau astyle (gggqG):

int main()
{
    if (x < 2)
    {
        x = 3;
    }
}

float test()
{
    if (x < 2)
        x = 3;
}

Mong rằng sẽ giúp.


3
Có bất cứ điều gì như thế này cho các định dạng khác; ruby, xml, json, v.v?
derGral

1
@Ryan kiểm tra vim-autoformat, xem câu trả lời dưới đây. BTW vim-autoformat cũng sử dụng astyle trong số những người khác.
Chiel ten Brinke

1
Cảm ơn bạn! Tôi đã bắt đầu nghĩ rằng tôi là người duy nhất trong từ không muốn dấu ngoặc mở của họ trên cùng một dòng với khai báo hàm!
dùng3640967

27

Lệnh dựng sẵn để thụt lề đúng cách mã đã được đề cập ( gg=G). Nếu bạn muốn làm đẹp mã, bạn sẽ cần sử dụng một ứng dụng bên ngoài như thụt lề . Vì %biểu thị tệp hiện tại trong chế độ cũ, bạn có thể sử dụng nó như thế này:

:!indent %

13

Plugin vim-autoformat cho phép bạn định dạng bộ đệm (hoặc lựa chọn bộ đệm) bằng một lệnh duy nhất: https://github.com/Chiel92/vim-autoformat . Nó sử dụng các chương trình định dạng bên ngoài cho điều đó, với chức năng dự phòng cho chức năng thụt lề của vim.


11

Tôi thấy rằng clang-formathoạt động tốt.

Có một số ví dụ khóa trong tài liệu clang

Tôi thích sử dụng các equalprgràng buộc trong vim. Điều này cho phép bạn gọi clang-formatvới G=gghoặc các =tùy chọn thụt lề khác .

Chỉ cần đặt phần sau vào tệp .vimrc của bạn:

autocmd FileType c,cpp setlocal equalprg=clang-format

3
Cần cài đặt nó trước, ví dụ như đối với Ubuntu 16.04+:sudo apt install clang-format
Eric Wang

3

Có lẽ bạn có thể thử các cách sau $ indent -kr -i8 * .c

Hy vọng nó hữu ích cho bạn!


3

Tôi thích indentnhư đã đề cập ở trên, nhưng hầu hết tôi chỉ muốn định dạng một phần nhỏ của tệp mà tôi đang làm việc. Vì indentcó thể lấy mã từ stdin, nó thực sự đơn giản:

  1. Chọn khối mã bạn muốn định dạng bằng Vhoặc tương tự.
  2. Định dạng bằng cách gõ :!indent.

astyle mất stdin quá, vì vậy bạn có thể sử dụng thủ thuật tương tự ở đó.


2

Tôi muốn thêm, rằng để ngăn chặn nó bị rối ở nơi đầu tiên bạn có thể gõ :set pastetrước khi dán. Sau khi dán, bạn có thể gõ :set nopastecho những thứ như js-beautifying và thụt lề để làm việc lại.


1
Tôi sử dụng :set paste!cho cái này, nó thay đổi giá trị dán thay vì đặt nó. Điều này làm cho nó dễ dàng hơn để tắt vì bạn chỉ cần cuộn lại một vài lệnh và nhấn enter.
a'r

0

Họ là một công cụ được gọi là indent. Bạn có thể tải xuống với apt-get install indent, sau đó chạy indent my_program.c.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.