Какой формат строки состояния по умолчанию?

14

Я прочитал о том, как обновить строку состояния vim здесь . И я могу успешно обновить его.

Но я хотел бы сохранить формат строки состояния vim по умолчанию и просто добавить к нему дополнительную информацию, например, размер файла, тип файла и т. Д.

Строка состояния Vim по умолчанию:

   <file-name>                              line_num,col_num        %file

Как я мог сделать следующее?

  1. Я хотел бы добавить информацию после имени файла
  2. Показать текущий формат строки состояния ( :set statuslineничего не отображается)

Я старался:

set statusline+=%y

Но это перезаписывает всю строку состояния и просто отображает тип файла ( %y).

Есть намеки?

холодный морской тропический воздух
источник
2
Если вы заинтересованы в Vim, сделайте заказ Vi и Vim !
Муру

Ответы:

15

Как сказал @muru, кажется, что невозможно точно смоделировать строку состояния по умолчанию, когда statuslineона установлена ​​в качестве кода для рендеринга, она делает вещи, которые не могут быть указаны в statuslineнастройке. Однако можно подобраться довольно близко. Вот разумное приближение того, как выглядит строка состояния по умолчанию, когда rulerона включена:

:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)

Основное отличие заключается в расположении номеров строк и столбцов. Если возможно смоделировать логику интервалов по умолчанию, я не смог найти способ сделать это. Возможно, это будет достаточно близко для ваших целей.

Я использую разделенную версию этого, .vimrcчтобы разместить информацию о строке состояния Syntastic в середине того, что выглядит как обычная строка состояния vim с линейкой:

" start of default statusline
set statusline=%f\ %h%w%m%r\ 
" NOTE: preceding line has a trailing space character

" Syntastic statusline
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*

" end of default statusline (with ruler)
set statusline+=%=%(%l,%c%V\ %=\ %P%)
Лоуренс Гонсалвес
источник
7

Код не устанавливает никакого значения в пустую строку состояния, а просто действует с использованием некоторых значений по умолчанию. Видите src/screen.c, функцияwin_redr_status() . Показанные элементы основаны на скомпилированных функциях, поэтому, чтобы восстановить точную строку состояния, нужно взглянуть на скомпилированные функции. Может быть проще использовать пример строки состояния, приведенной в :h statusline:

Examples:
Emulate standard status line with 'ruler' set 
  :set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P
Мур
источник
Что означает символ точки (.) После ширины (14) %-14.(%l,%c%V%)?
Shamaoke
5

ТЛ; др

: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%)
х-юри
источник