Вопрос или проблема
Итак, что я хочу сделать, это немного сложно объяснить, так что потерпите…
Я сделал свою собственную строку состояния в Vim. Я знаю, что существуют Airline и Powerline, но это больше личное стремление узнать больше о “Vimscripting” и о том, как именно работает строка состояния.
Обычно, когда я изменяю размер терминального эмулятора по горизонтали, сегменты строки состояния “сжимаются” определенным образом, например, сжимаются слева, где я помещаю имя файла, флаги изменения/только для чтения, формат файла и тип файла. Что я хотел бы сделать, так это каким-то образом контролировать, как эти элементы сжимаются. Я хотел бы, чтобы элементы справа “сжимались” или обрезались вместо этого. Я приложу некоторые изображения, потому что считаю, что визуальная справка здесь ключевая для того, чтобы помочь другим понять, что я хочу…
Когда я изменяю размер окна таким образом (например, для вертикально ориентированного монитора или экрана в портретном режиме), я хочу, чтобы имя файла было всегда видно, и чтобы вместо этого сжимались значения dec/hex. В основном, все элементы справа должны сжиматься, а не слева. Есть ли способ сделать это?
Вот часть кода в моем Vimrc, которая делает все это:
""" Строка состояния с линейкой
if has('statusline') && &t_Co > 2 || has('gui_running')
" Определить линейку (показывается только когда строка состояния отключена)
" Содержимое линейки: байт, строка, выбранные строки, колонка
" номер страницы, слова и процент
let &rulerformat="%100(%=%*%)" " Установить ширину линейки на 100 символов
let &rulerformat.=" Byte %o/%{getfsize(expand(@%))},"
let &rulerformat.=" Line %{line('v')}-%{line('.')}/%L,"
let &rulerformat.=" L.Sel. %{abs(line('.') - line('v')) + 1},"
let &rulerformat.=" Col %c%V,"
let &rulerformat.=" Pg %(%{winheight(0) ? line('.') / winheight(0) + 1 : 0}%)"
let &rulerformat.="/%(%{winheight(0) ? line('$') / winheight(0) + 1 : 0}%),"
let &rulerformat.=" %{wordcount().words} Words"
let &rulerformat.=" %5.P"
let &rulerformat.=" %*"
" Определить строку состояния
func s:StatusLine()
" Очистить текущую строку состояния
set statusline=
" Установить цвет на User1, добавить полный путь к файлу с возможными флагами.
" Произвольная длина в 65 символов для имени файла достаточна.
" Большинство имен файлов в файловой системе поддерживают 255 символов ASCII.
" Учтите, что технически имя файла включает в себя строку с расширением файла.
" Часть `%(%m%r%)` занимает дополнительные 0-7 символов.
" Сегмент составляет 65-72 символа (67-74 с пробелами включительно).
let &statusline.="%1*"
let &statusline.=" %<%.65t%(%m%r%)"
let &statusline.=" %*"
" Установить цвет на User2, добавить формат файла, затем кодировку файла
" (Анализ длины строки в работе)
let &statusline.="%2*"
let &statusline.=" %{&ff} > %{strlen(&fenc) ? &fenc : '(none)'}"
let &statusline.=" %*"
" Установить цвет на User3, добавить тип файла, если доступен
" Поскольку самое длинное имя типа файла `upstreaminstalllog`, кажется,
" что лимит строки и длина сегмента должны составлять 20 символов
" (22 с пробелами включительно).
let &statusline.="%3*"
let &statusline.=" %.20{&filetype}"
let &statusline.=" %*"
" Установить цвет на Default, добавить dec, hex и восьмеричный код выбранного символа
" Учтите, что U+10FFFF (или dec 1114111) - максимальный диапазон Unicode.
" А для восьмеричного это 4177777. Это измеряет 34 фиксированных символа в длину.
" С отключенным восьмеричным кодом это измеряет 22 фиксированных символа в длину.
" Общее количество символов сегмента составляет либо 34, либо 56 фиксированных символов в длину.
" (36 или 58 с пробелами включительно).
let &statusline.="%*"
let &statusline.=" d=%-7b"
let &statusline.=" ┃"
let &statusline.=" h=%-6B"
"let &statusline.=" ┃"
"let &statusline.=" o=%{printf('%-7o', char2nr(getline('.')[col('.') - 1]))}"
let &statusline.=" %*"
" Установить цвет на User4, добавить отображение карты клавиш
let &statusline.="%4*"
let &statusline.=" <%k>"
let &statusline.=" %*"
" Точка разделения для элементов выровненных по правому краю (с использованием цветов user3)
let &statusline.="%*%="
" Добавить линейку к строке состояния, когда линейка включена
if &ruler
let &statusline.=&rulerformat
endif
endfunc
" Инициализировать строку состояния
call s:StatusLine()
" Обновить строку состояния, когда переменная линейки переключается
if has('autocmd')
autocmd OptionSet ruler call s:StatusLine()
endif
endif
И не начинайте меня с настройки линейки! Я уже знаю, что строка состояния Vim не может быть длинной в две строки, но честно говоря, я могу просто сделать линейку отдельной или что-то в этом роде, или полностью ее отключить и использовать Ctrl-G. Я пока не знаю. Но в любом случае, это не часть вопроса… Кто-то знает, что тут делать?
Ладно, я решил это. Мне нужно было избавиться от "%<"
в первой части строки состояния с путем к файлу и вместо этого добавить его для вывода dec/hex. Я просто забыл, как это сделать…
let &statusline.="%*"
let &statusline.="%<" " Урезать строки строки состояния здесь.
let &statusline.=" d=%-7b"
let &statusline.=" ┃"
let &statusline.=" h=%-6B"
"let &statusline.=" ┃"
"let &statusline.=" o=%{printf('%-7o', char2nr(getline('.')[col('.') - 1]))}"
let &statusline.=" %*"
Ответ или решение
Как изменить поведение строки состояния в Vim при изменении размера окна терминала
Ваша задача — настроить строку состояния в Vim так, чтобы элементы справа (например, значения в десятичной и шестнадцатеричной системе) «сжимались» при уменьшении размера окна терминала, в то время как элементы слева (такие как имя файла и модификаторы) оставались видимыми. Эта настройка может быть достигнута с помощью изменений в Vimscript, как вы уже обнаружили.
Шаги по настройке строки состояния
-
Понимание формата строки состояния: Строка состояния в Vim управляется с помощью специальной переменной
statusline
, которая определяется через последовательность управляющих символов. Элементы строки состояния могут быть расположены с помощью пробелов и символов, таких как%<
, которые указывают, где начинать сжимать элементы. -
Удаление сжатия слева: Как вы правильно заметили, чтобы предотвратить сжатие элементов слева, необходимо удалить символ
%<
. Этот символ указывает, что любые элементы, находящиеся слева от него, должны оставаться видимыми, а при сжатием строки они сдвигаются вправо. -
Добавление сжатия справа: Теперь вы должны добавить символ
%<
в секции, которые вы хотите сжимать. Например, после добавления значений в десятичной и шестнадцатеричной системах:let &statusline.="%*" let &statusline.=" d=%-7b" let &statusline.=" ┃" let &statusline.=" h=%-6B" let &statusline.=" %*"
В этом коде
%<
отсутствует в начале, что позволяет элементам файла оставаться видимыми. Однако добавление%<
перед значениямиd
иh
позволит сжать их при уменьшении ширины окна.
Финальный код
С учетом ваших изменений, ваш фрагмент кода будет выглядеть следующим образом:
func s:StatusLine()
set statusline=
" Установите цвет User1 и добавьте полный путь к файлу с флагами
let &statusline.="%1*"
let &statusline.=" %.65t%(%m%r%)"
let &statusline.=" %*"
" Установите цвет User2 и добавьте формат файла и кодировку
let &statusline.="%2*"
let &statusline.=" %{&ff} > %{strlen(&fenc) ? &fenc : '(none)'}"
let &statusline.=" %*"
" Установите цвет User3 и добавьте тип файла, если доступен
let &statusline.="%3*"
let &statusline.=" %.20{&filetype}"
let &statusline.=" %*"
" Установите цвет по умолчанию, добавьте 10-ти и 16-ти значные значения
let &statusline.="%*"
let &statusline.="%<d=%-7b"
let &statusline.=" ┃"
let &statusline.=" h=%-6B"
let &statusline.=" %*"
let &statusline.="%4*"
let &statusline.=" <%k>"
let &statusline.=" %*"
let &statusline.="%*%="
if &ruler
let &statusline.=&rulerformat
endif
endfunc
Эти изменения позволят вам управлять тем, какие элементы должны быть видимыми и как они сжимаются при изменении размера терминала. Обратите внимание на использование форматирования строк, чтобы добиться нужного визуального представления вашей строки состояния.
Заключение
Эти небольшие изменения в вашей конфигурации Vim помогут вам реализовать нужное поведение строки состояния при изменении размера окна терминала. Рекомендуется тестировать изменения в разных размерах окна, чтобы убедиться, что все работает как задумано. Удачи в дальнейшей настройке и обучении!