tl; dr
:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
Mặc dù giải pháp được đề xuất của tôi không khác nhiều so với các câu trả lời khác, tôi muốn chia sẻ một lời giải thích chi tiết hơn.
hành vi ban đầu
Trước tiên, hãy tìm hiểu làm thế nào để vim
vẽ dòng trạng thái. Các chức năng chịu trách nhiệm là win_redr_status()
và win_redr_ruler()
.
vim
mất bộ đệm tên , cho biết thêm một không gian nếu có bất kỳ cờ đi theo (như [Help]
, [Preview]
, [+]
, [RO]
). Sau đó, nó thêm các cờ .
Thông thường nó phân bổ 18 ô ký tự cho thước. Nếu phần tên bộ đệm không khớp với phần còn lại của không gian có sẵn sẽ vim
cắt nó từ bên trái và thêm <
vào lúc bắt đầu.
Nếu có chỗ cho sơ đồ bàn phím , nó sẽ thêm nó vào cuối (căn lề phải).
Bây giờ, người cai trị. Nó bao gồm <row>,<col>-<virtcol>
một phần và vị trí tương đối (căn phải).
Ngoài ra còn có một hạn chế rằng phần với tên đệm phải mất ít nhất một nửa của chiều rộng .
giải pháp
Bây giờ hãy lấy giá trị được đề xuất bởi các tài liệu :
:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P
Ở đâu
%< - where to truncate the line if too long
%f - buffer name (path to a file, or something)
%h - help flag
%m - modified flag
%r - readonly flag
%= - separater between the left (buffer name) and the right (ruler) parts
%-14.(...%) - minimum field width == 14
%l - line
%c - column
%V - virtual column
%P - percentage
Vì vậy, đầu tiên %<
có thể được bỏ qua, vì tên đệm mặc định được cắt ngắn ở đầu. Sau đó, nó thiếu cờ xem trước ( %w
). Ngoài ra, khi cửa sổ 18 * 2
rộng hơn ký tự, phần bên phải chiếm hơn một nửa dòng trạng thái.
Vì vậy, ít nhất chúng ta có thể bỏ qua %<
và thêm %w
:
:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
Chúng ta có thể đi xa hơn và đảm bảo phần bên phải không chiếm quá một nửa dòng trạng thái:
set statusline=%!MyStatusLine()
function! MyStatusLine()
let l:w = min([14,winwidth(0)/2-3])
return '%f %h%w%m%r%=%-' . l:w . '.(%l,%c%V%) %P'
endfunction
Sau đó chúng ta có thể làm cho nó phụ thuộc vào các tính năng vim
được biên dịch với .
if has("quickfix")
...
endif
Nhưng tôi muốn nói rằng điều đó không thực tế và giải pháp trước đó sẽ đủ cho hầu hết các ý định và mục đích. Tuy nhiên, nếu giải pháp cuối cùng không hiệu quả với bạn, hãy cho tôi biết điều gì sai và tôi sẽ cố gắng đưa ra giải pháp tốt hơn.
Vấn đề với giải pháp được đề xuất bởi Laurence Gonsalves là nếu không có cờ, có hai khoảng trống giữa phần bên trái và phần bên phải:
:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)