Làm thế nào để phá vỡ dòng dài trong vim?


12

Tôi có một tệp văn bản khá lớn được tạo thành từ các khối như

Short line.
Really long line.
Short line.

cách nhau bởi các dòng trống và tôi muốn sử dụng vim (trên Linux) để chia nhỏ các dòng dài và thu được các khối như

Short line.
This was
part of
a long line.
Short line.

Vấn đề của tôi với gq(và gw) là nó phản chiếu mỗi khối thành toàn bộ một đoạn, tức là nó không bảo toàn hai ngắt dòng trong mỗi khối và theo :help fo-tablebất kỳ gqtùy chọn định dạng nào sẽ cho phép tôi làm những gì tôi muốn. Tôi cũng nghĩ rằng tôi có thể đạt được mục tiêu của mình nếu tôi có thể định nghĩa các ký tự dòng mới là các dấu phân cách đoạn, nhưng theo :help paragraphđó là các ký tự cứng.

Chỉnh sửa: Tôi biết rằng tôi có thể sử dụng gqhoặc gwđịnh dạng từng dòng dài một, nhưng vì tệp của tôi chạy trên một vài nghìn dòng nên tôi đang tìm cách để tự động đạt được điều này.


Nhân tiện: Tôi đã tìm giải pháp cho vấn đề của mình trong tài liệu của vim, ở đây trên SU và trên web, sắp hết. Tôi sẽ sẵn sàng xóa câu hỏi này nếu tôi bỏ qua một cái gì đó rõ ràng.
AP


@ MartinSchröder: Vui mừng khi biết có một SE SE! Tuy nhiên, những câu trả lời đó không giải quyết được vấn đề của tôi, vì tôi đã biết gqgw. Tôi cũng mừng vì tôi đã không dừng ở đó, nếu không tôi sẽ không biết về :glệnh này. :)
AP

Câu trả lời:


16
:%norm! gww

Điều này áp dụng normallệnh gww(định dạng dòng hiện tại như gwtrên) trên toàn bộ bộ đệm, mà không tính đến ánh xạ tùy chỉnh (để tránh các vấn đề nếu ví dụ gwđã được ánh xạ sang thứ khác).

Xem

  • :help :%
  • :help :norm
  • :help gww

Sự thay thế này là theo đề xuất của Ben trong các bình luận, và đơn giản hơn so với giải pháp ban đầu, được lưu bên dưới vì nó có thể phù hợp hơn trong các trường hợp tương tự khác do khả năng khớp biểu thức chính quy. Tuy nhiên, trong trường hợp "khớp tất cả các dòng", nó là vũ phu không cần thiết.


Áp dụng gwwtrên mỗi dòng riêng lẻ trong bộ đệm theo chương trình:

:g/^/norm gww

Xem :help :g:help norm. ^khớp với phần đầu của một dòng, trong thực tế làm cho phần này khớp với mỗi dòng.

Người ta cũng có thể chọn chỉ chọn các dòng dài hơn ví dụ 60 ký tự với

:g/\%>60v/norm gww

(xem :help \%<) nhưng trong thực tế gwwsẽ chỉ định dạng lại các dòng dài hơn textwidthdù sao, vì vậy nó có thể không quan trọng lắm về cả tốc độ và kết quả.

(Tôi đang sử dụng vcho "cột ảo" thay vì ccho "cột", vì sau này thực sự tính toán một số lượng nhất định các byte vào dòng. Điều này có thể dẫn đến kết quả bất ngờ khi sử dụng mã hóa nhiều byte, thường là một lý do để thận trọng. Trong thực tế, đây không phải là vấn đề thực sự vì lý do tương tự như trên, liên quan đến việc đó gwwsẽ không định dạng lại các dòng ngắn hơn textwidthdù sao.)


Rõ ràng là :gthất bại mà không có một mô hình, vì vậy :g//norm gwwkhông hoạt động nhưng :g/.*/norm gwwkhông.
AP

@AP: Huh, làm việc cho tôi. Tôi đang sử dụng Vim 7.4.488-6 từ Debian Không ổn định.
Daniel Andersson

4
:g//sử dụng lại mẫu tìm kiếm cuối cùng; nếu không có, nó thất bại. Sử dụng :g/^/để áp dụng cho tất cả các dòng.
Ingo Karkat

@IngoKarkat: Ah, có ý nghĩa, vì mẫu cuối cùng của tôi trong các bài kiểm tra là độ dài dòng nhận biết tôi đã trình bày sau. Tôi sẽ cập nhật câu trả lời. Bạn có biết nơi nào trong trợ giúp hành vi "mẫu trống" này được đề cập không? Tôi không thể tìm thấy nó một cách tầm thường.
Daniel Andersson

Nhìn qua hướng dẫn, có lẽ ngụ ý rằng thông tin được cung cấp :help last-patterncho tìm kiếm thông thường cũng áp dụng cho :globallệnh.
Daniel Andersson

4

Vì bạn đã đọc hướng dẫn cho gqgwlệnh, tôi hình dung có thể bạn muốn một cái gì đó thuận tiện hơn bằng tay di chuyển đến đường dài và sau đó sử dụng gw0, gw$hay cách khác gwlệnh để chỉ định dạng dòng hiện tại.

Tôi không biết một cách dễ dàng để phá vỡ các dòng dài trong Vim qua một khối văn bản. Tuy nhiên, vì bạn đã đề cập rằng việc bạn sử dụng Vim trên hệ thống GNU / Linux, tôi khuyên bạn nên lọc văn bản của mình thông qua fmtlệnh GNU .

Đối với toàn bộ tệp:

:%!fmt --width=75 --split-only

Đối với đoạn hiện tại (sử dụng các tùy chọn ngắn):

:'{,'}!fmt -75 -s

Giải thích về các fmtlựa chọn liên quan là:

  • -w, --width=WIDTH- chiều rộng dòng tối đa (mặc định là 75 cột). Tùy chọn -WIDTHnày là một dạng viết tắt của --width=DIGITS(nếu sử dụng phiên bản rút gọn này, nó phải là tùy chọn đầu tiên).

  • -s, --split-only- chia dòng dài, nhưng không nạp tiền; đây là tùy chọn duy trì ngắt dòng cứng trước đó của bạn.


Cảm ơn đã đề cập fmt. Tôi thích chấp nhận câu trả lời khác, mặc dù, bởi vì nó chỉ yêu cầu vim.
AP

@AP Đừng lo lắng. Đó là một câu trả lời tuyệt vời và bản thân tôi đã chấp nhận nó. Cả nó và câu hỏi của bạn công đức upvotes.
Anthony Geoghegan

1

Từ:

Short line.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Short line.

Đặt điểm đánh dấu vào dòng "lorem ipsum" và nhấn gwwnăng suất (với textwidth=40sự rõ ràng):

Short line.
Lorem ipsum dolor sit amet, consectetur
adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat.
Short line.

mà đối với tôi có vẻ như những gì bạn đang yêu cầu. Nếu không, xin vui lòng làm rõ.

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.