Как по-другому сжать статусную строку vim при изменении размеров окна терминала?

Вопрос или проблема

Итак, что я хочу сделать, это немного сложно объяснить, так что потерпите…

Я сделал свою собственную строку состояния в Vim. Я знаю, что существуют Airline и Powerline, но это больше личное стремление узнать больше о “Vimscripting” и о том, как именно работает строка состояния.

Обычно, когда я изменяю размер терминального эмулятора по горизонтали, сегменты строки состояния “сжимаются” определенным образом, например, сжимаются слева, где я помещаю имя файла, флаги изменения/только для чтения, формат файла и тип файла. Что я хотел бы сделать, так это каким-то образом контролировать, как эти элементы сжимаются. Я хотел бы, чтобы элементы справа “сжимались” или обрезались вместо этого. Я приложу некоторые изображения, потому что считаю, что визуальная справка здесь ключевая для того, чтобы помочь другим понять, что я хочу…

Показывает, как Vim выглядит обычно
Показывает, что происходит, когда строка состояния Vim сжимается
Показывает, что должно произойти со строкой состояния Vim вместо этого

Когда я изменяю размер окна таким образом (например, для вертикально ориентированного монитора или экрана в портретном режиме), я хочу, чтобы имя файла было всегда видно, и чтобы вместо этого сжимались значения 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, как вы уже обнаружили.

Шаги по настройке строки состояния

  1. Понимание формата строки состояния: Строка состояния в Vim управляется с помощью специальной переменной statusline, которая определяется через последовательность управляющих символов. Элементы строки состояния могут быть расположены с помощью пробелов и символов, таких как %<, которые указывают, где начинать сжимать элементы.

  2. Удаление сжатия слева: Как вы правильно заметили, чтобы предотвратить сжатие элементов слева, необходимо удалить символ %<. Этот символ указывает, что любые элементы, находящиеся слева от него, должны оставаться видимыми, а при сжатием строки они сдвигаются вправо.

  3. Добавление сжатия справа: Теперь вы должны добавить символ %< в секции, которые вы хотите сжимать. Например, после добавления значений в десятичной и шестнадцатеричной системах:

    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 помогут вам реализовать нужное поведение строки состояния при изменении размера окна терминала. Рекомендуется тестировать изменения в разных размерах окна, чтобы убедиться, что все работает как задумано. Удачи в дальнейшей настройке и обучении!

Оцените материал
Добавить комментарий

Капча загружается...