тл; д-р
:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
Хоча запропоноване нами рішення не сильно відрізняється від інших відповідей, я хотів би поділитися більш детальним поясненням.
оригінальна поведінка
Спочатку давайте розберемося, як vimмалює лінію статусу. Відповідальними функціями є win_redr_status()і win_redr_ruler().
vimприймає буфер ім'я , додає простір , якщо є якісь -то прапори , щоб слідувати (як [Help], [Preview], [+], [RO]). Потім він додає до прапорам .
Зазвичай він виділяє 18 ліній клітинок для лінійки. Якщо частина імені буфера не відповідає решті наявного простору, vim скорочує його зліва і додає <на початку.
Якщо є можливість для клавішної карти , вона додає її в кінці (вирівнюється праворуч).
Тепер правитель. Він складається з <row>,<col>-<virtcol> частини та відносного положення (вирівнюється справа).
Там же обмеження , що частина з ім'ям буфера повинні по крайней мере , половину від ширини .
рішення
Тепер візьмемо значення, запропоноване документами :
:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P
де
%< - 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
Отже, спочатку %<його можна опустити, оскільки за замовчуванням назва буфера обрізається на початку. Потім у ньому відсутній прапор попереднього перегляду ( %w). Крім того, коли вікно менше, ніж 18 * 2символи, права частина займає більше половини рядка статусу.
Отже, принаймні ми можемо опустити %<та додати %w:
:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
Ми можемо піти далі і переконатися, що права частина не займає більше половини рядка статусу:
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
Тоді ми можемо зробити це залежним від особливостей, з яких vimбуло складено .
if has("quickfix")
...
endif
Але я б сказав, що це не практично, і попереднього рішення було б достатньо для більшості намірів і цілей. Однак якщо останнє рішення не працює для вас, скажіть, що не так, і я спробую придумати краще.
Проблема рішення, запропонованого Лоренсом Гонсальвесом, полягає в тому, що якщо немає прапорців, між лівою та правою частинами є два пробіли:
:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)