: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
усекает его слева и добавляет <
в начале.
Если есть место для раскладки клавиатуры , она добавляется в конце(с выравниванием по правому краю ).
Итак, линейка. Он состоит из
части и относительного положения(с выравниванием по правому краю ).
Также существует ограничение, согласно которому часть с именем буфера должна занимать как минимум половину ширины .
Теперь возьмем значение, предложенное документами :
: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
Таким образом, first %<
можно опустить, так как по умолчанию имя буфера обрезается в начале. Затем отсутствует флаг предварительного просмотра(%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%)
Метасимволы регулярных выражений не должны заключаться в кавычки — "^[0-9]+$"
пытается сопоставить ^[0-9]+$
как строку.
man bash
говорит
An additional binary operator, =~, is available...
... Any part of the pattern may be quoted to force the quoted portion to be matched as a string.