Lệnh vim để cơ cấu lại / buộc văn bản thành 80 cột


240

Tôi biết có nhiều cách để tự động đặt độ rộng của văn bản trong vim bằng cách sử dụng set textwidth(như lo ngại về bố cục cột Vim 80 ). Những gì tôi đang tìm kiếm là một cái gì đó tương tự như= (lệnh dòng thụt lề) nhưng để bọc đến 80. Trường hợp sử dụng đôi khi bạn chỉnh sửa văn bản với băng thông văn bản và sau khi nối các dòng hoặc xóa / thêm văn bản, nó sẽ bị gói kém.

Lý tưởng nhất là lệnh này sẽ sắp xếp lại hoàn toàn các dòng tôi chọn và cắt các dòng dài trong khi thêm vào các dòng ngắn. Một ví dụ:

long line is long!  
short

Sau khi chạy lệnh (giả sử gói là 13 cols):

long line is  
long! short

Nếu điều này là không thể với một lệnh vim thực sự, có lẽ có một chương trình dòng lệnh nào mà tôi có thể dẫn đầu vào?

Sau khi tìm kiếm, tôi tìm thấy tài liệu tham khảo này có một số tùy chọn khác: http://www.cs.swarthmore.edu/help/vim/reformatted.html


9
Bạn cũng có thể quan tâm để biết rằng Vim có thể ủy quyền định dạng văn bản cho một chương trình bên ngoài, chẳng hạn như mệnh . Tôi đã tạo một screencast trong đó trình bày cách định dạng văn bản với mệnh .
nelstrom

@nelstrom cảm ơn, TIL về par. Thật tuyệt vơi!
Steven Lu

2
Khi bạn muốn văn bản trông mỏng và gọn gàng (cắt tốt?), Hãy luôn nghĩ đến gq- Quý ông quý . (Lời xin lỗi cho nhân cách hóa nam, nhưng công việc ghi nhớ.)
ruffin

Câu trả lời:


372

Đặt textwidththành 80 ( :set textwidth=80), di chuyển đến đầu tệp (có thể được thực hiện bằng Ctrl- Homehoặc gg) và nhập gqG.

gqGđịnh dạng văn bản bắt đầu từ vị trí hiện tại và đến cuối tập tin. Nó sẽ tự động nối các dòng liên tiếp khi có thể. Bạn có thể đặt một dòng trống giữa hai dòng nếu bạn không muốn hai dòng đó được nối với nhau.


14
Và nó cũng hoạt động với các lựa chọn trực quan. Tức là một cái gì đó như : V}gq. Bằng cách này, bạn sẽ thấy những gì bạn sẽ định dạng trước khi thực sự định dạng nó.
Plouff

6
Nhân tiện, chính xác thì qnó làm gì?
Richard-Degenne

1
Có cách nào để làm điều này với các dòng chỉ là một chuỗi ký tự dài, không có khoảng trắng không? EDIT: Tôi đã phát hiện ra tiện ích "gấp". Vẫn băn khoăn về việc làm này trong vi.
Donald Smith

7
sử dụng set tw=80thay vì set textwidth=80để tiết kiệm thời gian
Yibo Yang

4
@dmranck Sau khi set textwidth=76dòng của bạn sẽ tự động trong khi gõ. Khiếu nại của tôi là nó không làm bất cứ điều gì đối với các dòng hiện tại đang được chỉnh sửa. Nhưng V}gqlà vô cùng hữu ích trong vấn đề đó. Vvào chế độ lựa chọn trực quan, }chọn xuống đoạn ngắt tiếp theo và gqthực thi bộ định dạng hiện tại trên nó (hoặc sử dụng gwđể gọi một cách rõ ràng bộ định dạng vi). Ngoài ra, {sẽ chọn lên trên. Bạn có thể chọn toàn bộ tài liệu và định dạng ggVGgqmặc dù có thể có một cách dễ dàng hơn. Lưu nó dưới dạng macro sử dụng @để làm cho nó dễ dàng hơn. Sử dụng vipgqđể fmt đoạn hiện tại.
ktbiz

94

Giải pháp của Michael là chìa khóa, nhưng tôi thường thấy tôi muốn định dạng lại phần còn lại của đoạn hiện tại; Đối với hành vi này, sử dụng gq}.


17
mở rộng về điều này - bạn có thể sử dụng gq <motion> để định dạng bất cứ điều gì bạn muốn.
Dan Schnau

1
Ngoài ra, tùy chọn 'nojoinspaces', ngăn hai khoảng trắng xuất hiện sau các khoảng thời gian khi các dòng được nối tại một ràng buộc câu. Tốt khi kiểu đánh máy của bạn là khoảng trắng đơn giữa các câu bằng tiếng Anh.
Alex Hirzel

36

Bạn có thể dùng gq với bất kỳ toán tử chuyển động. Ví dụ: nếu bạn chỉ muốn định dạng lại đến cuối dòng hiện tại (nghĩa là để bọc dòng mà con trỏ của bạn đang bật), bạn có thể sử dụnggq$

Bạn cũng có thể định dạng lại bằng cách chọn văn bản trong chế độ trực quan (sử dụng `v và di chuyển) và sau đó nhập gq.

Có những lựa chọn khác để buộc các dòng cũng bọc.

Nếu bạn muốn vim bọc các dòng của bạn trong khi bạn chèn văn bản vào chúng thay vì phải đợi đến cuối để cấu trúc lại văn bản, bạn sẽ thấy các tùy chọn này hữu ích:

:set textwidth=80
:set wrapmargin=2

(Không được theo dõi bên bởi wraplinebreak, chỉ định dạng lại văn bản hiển thị trên màn hình và không thay đổi văn bản trong bộ đệm)


9
Từ wrapmargintrợ giúp: Khi 'độ rộng văn bản' khác không, tùy chọn này không được sử dụng.
mmoya

21

Nhờ một nhận xét từ DonaldSmith tôi đã tìm thấy điều này, vì textwidthtùy chọn không định dạng lại dòng văn bản dài của tôi (tôi đang chuyển đổi chơi với chuyển đổi hex-to-byte):

:%!fold -w 60

Điều đó đã cải tổ toàn bộ tập tin (là một dòng đối với tôi) thành các dòng có độ dài 60.


1
Điều này là rất tốt đẹp. Tất cả các câu trả lời tập trung vào việc giới hạn độ rộng của một dòng khi một dòng được chia khoảng trắng thành các từ. Giải pháp này hoạt động cho các từ rất dài (trình tự DNA).
pedrosaurio

1
Đối với các url dài, đây là điều duy nhất tôi thấy có hiệu quả. Tôi đã mới về băng thông văn bản nhưng nó sẽ không phá vỡ các chuỗi không bị gián đoạn (thường là một điều tốt)
SkyLeach

13

Nếu bạn đang tìm kiếm một cách không Vim , luôn có các lệnh UNIX fmtpar .

Ghi chú:

  • Tôi không thể nhận xét về Unicode, nó có thể hoặc không thể hoạt động khác đi.
  • @nelstrom đã đề cập đến việc sử dụng partrong webcast của mình.

Đây là cách chúng tôi sẽ sử dụng cả hai cho ví dụ của bạn.

$ echo -e 'long line is long!\nshort' > 3033423.txt
$ cat 3033423.txt
long line is long!
short
$ fmt -w 13 3033423.txt
long line is
long!  short
$ par 13gr 3033423.txt
long line is
long! short

Để sử dụng từ bên trong Vim:

:%! fmt -w 13
:%! par 13gr

Bạn cũng có thể đặt :formatprgthành mệnh hoặc fmt và ghi đè gq. Để biết thêm thông tin, hãy gọi :help formatprgbên trong Vim.


9

Hầu như tôi luôn sử dụng gqtrong chế độ trực quan. Tôi nói với các sinh viên của mình rằng nó là viết tắt của "Gentlemens 'Quarterly", một tạp chí dành cho những người khó tính.

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.