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

Я боюсь Вы; d должны вырыть в исходный код плагина флэш-памяти. Одна опция была бы Скрежетом. Однако это, вероятно, стало бы довольно жестким.

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

14
22.08.2015, 15:45
3 ответа

Код не устанавливает никакого значения для пустой строки состояния, а просто действует, используя некоторые значения по умолчанию. См. 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
]
7
27.01.2020, 19:50

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

: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%)
15
27.01.2020, 19:50

tl;dr

: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%)
9
27.01.2020, 19:50

Теги

Похожие вопросы