Vim 80 quan tâm bố trí cột


417

Cách tôi thực hiện chỉ báo 80 cột trong Vim có vẻ không chính xác : set columns=80. Có lúc tôi cũngset textwidth , nhưng tôi muốn có thể nhìn thấy và dự đoán sự tràn dòng với set columnsphương án.

Điều này có một số tác dụng phụ đáng tiếc :

  1. Tôi không thể set numbersợ chia tách giữa các tệp có thứ tự số dòng khác nhau; tức là <100 tệp dòng và> = 100 tệp dòng sẽ yêu cầu hai loại khác nhauset columns giá trị do cột thêm được sử dụng cho hiển thị chữ số bổ sung.
  2. Tôi cũng bắt đầu các phiên Vim (g) mới thay vì chia các cửa sổ theo chiều dọc. Điều này là do vsplitbuộc tôi phảiset columns mỗi khi tôi mở hoặc đóng một khung, vì vậy bắt đầu một phiên mới sẽ ít rắc rối hơn.

Làm thế nào để bạn xử lý chỉ thị 80 ký tự khi bạn muốn set numbers, phân chia theo chiều dọc, vv?


60
Nó được coi là phong cách mã tốt trong nhiều vòng tròn; ví dụ: Hướng dẫn về Phong cách của Python (PEP8) đề xuất 79 dòng ký tự: python.org/dev/peps/pep-0008
cdleary

4
Đây không phải là "bạn phải có 80 dòng ký tự" tuyệt đối, nhưng nó giúp đọc dễ dàng hơn trên một số hệ thống, ví dụ như bất kỳ ứng dụng dựa trên bảng điều khiển nào không chạy trong cửa sổ giao diện điều khiển GUI có thể thay đổi kích thước.
Matthew Scharley

47
@davr: Đầu tiên, nó dễ đọc hơn. Một số nghiên cứu cho thấy độ dài dòng ngắn (76 ký tự một dòng) là dễ chịu nhất và nhanh nhất để được đọc trực tuyến. Bạn có biết điều này: đột nhiên mắt bạn nhìn sai dòng khi đọc không? Điều này hiếm khi xảy ra với 80 ký tự. Thứ hai, tôi thường chỉnh sửa hoặc khác biệt trực quan với hai tệp cạnh nhau trên màn hình rộng 1600 pixel của mình. Điều này chỉ hoạt động tốt nếu tệp không có dòng hơn 80 ký tự. Vì vậy, tôi thường định dạng lại các dòng dài trước khi tôi có thể làm việc hiệu quả.
nalply

25
@davr nó cực kỳ hữu ích để chỉnh sửa một số tệp cạnh nhau.
aehlke

2
Tôi tạo ra ít lỗi hơn trong cả mã C / C ++ và mã JS kể từ khi tôi chấp nhận độ rộng dòng 80 char (từ kiểu mã hóa kernel). Thỉnh thoảng tôi đôi khi làm tràn nó bởi một cặp vợ chồng, nhưng hiếm khi ...
Mark K Cowan

Câu trả lời:


586

Tôi có thiết lập này trong .vimrc của tôi:

highlight OverLength ctermbg=red ctermfg=white guibg=#592929
match OverLength /\%81v.\+/

Điều này làm nổi bật nền màu đỏ tinh tế cho văn bản vượt quá giới hạn 80 cột (dù sao cũng tinh tế trong chế độ GUI - ở chế độ đầu cuối, nó ít như vậy).


3
Ý tưởng tuyệt vời! Tôi đã thay đổi nó thành "ctermbg = darkred" và "guibg = # FFD9D9" để phù hợp hơn với nhu cầu của tôi (nền sáng trong gvim và tối ở chế độ cterm).
HS.

10
Tôi nghĩ rằng một sự điều chỉnh tinh tế là /\%81v.\+/ - vì một số lý do. * Làm nổi bật những nơi mà các ký tự không tồn tại.
cdleary

14
Tôi nghĩ rằng dòng này tốt hơn một chút cho regex khớp: khớp OverLạng /\%>80v.\+/ Điều này không làm nổi bật ký tự 'cuối dòng' và cũng trực quan hơn khi bạn chỉ đặt số thành những gì bạn muốn độ dài dòng được, không +1.
David Terei

8
Vì một số lý do, nó chỉ hoạt động trong bộ đệm mở đầu tiên đối với tôi (cửa sổ đầu tiên của tab đầu tiên) trong vim của tôi ...
lajarre

3
Kiểm tra stackoverflow.com/a/10993757/9822 nếu giải pháp này chỉ hoạt động trong bộ đệm đầu tiên của bạn.
Jesse Vogt

769

Kể từ vim 7.3, bạn có thể sử dụng set colorcolumn=80(set cc=80 viết tắt).

Vì các phiên bản trước không hỗ trợ điều này, nên tôi .vimrcsử dụng thay thế:

if exists('+colorcolumn')
  set colorcolumn=80
else
  au BufWinEnter * let w:m2=matchadd('ErrorMsg', '\%>80v.\+', -1)
endif

Xem thêm các tài liệu trực tuyến về các colorcolumntùy chọn .


26
Bạn thậm chí có thể tự động căn cứ giá trị của 'colorcolumn' trên 'textcreen' với một cái gì đó như: đặt cc = + 1
Graywh

1
đã ("colorcolumn") không làm việc cho tôi. Tôi đã phải sử dụng tồn tại ("& colorcolumn") thay thế.
SpoonMeiser

5
Rất hay, ngoại trừ việc vim <7.1.40 không hỗ trợ matchadd.
Greg Jandl

19
bạn cũng có thể thay đổi màu của cột bằnghighlight ColorColumn ctermbg=7
null_radix

2
Tài liệu cho tùy chọn này có tại vimdoc.sourceforge.net/htmldoc/options.html#%27colorcolumn%27
JohnTESlade

54

Đường ngắn hơn:

match ErrorMsg '\%>80v.\+'

8
Tôi thực sự thích điều này bởi vì nó không gây ô nhiễm bộ đệm của tôi với một đường thẳng đứng dài! (Y)
Ionică Bizău

ErrorMsglà một highlight-group. Có rất nhiều nhóm đánh dấu mặc định trong Vim mà bạn có thể sử dụng dựa trên mã hóa màu bạn muốn cho trường hợp này.
crisron

49

Tôi thích:

highlight ColorColumn ctermbg=gray
set colorcolumn=80

Tôi thích cái này. Tôi đã sử dụng màu đen thay vì màu xám và nó tinh tế hơn vì nền của tôi gần như màu đen nhưng không hoàn toàn.
Dao động Isopycnal

30

Câu trả lời của Simon Howard rất hay. Nhưng /\%81v.\+/không làm nổi bật các tab vượt quá cột 81. Vì vậy, tôi đã thực hiện một số điều chỉnh nhỏ, dựa trên những thứ tôi tìm thấy trên wiki VIM và lựa chọn màu sắc của HS ở trên:

highlight OverLength ctermbg=darkred ctermfg=white guibg=#FFD9D9
match OverLength /\%>80v.\+/

Và bây giờ VIM sẽ làm nổi bật bất cứ điều gì vượt quá cột 80.


2
Có thể muốn thêm guifg=whitevào cuối ở đó.
Dan Bechard

17

nhập mô tả hình ảnh ở đây

Cách tiếp cận tối giản, không quá đỉnh. Chỉ có ký tự thứ 79 của các dòng quá dài được tô sáng. Nó khắc phục một số vấn đề phổ biến: hoạt động trên các cửa sổ mới, các từ tràn được tô sáng đúng.

augroup collumnLimit
  autocmd!
  autocmd BufEnter,WinEnter,FileType scala,java
        \ highlight CollumnLimit ctermbg=DarkGrey guibg=DarkGrey
  let collumnLimit = 79 " feel free to customize
  let pattern =
        \ '\%<' . (collumnLimit+1) . 'v.\%>' . collumnLimit . 'v'
  autocmd BufEnter,WinEnter,FileType scala,java
        \ let w:m1=matchadd('CollumnLimit', pattern, -1)
augroup END

Lưu ý: lưu ý FileType scala,javađiều này giới hạn điều này đối với các tệp nguồn Scala và Java. Có lẽ bạn sẽ muốn tùy chỉnh điều này. Nếu bạn bỏ qua nó, nó sẽ hoạt động trên tất cả các loại tệp.


Tại sao bạn thêm một FileType scala,java? (không làm việc cho tôi)
Dorian

1
@Dorian nó giới hạn điều này đối với các kiểu tệp Scala và Java, bởi vì đó là các kiểu tệp mà tôi đang làm việc tại thời điểm đó. Tôi bỏ qua đề cập đến điều đó. Cập nhật câu trả lời.
Dominykas Mostauskis

Phông chữ nào bạn đang sử dụng trong ảnh chụp màn hình? Tôi thấy nó rất vừa mắt.
Rook

@Idigas: Đồng ý và tôi cảm thấy có lẽ Comic Sans có thể là một lựa chọn tồi khi tôi thành lập PuTTY :)
Mark K Cowan

Tôi không thể có được đoạn trích trong câu trả lời này để hoạt động trong Vim 7.4. (Tôi cũng đã xóa bộ lọc FileType.)
Mnebuerquo

13

Bạn cũng có thể vẽ đường để xem giới hạn 80:

let &colorcolumn=join(range(81,999),",")
let &colorcolumn="80,".join(range(400,999),",")

Kết quả:

nhập mô tả hình ảnh ở đây


13

Một cách hay để đánh dấu chỉ nhân vật đầu tiên đi ra khỏi giới hạn được chỉ định:

highlight ColorColumn ctermbg=magenta "set to whatever you like
call matchadd('ColorColumn', '\%81v', 100) "set column nr

Từ bài nói chuyện của Damian Conway .


7

Các phiên bản mới hơn của vim cho phép một :set numberwidth=xgiá trị, đặt chiều rộng của màn hình số dòng. Tôi không thực sự sử dụng gấp vv, vì vậy tôi sẽ không biết về điều đó mặc dù. Vẽ một đường thẳng đứng mỏng là vượt quá khả năng của một ứng dụng giao diện điều khiển. GVim có thể cho phép điều này (Tôi không sử dụng nó, vì vậy không thể nhận xét ở đó).


5

Tôi e rằng bạn đã đặt các ràng buộc cho tập hợp các giải pháp đó, tốt, để lại cho bạn tập hợp null.

Việc sử dụng :set textwidth=80sẽ khắc phục tất cả các sự cố bạn đã đề cập ngoại trừ việc bạn không thể dễ dàng thấy giới hạn dòng sắp tới. nếu bạn:set ruler , bạn sẽ bật hiển thị vị trí x, y trên thanh trạng thái mà bạn có thể sử dụng để xem bạn đang ở cột nào.

Ngoài ra, tôi không biết phải nói gì với bạn. Thật xấu hổ khi mất cột số, cột gấp và chia tách chỉ vì bạn phải :set columns=80.


Vâng, tôi sợ điều đó ... Tôi đã hy vọng sẽ có một cách ẩn để vẽ một đường thẳng đứng mỏng như trong các trình soạn thảo định hướng đồ họa nhiều hơn.
cdleary

5

Bạn có thể thử điều này:

au BufWinEnter * if &textwidth > 8
\ | let w:m1=matchadd('MatchParen', printf('\%%<%dv.\%%>%dv', &textwidth+1, &textwidth-8), -1)
\ | let w:m2=matchadd('ErrorMsg', printf('\%%>%dv.\+', &textwidth), -1)
\ | endif

Điều đó sẽ thiết lập hai điểm nổi bật trong mỗi bộ đệm, một cho các ký tự trong 8 cột trước bất cứ thứ gì bạn &textwidthđược đặt và một cho các ký tự nằm ngoài cột đó. Bằng cách đó bạn có một số mức độ dự đoán. Tất nhiên, bạn có thể điều chỉnh nó để sử dụng độ rộng khác nhau nếu bạn muốn dự đoán nhiều hơn hoặc ít hơn (mà bạn phải trả tiền dưới dạng mất tô sáng cú pháp trong các cột đó).


3

Chà, nhìn vào: các cột trợ giúp, nó không thực sự được tạo ra để gây rối.

Trong bảng điều khiển, nó thường được xác định bởi cài đặt bảng điều khiển (nghĩa là nó được phát hiện tự động); trong GUI, nó xác định (và được xác định bởi) chiều rộng của các cửa sổ gvim.

Vì vậy, thông thường bạn chỉ cần để bảng điều khiển và quản lý cửa sổ thực hiện công việc của mình bằng cách nhận xét set columns

Tôi không chắc ý của bạn là gì khi "xem và dự đoán tràn dòng". Nếu bạn muốn EOL được chèn vào khoảng cột 80, hãy sử dụng set textwidthhoặc set wrapmargin; nếu bạn chỉ muốn bọc mềm (tức là dòng được bọc, nhưng không có EOL thực tế), thì hãy chơi với set linebreakset showbreak.


2

cái này nằm ngoài trường bên trái nhưng nó là một bản đồ nhỏ để thay đổi kích thước phân tách hiện tại của bạn thành 80 ký tự nếu bạn có số dòng trên:

" make window 80 + some for numbers wide  
noremap <Leader>w :let @w=float2nr(log10(line("$")))+82\|:vertical resize <c-r>w<cr> 

1

Bạn có thể thử điều này để đặt kích thước cửa sổ để cho phép 80 ký tự của văn bản thực tế. Điều này vẫn không hoạt động với phân chia dọc mặc dù.

let &co=80 + &foldcolumn + (&number || &relativenumber ? &numberwidth : 0)

Điều này đòi hỏi vim 7+, 7.3 cho relativenumber.

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.