Word Wrap in Vim (duy trì thụt lề)


92

Tôi vừa mới xem bài đăng này mô tả cách gói toàn bộ từ trong vim. Giải pháp được chấp nhận là:

:set formatoptions=l
:set lbr

Lấy văn bản này (các tab được hiển thị dưới dạng \ t):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will wr|ap here                            
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Điều này thực hiện một hành vi như thế này (các tab được hiển thị dưới dạng \ t):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|wrap here                              |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Tuy nhiên, tôi muốn xác định lại chức năng này. Tôi muốn dòng được bọc có cùng số tab phía trước nó mà dòng ở trên có cộng một. I E:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|\t\t\twrap here                        |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Bất kỳ ý tưởng?


34
+1 cho nỗ lực làm cho câu hỏi rõ ràng nhất có thể.
Jeffrey Jose

Bạn muốn văn bản được bọc mềm ở mép cửa sổ hoặc bọc cứng khi dòng đạt đến một độ dài nhất định? Tôi nghĩ rằng bạn muốn đóng gói cứng (nơi một dòng mới được chèn vào văn bản của bạn sau từ "sẽ"), nhưng rất khó để nhận ra từ các ví dụ của bạn.
Bill Odom

@Bill, tôi chủ yếu quan tâm đến softwrapping nhưng một giải pháp hardwrapping cũng sẽ được chấp nhận.
sixtyfootersdude

1
Chức năng bạn muốn hiện không được tích hợp vào Vim. Tuy nhiên, có một bản vá sắp xuất hiện: groups.google.com/group/vim_dev/web/vim-patches (đó là # 15, "Thụt lề chính xác các đường được bọc").
Bill Odom

Liên quan: VimCasts đã có một tập hay về việc sử dụng các tiện ích unix bên ngoài để xử lý sự cố này: vimcasts.org/e/18
Damien Wilson

Câu trả lời:


18

Bản vá lỗi có những gì bạn đang tìm kiếm. Tôi đã áp dụng thành công nó bằng cách sử dụng các hướng dẫn được tìm thấy trong chủ đề này:

Patch Vim với bản vá lỗi trên OS X với Homebrew

Cụ thể là công thức Homebrew của echristopherson.

Tôi biết chủ đề này đã cũ nhưng nó phổ biến trên google và tôi đã xem qua nó nhiều lần khi cố gắng tìm giải pháp.

CHỈNH SỬA: Bản vá này hiện được bao gồm với vim như bản vá 7.4.338. Xem: https://retracile.net/blog/2014/07/18/18.00

Trên Yosemite (Mac OS X), tôi đã sử dụng lệnh snowbound với hombrew:

brew install macvim --with-features=huge --override-system-vim --HEAD 

bản vá dường như không hoạt động với macvim mới nhất trên homebrew? @ Exit42 bạn làm thế nào để nó hoạt động?
snowbound

nvm. Tôi biên soạn MacVim với homebrew chảy máu cạnhbrew install macvim --with-features=huge --override-system-vim --HEAD
vì tuyết

1
Xem câu trả lời của tôi bên dưới: stackoverflow.com/questions/2828174/… Không cần bản vá trong các phiên bản vim mới hơn.
JoshuaD

26

Điều này đã không hoạt động khi câu hỏi được hỏi ban đầu, nhưng kể từ ngày 25 tháng 6 năm 2014, điều này sẽ hoạt động. (Giả sử bạn cập nhật vim của mình lên phiên bản mới hơn ngày đó)

Thêm vào .vimrc của bạn:

" Indents word-wrapped lines as much as the 'parent' line
set breakindent
" Ensures word-wrap does not split words
set formatoptions=l
set lbr

Và đó là nó!

-

Một số người (bao gồm cả tôi) chia sẻ một tệp .vimrc trên nhiều máy tính. Trong trường hợp đó, điều quan trọng là phải có dòng này mạnh mẽ (để tránh các thông báo lỗi gây phiền nhiễu). Điều này tốt hơn một chút:

if has("patch-7.4.354")
    " Indents word-wrapped lines as much as the 'parent' line
    set breakindent
    " Ensures word-wrap does not split words
    set formatoptions=l
    set lbr
endif

Bằng cách này, nếu bạn đang sử dụng phiên bản vim cũ hơn, bạn sẽ không nhận được thông báo lỗi.


Thật thú vị, điều này hoạt động trên vim 7.4 của cygwin nhưng không hoạt động trên vim 7.4 của unbuntu của tôi. Tôi đoán nó cần được phổ biến rộng rãi hơn một chút, nhưng sẽ sớm chứng kiến ​​sự áp dụng toàn cầu.
JoshuaD

1
Hoạt động trong Vim 7.4 @ ArchLinux.
Andy Mikhaylenko

1
Bạn có thể sử dụng thử nghiệm này để thay thế:if has("patch-7.4.354")
Lawrence Kesteloot

Điều này không trả lời câu hỏi liên quan đến nhận xét của OP: cùng một số tab (...) cộng với một . Theo ý kiến ​​của tôi, điều này cũng rất quan trọng, bạn có thể thường muốn giữ thụt lề bổ sung và dịch chuyển quang học các phân đoạn được bao bọc sang bên phải (danh sách được sắp xếp chặt chẽ, ghi chú, v.v.);
đẫm máu

8

Điều tốt nhất bạn sẽ nhận được là showbreaktùy chọn sẽ đặt một chuỗi cố định trước mỗi dòng được bọc (tôi sử dụng set showbreak=...).


@AlexanderBird Theo :help 'showbreak', không, bạn không thể - showbreakchỉ là một chuỗi.
Rory O'Kane

4

Tôi đồng ý với câu trả lời rằng 'showbreak' là lựa chọn tốt nhất. Showbreak thường không cho phép bạn đặt các ký tự không in (ví dụ: dấu cách hoặc tab) vào chuỗi showbreak, vì vậy thường được sử dụng, nó sẽ chỉ cung cấp cho bạn một chỉ báo dọc theo lề trái, tức là không có thụt lề thực. Điều này không tuyệt vời, vì mục tiêu chính của OP, tôi nghĩ, là cung cấp cho các đường được bao bọc một thụt lề để giữ cho chúng không lộn xộn khu vực lề trái và trông giống như các đường của riêng chúng.

Vì vậy, một cách để thêm thụt lề (xấu xí) bằng cách sử dụng showbreak là chỉ sử dụng nhiều ký tự, .eg, ": set showbreak => --------------->". Điều này dẫn đến một cái gì đó giống như sau:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|>--------------->wrap here             |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Một giải pháp thay thế tốt hơn có thể là sử dụng các ký tự khoảng trắng không ngắt (giả sử phiên bản Vim của bạn được bật unicode), mỗi ký tự trong số đó có thể được nhập vào chuỗi showbreak bằng cách sử dụng chuỗi khóa ctrl-v, 160. Bằng cách đó, bạn có thể nhập chuỗi showbreak trống ở phía bên trái và có vẻ như là một thụt lề thực sự. Ví dụ: ": set showbreak =............. >>" where each '.' trong lệnh thực sự là một ký tự khoảng trắng không ngắt được nhập bằng cách nhấn ctrl-V, 160. Bằng cách đó, bạn sẽ có một bọc được thụt vào độc đáo, như thế này:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|            >>wrap here                |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Bạn vẫn không có bất kỳ khả năng nào để thay đổi mức độ thụt lề theo thụt lề của dòng trước đó, nhưng ít nhất bạn có được thụt lề rõ ràng của các dòng được bao bọc mà không có nhiều lộn xộn trực quan dọc theo lề trái của cửa sổ. Vẫn có thể có sự nhầm lẫn nếu thụt lề của một dòng được bao bọc nhỏ hơn thụt lề của dòng thực tế, nhưng điều này có thể tránh được bằng cách làm cho "thụt lề" showbreak khá lớn (tức là lớn hơn bất kỳ thụt lề nào thường thấy trong mã của bạn ) nhưng vẫn đủ nhỏ để cung cấp đủ không gian cho phần văn bản dễ đọc. Đối với nhiều mục đích sử dụng, tôi nghĩ rằng khoảng cách giữa 40 hoặc 50 khoảng cách showbreak sẽ làm được điều này khá tốt.


7
Bạn có thể đặt dấu cách trong showbreak bởi thoát họ: :set showbreak=\ \ \ \ . Tuy nhiên, vẫn không hoạt động cho các tab.
Bill Odom
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.