Перейти к содержанию

Интерфейс: тема, раскладка, хоткеи

Секция [ui] настраивает окно отладчика. Она лежит вне профилей, потому что к запуску отношения не имеет: профилей у проекта много, а окно одно.

version = 1

[ui]
theme = "dark"
width = 1200
height = 800

[profiles.api]
adapter = "dlv"
program = "cmd/api"
Поле Обязательное Что это
theme нет dark (по умолчанию), light или system
width нет начальная ширина окна в логических пикселях; по умолчанию 800
height нет начальная высота окна в логических пикселях; по умолчанию 600
layout нет раскладка панелей, ниже
keymaps нет хоткеи окна, ниже

Размер окна

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

Приоритет каждого измерения:

  1. width или height в [ui] проекта;
  2. gui_width или gui_height в конфиге плагина Neovim;
  3. умолчание — 800 × 600 логических пикселей.

Значение проекта выигрывает, потому что оно общее для всех, кто открывает этот проект.

Тема

Умолчание — тёмная тема, а не системная. Окно отладчика открывается рядом с редактором, а не вместо него, и следовать настройке системы обязано только по явной просьбе. Для этого есть system, с ним тема переключается на живой сессии.

Неизвестное значение — ошибка разбора конфига с перечислением допустимых, а не молчаливый откат к умолчанию.

Молчание — не то же самое, что theme = "dark"

Названная в [ui] тема выигрывает у всех: она общая для всех, кто открывает этот проект. Не названная — оставляет выбор тому, кто открывает окно.

Приоритет:

  1. [ui] theme из конфига проекта;
  2. --theme от редактора (gui_theme плагина превращается в bugsaur gui --theme dark|light|system);
  3. умолчание отладчика — тёмная.

Запуск без проекта (--adapter / --program) конфига не читает, и остаются только пункты 2 и 3.

Раскладка

Окно делится на левую колонку и правую область, каждая — на две зоны:

+----------------+-----------------------------+
|                |                             |
|   top_left     |            main             |
|                |                             |
+----------------+-----------------------------+   ← main_split
|                |                             |
|  bottom_left   |           bottom            |
|                |                             |
+----------------+-----------------------------+
        ↑ left_split          ↑ left
Поле Что это Умолчание
left доля ширины окна под левую колонку 0.25
left_split доля высоты колонки под top_left 0.35
main_split доля высоты правой области под main 0.35
top_left панели верхней зоны левой колонки ["Threads"]
bottom_left панели нижней зоны левой колонки []
main панели основной зоны все остальные
bottom панели зоны под основной ["Call Stack"]

Имена панелей пишутся ровно так, как они подписаны на вкладках: Threads, Call Stack, Variables, Watches, Evaluate, Logs, Inspector, Breakpoints. Панели одной зоны становятся стопкой вкладок в порядке перечисления.

[ui.layout]
left = 0.3
left_split = 0.5
top_left = ["Threads"]
bottom_left = ["Call Stack"]
main = ["Variables", "Watches", "Inspector"]
bottom = ["Evaluate", "Logs"]

Панель, не названная ни в одной зоне, не показывается — этим панели и убираются. Пустая зона не занимает места вовсе; пустой main отдаёт всю площадь левой колонке.

Не названная зона сохраняет свой состав по умолчанию

Поэтому перенос панели требует и очистки прежней зоны: main = [..., "Call Stack"] без bottom = [] — это ошибка «панель названа дважды», а не молчаливый выбор одной из зон.

Ошибка запуска — также неизвестное имя панели, доля вне интервала от 0 до 1 и раскладка, не оставившая ни одной панели.

Приоритет тот же, что и у темы, но секция берётся целиком. Есть [ui.layout] — берётся она, gui_layout из Neovim не смотрим вовсе; нет — целиком берётся раскладка редактора (bugsaur gui --layout <json>, те же ключи); нет нигде — умолчания из таблицы выше. Смешивать зоны из двух источников значит собирать окно, которого не задумывал никто.

Перетащенные мышью панели не сохраняются: раскладка строится из конфига на каждый запуск.

Хоткеи

Словарь действие → аккорд:

[ui.keymaps]
continue = "Alt+R"
step_into = "F3"
step_over = "F2"
step_out = "F5"
terminate = "Alt+S"
pause = ""          # снять привязку

Действия:

  • выполнениеcontinue, step_into, step_over, step_out, pause, terminate, restart;
  • панелиnext_panel, previous_panel и переход в конкретную: focus_threads, focus_call_stack, focus_variables, focus_watches, focus_evaluate, focus_logs, focus_inspector, focus_breakpoints;
  • навигацияnext_row, previous_row, top, bottom, collapse, expand, activate, delete_row, cancel;
  • поиск по Variablessearch, search_next, search_previous, search_continue;
  • прочееhelp.

Пустой аккорд снимает привязку. В TOML нет null, и другого способа убрать умолчание у конфига не было бы. У действия остаётся ровно один аккорд: focus_variables = "Alt+V" снимает и Ctrl+V.

Аккорд — модификаторы Cmd, Ctrl, Alt, Shift через + и имя клавиши (F1F20, буква, Enter, Space, ArrowDown, …). Порядок модификаторов не важен. Неизвестное действие, клавиша или модификатор останавливают запуск: хоткей с опечаткой иначе просто никогда не срабатывал бы, ничем себя не выдавая.

Приоритет — по действиям, а не блоком. Названное в [ui.keymaps] перебивает gui_keymaps из Neovim; не названное остаётся тем, что настроено в редакторе; не названное нигде — умолчанием. Блоком здесь было бы неудобно: привязки друг от друга не зависят, и проект, переопределивший один continue, не должен гасить всю личную настройку.

Полная стопка слоёв, снизу вверх:

  1. умолчания (F7, F8, Shift+F8, F9, Cmd+F2 / Ctrl+F2, H J K L, стрелки);
  2. <корень>/.bugsaur-keys.json — личный файл проекта, аккорд → действие, где null снимает привязку;
  3. gui_keymaps из setup() плагина Neovim;
  4. [ui.keymaps] из этого конфига.

F1 или ? в окне показывает, что получилось после всех четырёх слоёв.