2012-06-14 26 views
23

Câu hỏi bên dưới có liên quan khi người ta muốn sao chép văn bản từ Vim sang một thứ khác, nói một trình duyệt web.Unwrap text in vim

Tôi thường có tùy chọn tw=80 khi tôi chỉnh sửa tệp, đặc biệt là tệp LaTeX. Tuy nhiên, nói rằng tôi muốn soạn một email trong Vim với tùy chọn tw=80, và sau đó tôi muốn sao chép và dán nó vào một trình duyệt web. Trước khi tôi sao chép và dán, tôi muốn unwrap văn bản để không có một dòng-break mỗi 80 ký tự hay như vậy. Tôi đã thử tw=0 và sau đó gq, nhưng điều đó chỉ kết thúc văn bản ở độ rộng mặc định là 80 ký tự. Câu hỏi của tôi là, làm cách nào để mở văn bản để mỗi đoạn email của tôi xuất hiện dưới dạng một dòng? Có một lệnh dễ dàng cho điều đó không?

Trả lời

39

Đến đầu bạn đoạn và nhập:

v i p J

Đối với toàn bộ tài liệu kết hợp nó với định mức:

:%norm vipJ 

Lệnh này sẽ chỉ mở các đoạn văn. Tôi đoán đây là hành vi bạn muốn.

+0

Cảm ơn! Tôi cho rằng đây là phương pháp dễ nhất có sẵn sau đó? Không có gì làm điều này cho toàn bộ tài liệu trong một đi tôi đoán? – Ray

+2

@Ray Tôi đã chỉnh sửa câu trả lời của mình và thêm lệnh để thực hiện cho toàn bộ tài liệu. –

+1

Tốt hơn nên sử dụng lệnh ': normal' với'! '-specifier trong trường hợp này để tránh xung đột với ánh xạ tùy chỉnh. –

10

Vì việc nối các dòng đoạn bằng lệnh chế độ thông thường đã được đáp ứng bởi một câu trả lời khác, hãy xem xét giải quyết cùng một vấn đề bằng các lệnh Ex2 có định hướng dòng.

Giả sử con trỏ nằm ở dòng đầu tiên của đoạn văn. Sau đó, để mở nó ra, người ta chỉ có thể tham gia các dòng tiếp theo sau lên đến dòng cuối cùng của đoạn đó. Một cách thuận tiện để làm điều đó là chạy lệnh :join được thiết kế chính xác cho mục đích. Để xác định phạm vi đường cho lệnh đến hoạt động, bên cạnh dòng xuất phát rõ ràng là dòng hiện tại, nó là cần thiết để chỉ định dòng kết thúc. Nó có thể được tìm thấy bằng cách sử dụng mẫu khớp với phần cuối của một đoạn, đó là ký tự dòng mới theo sau là dòng trống. Như vậy, dịch định nghĩa nói với cú pháp Ex-lệnh, chúng tôi được:

:,-/\n$/j 

Đối với tất cả các đoạn văn được tháo, chạy lệnh này trên dòng đầu tiên của mỗi đoạn văn. Một công cụ hữu ích để nhảy qua chúng lặp lại một chuỗi hành động nhất định là lệnh :global. Khi :global quét các đường từ từ trên xuống dưới, dòng đầu tiên của đoạn văn chỉ là dòng không trống đầu tiên trong số những dòng còn lại chưa được xử lý. Quan sát này cung cấp cho chúng tôi lệnh

:g/./,-/\n$/j 

hiệu quả hơn các đối số chế độ Bình thường đơn giản của nó.

+0

Có một lỗi nhỏ trong lệnh này: nếu bạn có một đoạn văn, nó sẽ được dán vào đoạn tiếp theo. –

+1

@Omar: Tuyệt vời, cảm ơn bạn! Câu trả lời đã được cập nhật để giải quyết trường hợp này. –

+0

Tôi đã làm nó như trong câu trả lời của @ fatih, nhưng vì một số lý do mà tham gia đoạn văn rất ngắn với nhau, vì vậy tôi đến đây tìm kiếm lựa chọn thay thế và điều này hoạt động tuyệt vời, cảm ơn bạn! – dbmrq

4

Vấn đề với :%norm vipJ là nếu bạn có các dòng liên tiếp ngắn hơn 80 ký tự, nó cũng sẽ nối với chúng, ngay cả khi chúng được phân tách bằng một dòng trống.Ví dụ ví dụ sau:

# Title 1 

## Title 2 

sẽ trở thành:

# Title 1 ## Title 2 

Với câu trả lời ib của, vấn đề là với danh sách:

- item1 
- item2 

trở thành:

- item1 - item2 

Cảm ơn đến this forum post Tôi khám phá ra một phương pháp đạt được điều này mà tôi được bao bọc trong một chức năng mà làm việc tốt hơn nhiều đối với tôi vì nó không làm được điều đó:

function! SoftWrap() 
    let s:old_fo = &formatoptions 
    let s:old_tw = &textwidth 
    set fo= 
    set tw=999999 " works for paragraphs up to 12k lines 
    normal gggqG 
    let &fo = s:old_fo 
    let &tw = s:old_tw 
endfunction 

Edit: Cập nhật phương pháp này bởi vì tôi nhận ra nó đã không làm việc trên một thiết lập Linux. Loại bỏ các dòng có chứa fo nếu phiên bản mới hơn này không hoạt động với MacVim (Tôi không có cách nào để kiểm tra).