Проверка аргументов функции bash

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усекает его слева и добавляет <в начале.

Если есть место для раскладки клавиатуры , она добавляется в конце(с выравниванием по правому краю ).

Итак, линейка. Он состоит из,-части и относительного положения(с выравниванием по правому краю ).

Также существует ограничение, согласно которому часть с именем буфера должна занимать как минимум половину ширины .

решение

Теперь возьмем значение, предложенное документами :

: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
29.06.2021, 08:40
1 ответ

Метасимволы регулярных выражений не должны заключаться в кавычки — "^[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.

0
28.07.2021, 11:21

Теги

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