Tham gia các dòng bên trong đoạn văn trong vim


13

Giả sử bạn đã nhập một tài liệu dài trong vim với tự động ngắt dòng, vì vậy tất cả các dòng đã bị phá vỡ, giả sử, 79 ký tự. Bạn thậm chí có thể áp dụng định dạng cho toàn bộ tài liệu để phá vỡ tất cả các dòng ở độ dài đó.

Đoạn văn được phân ranh giới trong tài liệu của bạn bằng các dòng trống.

Bây giờ bạn quyết định bạn không muốn ngắt dòng trong các đoạn văn.

Làm thế nào bạn có thể loại bỏ tất cả các ngắt dòng trong các đoạn mà không loại bỏ hoàn toàn các ranh giới của đoạn?

Tôi đã thực hiện hack nhanh chóng và ngu ngốc này, nhưng đang tìm kiếm cách thích hợp.

:%s/^\s*$/@@@@@ - replace blank lines with @@@@@
ggVGgJ           - join all lines in the file
:%s/@@@@@/\r\r/g   - replace @@@@@ with line breaks

này, đừng gõ nó nếu giải pháp của bạn hoạt động và giải pháp của bạn hoạt động.
pdwalker

Câu trả lời:


12

Tôi nghĩ rằng điều này làm những gì bạn muốn: đảm bảo có một dòng trống ở cuối tệp, sau đó nối mọi đoạn (kết thúc bằng một dòng trống).

G:a

.
:g/^./ .,/^$/-1 join

Giải thích: trước tiên hãy đi đến cuối tệp và nối thêm một dòng trống với :a(có thể có một cách thanh lịch hơn để làm điều đó; tương tác, bạn có thể thay thế ba dòng đầu tiên bằng o<ESC>). Sau đó, đối với mọi dòng không trống chưa được xem xét ( :g/^./), hãy áp dụng joinlệnh cho phạm vi bắt đầu từ dòng đã chọn ( .) và kết thúc một dòng trước dòng trống tiếp theo ( /^$/-1).

Tùy chọn, :g/^$/dnếu bạn không muốn bất kỳ dòng trống nào vẫn còn (sau đó bạn có thể tắt -1).


Cảm ơn. Điều này đang trở nên rất gần với tôi, tuy nhiên, nó đang xóa các dòng trống giữa các đoạn. (Tôi đã thử fileformat unix và dos để xem nó có phải là một thứ Windows không). Ngoài ra, bạn có thể dịch các lệnh một chút? G đi đến dòng cuối cùng. : theo trợ giúp là "chắp thêm" nhưng tôi không chắc điều đó làm gì. Ngoài ra g / mẫu / cmd bạn có ở đó đã mất tôi. Lệnh gì?
dggoldst

@dggoldst: Tôi đã thay đổi lệnh để giữ lại các dòng trống. Ba dòng đầu tiên chỉ là thêm một dòng trống ở cuối tệp (nếu không thì đoạn cuối sẽ không được khớp). Lệnh cuối cùng là :g, áp dụng một lệnh cho tất cả các dòng khớp; xem :help :gvà có lẽ chủ đề này về cách :gứng xử khi bạn xóa ngắt dòng .
Gilles 'SO- ngừng trở nên xấu xa'

:$pu _ ở cuối đặt thanh ghi lỗ đen, kết quả là một dòng trống ở cuối.
SergioAraujo

12

Điều này nên làm điều đó:

:set tw=99999
gggqG

twđược đặt thành một số giá trị ít nhất bằng số lượng ký tự trong đoạn dài nhất. ggdi chuyển con trỏ đến dòng đầu tiên; gqlà mệnh lệnh định dạng lại; Gdi chuyển con trỏ đến dòng cuối cùng, yêu gqcầu định dạng lại từ vị trí con trỏ hiện tại đến dòng cuối cùng.


5
  1. Đặt con trỏ bên trong đoạn mong muốn

  2. Kiểu: vipJ

( vipđánh dấu đoạn hiện tại, Jtham gia tất cả các dòng)


2

Có thể không phải là cách sạch nhất để làm điều đó, nhưng đây là những gì tôi sẽ sử dụng:

ggqav}bgJ}wq999@a   # go to the top of the file (gg)
                    # start recording macro "a" (qa)
                    # select the entire paragraph (v})
                    # go back one word so as not to join the blank line (b)
                    # join the selected lines without spaces (gJ)
                    # go to first word of the next paragraph (}w)
                    # finish recording the macro (q)
                    # 999 times (arbitrary number of paragraphs to join)
                    # run macro "a" (@a)

( Hoạt động trong VIM 7.2. )

Tùy thuộc vào chính xác cách các đoạn được phân chia khi chúng được định dạng ban đầu, bạn có thể muốn thay thế gJlệnh (nối không có khoảng trắng) bằng Jlệnh (nối với khoảng trắng).

Số 999lượng tùy ý chỉ cần ít nhất là số lượng đoạn văn trong tệp - bạn có thể chọn số lượng lớn hơn nếu bạn muốn và không mất gì ngoài chu kỳ bộ xử lý. Giả sử một và chỉ một dòng trống giữa các đoạn, bạn có thể có được số lượng đoạn chính xác hơn bằng cách sử dụng:

:%s/^$//gn     # returns "999 matches on 999 lines"

Điều này làm việc cho tôi. Sẽ tốt hơn nếu thêm "gg" ở đầu để đặt con trỏ ở đầu tệp. Ngoài ra, sử dụng J thay vì gJ không khiến các từ riêng biệt trộn lẫn với nhau thành một. Đây chỉ có thể là trường hợp cho các giá trị "định dạng" của tôi, hiện đang làm tôi bối rối.
dggoldst
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.