ТЛ; др
: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
Итак, 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%)