Gói mềm ở 80 ký tự trong Vim trong cửa sổ có chiều rộng tùy ý


126

Tôi muốn sử dụng khả năng gói mềm của Vim ( :set wrap) để bọc một số mã ở 80 ký tự, bất kể chiều rộng cửa sổ thực tế của tôi.

Tôi chưa thể tìm ra cách để làm điều này - tất cả các gói mềm dường như được gắn với chiều rộng của cửa sổ

  • textwidthwrapmargincả hai đều được gói cứng (họ chèn các ký tự dòng mới vào tệp)
  • chia dọc thành nhiều cửa sổ và sử dụng :vertical resize 80(có thể :set breakat=để cho phép ngắt trên bất kỳ ký tự nào) trên một trong số các loại công việc đó (mặc dù nó hơi bị hack), nhưng bị phá vỡ khi sử dụng :set numbervì số dòng chiếm một số lượng cột khác nhau (tùy thuộc trên chiều dài tập tin) và đây là một phần của 80.

Có cách nào để làm điều này trong vim? Nó không có vẻ hứa hẹn, theo các nguồn khác .

Ngay bây giờ, xấp xỉ của tôi chỉ là có /^.\{80}\zs.\+tìm kiếm mặc định của tôi để nó ít nhất được tô sáng. Tôi đã nghĩ về việc thêm một :syntaxmục cho nó, nhưng nó đã bị hỏng khi nó chồng lấp các mục cú pháp khác, vì vậy tôi đã bỏ ý tưởng đó.


Trên thực tế, làm thế nào bạn thiết lập một tìm kiếm mặc định?
thethinman

Câu trả lời:


37

Bạn có thể

  • đặt chiều rộng tối thiểu lớn cho cột số dòng qua :set numberwidth=6
  • sau đó bạn có thể thay đổi kích thước cửa sổ của mình bằng :set columns=86(hoặc bằng chuột) thành kích thước phù hợp.

Nếu bạn chỉnh sửa một tệp có một triệu dòng trong đó, bạn có thể gặp sự cố, nhưng điều đó là không thể. Bạn đang lãng phí 6 cột màn hình bất động sản theo cách này quá. Vì vậy, vẫn còn tất cả các loại vấn đề.

Bạn có thể đánh dấu qua cột thứ 80 bằng cách sử dụng :matchnhư nó nói ở đâyđây .

Ngoài ra tôi không thể thấy bất cứ cách nào để làm điều này. Có vẻ như đó là một tính năng tốt mặc dù.


Thật không may, vim không giữ cài đặt cột nếu cửa sổ bị thay đổi kích thước. Điều này dẫn đến một tình huống không may với các trình quản lý cửa sổ ốp lát, nơi không có cách nào tốt để bọc mềm đến 80 cột nếu cửa sổ quá rộng.
trọng lực

Điều này hoạt động, nhưng nó không dính. Tôi đoán bước tiếp theo là thiết lập autocmd để giữ các cột ở kích thước mong muốn mới cho các kiểu tệp bạn muốn.
xer0x

1
Đây là câu trả lời đúng ở chỗ nó xác nhận bạn không làm điều đó. Và tôi chắc chắn tôi không phải là người duy nhất không muốn thay đổi kích thước cửa sổ đầu cuối của mình chỉ vì điều này. Tôi muốn nhiều chiều rộng hơn cho việc sử dụng không vim.
Sridhar Sarnobat

20

Thử cái này:

set columns=80
autocmd VimResized * if (&columns > 80) | set columns=80 | endif
set wrap
set linebreak
set showbreak=+++

Bạn có thể loại bỏ if (&columns > 80) |nếu bạn luôn muốn 80 cột.


Trên thiết bị đầu cuối iTerm của tôi, điều này làm cho cửa sổ nhỏ hơn. Tôi không chắc đó có phải là vấn đề với môi trường của tôi không (tôi thấy bạn đang làm gì đó với tự động thay đổi kích thước), nhưng nếu không thì điều này là không mong muốn. Nhờ đề nghị mặc dù.
Sridhar Sarnobat

Autocmd đã làm việc hoàn hảo cho tôi (sử dụng thiết bị đầu cuối guake).
mzcarlos

Hoạt động như một bùa mê với Tmux + NeoVim trong Alacritty.
meh

16

Tôi không có giải pháp cho bọc mềm, nhưng để đánh dấu một cột, kể từ Vim 7.3 (phát hành 2010-08-15) :set colorcolumn=80 sẽ làm nổi bật cột 80. Màu sắc sẽ phụ thuộc vào tệp cú pháp của bạn.

Xem mối quan tâm bố trí cột Vim 80 , :h colorcolumn.


Trích dẫn không phải là URL hợp lệ vì vậy nó có ý nghĩa. Tên neo không được chứa các ký tự URL không hợp lệ, SO không nên sửa lỗi của các nhà phát triển trang web khác.
Shadow Wizard là Ear For You

1
Shadow Wizard đang đề cập đến một bản sửa đổi trước đây cho câu trả lời của tôi, trong đó tôi tự hỏi về cách đặt dấu ngoặc đơn trong các URL bằng Markdown. Sau đó, ib đề xuất sử dụng% 27, hoạt động. Cảm ơn, ib.
ftvs

Gần đây đã phát hiện ra làm thế nào để chỉ làm nổi bật các cột qua 80 ~:let w:eighty_column_match = matchadd('ColorColumn', '\%81v.\+', 100)
lan man

Các colorwidthđiều là hữu ích vì các lý do khác, vì vậy tôi rất vui vì bạn được đăng này.
Sridhar Sarnobat

2

Bạn đã thử 'linebreak'chưa

        *'linebreak'* *'lbr'* *'nolinebreak'* *'nolbr'*
  'linebreak' 'lbr' boolean (default off)
        local to window
        {not in Vi}
        {not available when compiled without the  |+linebreak|
        feature}
If on Vim will wrap long lines at a character in 'breakat' rather
than at the last character that fits on the screen.  Unlike
'wrapmargin' and 'textwidth', this does not insert <EOL>s in the file,
it only affects the way the file is displayed, not its contents.  The
value of 'showbreak' is used to put in front of wrapped lines.
This option is not used when the 'wrap' option is off or 'list' is on.
Note that <Tab> characters after an <EOL> are mostly not displayed
with the right amount of white space.

3
Hmm ... nhưng breakatchỉ là một mô hình (không phải chiều dài), vì vậy tôi không thấy làm thế nào tôi có thể sử dụng điều này để buộc bọc mềm ở 80 ....
hung hăng

Hmmm, tôi tự hỏi liệu có thể tạo một biểu thức chính quy phù hợp với các từ có tổng độ dài (cộng với khoảng trắng ở giữa) nhỏ hơn hoặc bằng n ký tự không.
Shane Creighton-Young

@ ShaneCreighton-Young: ^.{,80}\bsẽ làm cho những người sử dụng tab mềm / mở rộng. Lưu ý rằng perl regex, không phải vim regex.
Mark K Cowan

0

Không có cách nào tốt để làm điều đó. Chúng ta có thể hack một tạm setlocal softwrapvới autocmdnếu chúng ta sửa đổi @eborisch câu trả lời. Nếu chúng ta thay đổi kích thước mỗi lần chúng ta nhập bộ đệm và chúng ta thay đổi kích thước theo một độ dài cụ thể khi biến cục bộsoftwrap được đặt, chúng ta sẽ có hành vi mong muốn.

Giả sử rằng chúng ta muốn bọc mềm đến 80 cột, chúng ta có thể viết như sau .vimrc.

augroup softwrap
    autocmd VimResized * if (exists('b:softwrap') && &columns > 80) | set columns=80 | endif
    autocmd BufEnter * set columns=999
augroup END

Để bật chế độ cho một bộ đệm cụ thể, hãy sử dụng các lệnh sau:

let b:softwrap=1
set columns=80

Điều này chỉ biến đổi các tập tin của tôi thành vô nghĩa.
Suuuehgi
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.