Trong VIM, làm cách nào để chia một dòng thực sự dài thành nhiều dòng?


169

Giả sử tôi có một dòng siêu dài trong trình chỉnh sửa VIM (khoảng hơn 300 ký tự). Làm thế nào tôi có thể chia nó thành nhiều dòng để ranh giới từ gần như phá vỡ ở 80 ký tự?

Thí dụ:

This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line

đến

This is a really long line 
This is a really long line
This is a really long line
This is a really long line
This is a really long line
This is a ...

Câu trả lời:


254

Vim làm điều này rất dễ dàng (ngắt dòng ở ranh giới từ).

gq{motion} % format the line that {motion} moves over
{Visual}gq % format the visually selected area
gqq        % format the current line
...

Tôi khuyên bạn nên kiểm tra :help gq:help gw.

Ngoài ra, cài đặt độ rộng văn bản ( tw) sẽ cung cấp cho bạn ngắt dòng tự động khi vượt quá trong khi nhập. Nó cũng được sử dụng gq, mặc dù nếu vô hiệu hóa gqphá vỡ kích thước cửa sổ hoặc 79 tùy thuộc vào cái nào đến trước.

:set tw=80

Bằng cách cài đặt các tùy chọn định dạng để bao gồm chiều rộng văn bản, vim sẽ tự động ngắt ở cài đặt tw.

:set fo+=t

5
Vì vậy, đối với trường hợp của bạn, gqlệnh sẽ là <ESC>(thoát khỏi chế độ Chèn / Thay thế / vv), sau đógq80l
MidnightLightning

6
Điều này ngược lại với Ctrl + j (kết hợp nhiều dòng thành một).
Yzmir Ramirez

9
Vim không bao giờ hết làm tôi ngạc nhiên. Đây là vàng nguyên chất.
Jondlm

10
chỉ dành cho người tiếp theo tìm thấy điều này, gq chỉ không tách một dòng văn bản vững chắc, nó cần khoảng trắng để thực hiện công việc của mình
Stringy05

2
[chạy gqq] aaaahhh, đó là đẹp
underscore_d

85

Đầu tiên hãy đặt vim của bạn để nó hiểu rằng bạn muốn 80 ký tự:

:set tw=80

Sau đó, hilight dòng:

V

và làm cho vim định dạng lại nó:

gq

17

Điều này không thực sự liên quan đến VIM, nhưng bạn có thể sử dụng chương trình fmt như trong

$ fmt myfile

38
:%! fmt% "Có thể khiến nó liên quan đến vim :)
Maxim Sloyko

2
Hữu ích cho vi, mặc dù tôi thích gqq trên vim.
WhyNotHugo

13

Đối với các dòng văn bản rắn làm nổi bật khu vực bằng v ở chế độ bình thường, sau đó nhấn

:s/\v(.{80})/\1\r/g

Điều này sẽ thêm một dòng mới vào cuối mỗi ký tự thứ 80.

:s/       replaces within the current select
\v        uses regular expressions
(.{80})   selects 80 characters & placed them into group one
\1\r      replaces group one with group one and a newline

Đây là giải pháp duy nhất hoạt động cho chuỗi base64 dài.
jviotti

6

Nếu bạn đang ở * nix, bạn có thể có foldsẵn.

Chọn khu vực bạn muốn sử dụng v, sau đó bạn có thể ngắt trên các khoảng trắng ở chiều rộng 80 bằng cách sử dụng:

!fold --spaces --width=80

Điều này về cơ bản giống như sử dụng gq.

Tuy nhiên, nếu bạn chỉ muốn ngắt ở ký tự 80 và không bị giới hạn ở khoảng trắng, bạn có thể sử dụng:

!fold --width=80

Nếu bạn muốn nó với một lần nhấn phím, chỉ cần đặt ánh xạ - Tôi đã sử dụng

vmap <f1> !fold --width=80<CR>


Đây là câu trả lời hoạt động cho các chuỗi dài không được phân tách bằng khoảng trắng. Trên macOS, bạn có thể cần phải sử dụng gprint thay vì gấp.
Aaron D

trên mac os, tôi phải làm! gấp -w 80
user674669

5

Để phân chia các dòng dài trong tài liệu hoàn chỉnh mà không xóa các ngắt dòng đã có, hãy sử dụng:

:set formatoptions+=w
:set tw=80
gggqG

4

Tôi cần định dạng lại toàn bộ tệp chứ không phải một dòng. Như Wernsey chỉ ra, tôi có thể đã sử dụng 'fmt', nhưng trình tự sau trong vim cũng thực hiện thủ thuật này (mượn từ các câu trả lời khác nhau ở đây):

<ESC>
:setl tw=80 fo=t
1GVGgq

3

Vì nhanh và khó chịu, có thể thử bản đồ sau:

map q 080lwbels<CR><ESC>

mà nói:

  • bắt đầu vị trí thứ 0 của dòng
  • di chuyển đến char thứ 80 bên phải,
  • đi đến đầu từ tiếp theo
  • quay lại từ trước
  • đi đến cuối từ hiện tại,
  • đi một char ngay, và
  • thay thế một CR cho char đó.

Sau đó nhấn q và CR sẽ chia dòng thành các đoạn trên ranh giới từ.


0

Tôi đã chèn thủ công '\' (và sau đó CR / tab để định dạng) trong mỗi LONGLINE sau khoảng trắng cuối cùng nhưng trước cột 80. Điều đó có nghĩa là:

1 this is a long, long, line

bây giờ trông như

1 this is a long, \
        long line

và biên dịch bình thường.

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.