Hatred's Log Place

DON'T PANIC!

Jan 30, 2021 - 4 minute read - Linux

Alacritty: первое знакомство

Как сказано на GitHub разработчика:

Alacritty - A fast, cross-platform, OpenGL terminal emulator

Со слов автора он создал его, так как неудобно было конфигурировать st. (–htrd: add cite)

Если коротко, то это эмулятор терминала с быстрым выводом текста на экран, используя GPU (OpenGL). Без поддержки табов, без конфигурировать через меню, но с достаточно гибкими возможностями конфигурации через файлы, включая подхват конфигурации на лету.

Баги

Да! Сразу с них :)

Запуск Midnight Commander

Судя по всему, терминал не совсем корректно обрабатывает завершение дочерних процессов. Так, если открыть терминал, запустить mc, а потом закрыть по Alt+F4 (ну или какая у вас комбинация для закрытия окна) и так повторить несколько раз, то а определённый запуск mc всё в терминале зависнет. И… развиснет когда вы рестартуете сервис gpm:

systemctl restart gpm

Судя по всему мало кто в современном мире использует gpm, но да ладно. Чуть позже или разберёмся или баг-реквест отправим. На Konsole такой проблемы не наблюдаю.

Размер шрифтов мониторах одной системы с разным DPI

Об этом подробнее ниже.

Конфигурация

Конфиг на YAML. Простой и понятный до безобразия.

Терминал сам не создаёт конфигурационных файлов. Хотя в исходниках лежит alacritty.yml, в котором есть все опции, но закомментированные: копируешь, редактируешь что нужно. Как мне кажется, было бы неплохо генерировать этот файл при первом запуске, если его не существует ещё. Или делать генерацию через параметр коммандной строки.

Рекоммендую сразу задать:

# Live config reload (changes require restart)
live_config_reload: true

Тогда изменения настроек будут применяться сразу и к запущенным копиям программы.

Большой плюс автору за наличие man-страницы: alacritty(1) в которой чётко и ясно написано, где и в какой последовательности ищется конфигурация. Я выбрал вариант размещения в .config/alacritty/alacritty.yml.

Шаблон взял с GitHub: https://github.com/alacritty/alacritty/blob/master/alacritty.yml.

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

Собственно файл со схемами я урвал с этого проекта: https://github.com/eendroroy/alacritty-theme/blob/master/schemes.yaml. Именно так, целым файлом. Чуть позже расскажу почему.

И вот такая полная конфигурация образовалась у меня:

Или, за исключением комментариев:

import:
  - ~/.config/alacritty/schemes.yml
env:
  TERM: xterm-256color
  WINIT_X11_SCALE_FACTOR: '1.0'
window:
  startup_mode: Maximized
  dynamic_title: true
scrolling:
  history: 10000
font:
  normal:
    family: Meslo LG M DZ
    style: Regular
  bold:
    family: Meslo LG M DZ
    style: Bold
  italic:
    family: Meslo LG M DZ
    style: Italic
  bold_italic:
    family: Meslo LG M DZ
    style: Bold Italic
  size: 12
  use_thin_strokes: false
cursor:
  style:
    shape: Underline
    blinking: On
  blink_interval: 500
  thickness: 0.35
live_config_reload: true

Рассмотрим чуточку подробнее.

import:
  - ~/.config/alacritty/schemes.yml

Это мы подключаем наш файл с описанием цветовых схем. Их там несколько и просто меняя одну строчку в конце мы можем легко их переключать. Ну и добавлять новые тоже.

env:
  TERM: xterm-256color
  WINIT_X11_SCALE_FACTOR: '1.0'

А вот это уже интересно. Это обход проблем.

В первом случае, если задан терминал alacritty, то не работает dynamic title: когда ASNI последовательностью можно установить заголовок терминала. Есть репорт:

если пофиксить стартовые скрипты, то частично оно начинает работать, но не работает в Midnight Commander. В значении xterm-256color работает и в mc.

По второй опции нужно смотреть репорты:

Там можно найти два варианта:

  1. Который использую я: WINIT_X11_SCALE_FACTOR: '1.0'
  2. и: WINIT_HIDPI_FACTOR: '1'

Второй вариант у меня не очень хорошо заработал: шрифты стали вести получше, но на экране ноутбука всё равно выходят сильно крупными, тогда, когда на внешнем мониторе - мелким.

В вашем случае проблемы может и не быть, быть не актуальной или подойдёт другой набор установок.

window:
  startup_mode: Maximized
  dynamic_title: true

Тут всё понятно: запускаться, по умолчанию, в развёрнутом состоянии. И поддерживать Dynamic Title (см. выше установку переменной окружения TERM=xterm-256color).

scrolling:
  history: 10000

Тут тоже всё просто - число строк буффера обратной прокрутки.

Настройку шрифтов я пропускаю, тут ничего из космо-науки нет.

cursor:
  style:
    shape: Underline
    blinking: On
  blink_interval: 500
  thickness: 0.35

Мне нравится “олдскульный”, “DOSовский” курсор: горизонтальная линия, достаточно толстая и заметная (привет Konsole). Alacritty позволяет настроить всё как мне нравится.

live_config_reload: true

Очень удобная опция. Alacritty следит за своим конфигом, и если он изменился, то перечитывает его и применяет новые настройки. Понятно, что те же настройки переменных окружения подхватиться на лету не смогут, для этого нужен перезапуск дочернего процесса оболочки.

Ещё нюанс, что эта опция следит только за самим файлом конфигурации, но не следит за импортируемыми. Поэтому, в моей конфигурации, при изменении темы, нужно проделать следующий трюк:

touch alacritty.yml

Переключение тем

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

Предполагается, что скрипты лежат в ~/.config/alacritty/

  1. scheme-switch.sh:

    #!/usr/bin/env bash
    
    scheme=$1
    
    if [ -z "$scheme" ]; then
            echo "Use: $0 <scheme>"
            echo "<scheme> must be defined in `schemes.yml`"
            exit 1
    fi
    
    sed -i "s/^\(colors: \*\).*$/\1$scheme/" schemes.yml && \
            touch alacritty.yml
    
  2. scheme-loop.sh:

    #!/usr/bin/env bash
    
    for line in $(cat schemes.yml | grep ': &' | awk -F: '{print $1}'); do
            echo "Use scheme: $line"
            ./scheme-switch.sh $line
            echo "Press Enter to continue..."
            read
    done
    

Вкладки

Ээээ… Как же так, заявлено же, что без них. Да, без них. Но есть tabbed.

Читам ман:

А запускаем так:

tabbed alacritty --embed