Перейти к содержимому

Редактор экспериментов ​

Эксперимент — это тест, записанный в виде графа: узлы, которые отправляют (HTTP-запрос, OSC-сообщение, публикацию MQTT…), ждут ответа, проверяют, что пришло, играют роль другой стороны или по сигналу ломают сеть, соединены связями, указывающими, что выполняется дальше. Запуск начинается с узла Старт, идёт по связям и считается пройденным, когда доходит до узла Финиш и все шаги прошли. Эксперимент собирают на экране Эксперименты и там же запускают, а тот же файл можно запустить из командной строки или на сервере.

Редактор держит один эксперимент за раз и сохраняет его по ходу работы. Чтобы хранить несколько, экспортируйте снимки или откройте другой эксперимент из файла (см. Сохранение и файлы).

Все типы узлов, их поля и выходы описаны в справочнике узлов. О том, как значения передаются между узлами, рассказывает страница Данные и шаблоны; о параллельных ветках, циклах, повторах при ошибке и сериях — страница Как идёт запуск.

Экран ​

ОбластьЧто в ней
Панель инструментов (сверху)Название эксперимента и состояние сохранения, добавление узлов, параметры, профили, панели, режим фокуса, полноэкранный режим и запуск
Панель холстаОтмена и повтор, поиск узла, Упорядочить и масштаб
ХолстГраф: узлы, связи и ход запуска, нарисованный на них
Параметры (справа)Поля выбранного узла, его предпросмотр и Отправить сейчас; или то, что можно сделать с несколькими выбранными узлами или с выбранной связью
Ход запуска (внизу)Шаги текущего или последнего запуска, его итог, отчёт и seed

У панели свойств и ленты запуска на внутреннем краю есть разделитель: перетащите его или поставьте на него фокус клавишей Tab и пользуйтесь стрелками (с Shift шаг больше); двойной щелчок или Enter возвращает панели размер по умолчанию. Размеры запоминаются. Лента запуска остаётся свёрнутой, пока её не откроет первый запуск.

Панель инструментов ​

ЭлементЧто делает
☰ ЭкспериментыОткрывает шаблоны, открытие файла JSON и экспорт (Сохранение и файлы)
Название экспериментаНазвание эксперимента; для запуска оно необходимо. Отчёты о запусках записывают его, и по нему Сравнить находит прежние запуски
Сохранено / Сохранение… / Ошибка сохраненияЗаписано ли последнее изменение на диск
⚠ Завершите схемуПоказывается, пока эксперимент не может запуститься; подсказка объясняет почему, щелчок выделяет узел, о котором речь (Проверка)
+ Добавить нодОткрывает меню добавления — после выбранного узла, если он есть (A)
ПрофильПрофиль, который используют запуски, предпросмотр и пробная отправка узла; показывается, когда в эксперименте есть профили. ⚠ отмечает профиль, с которым запуск не пройдёт
{ } ПараметрыПараметры, профили, seed, cookie и секреты (Данные и шаблоны)
☷ ПараметрыПоказывает или скрывает панель свойств
▢ Режим фокусаСкрывает боковую панель, шапку и нижнюю панель (Режим фокуса и полный экран)
⛶ На весь экранОкно на весь экран, вместе с режимом фокуса
ЗапуститьПроверяет, сохраняет и запускает эксперимент; пока он идёт, на кнопке — Стоп
▾ Запустить с…Один запуск с другим профилем, другими значениями параметров или заданным seed, без изменения эксперимента

Перемещение по холсту ​

  • Сдвиг: перетаскивайте пустой холст или прокручивайте.
  • Масштаб: Ctrl и колесо мыши масштабируют вокруг указателя; − и + на панели холста меняют масштаб шагом 10 %. Масштаб — от 15 % до 200 %; процент между кнопками показывает, где вы находитесь.
  • 1:1 (Сбросить масштаб, Ctrl+1) возвращает 100 %.
  • ⊡ Показать всю схему (Ctrl+0) показывает весь граф, но не крупнее 100 %.
  • Поиск узла: кнопка Ноды на панели холста (на ней указано, сколько всего узлов) или Ctrl+F. Введите слова из названия узла, его краткого описания (URL, адрес, топик) или идентификатора; ↑ ↓ выбирают, Enter выделяет узел и показывает его (масштаб не меньше 80 %), Esc закрывает.

Миникарты нет: её работу выполняют Показать всю схему и поиск.

Узлы и связи ​

Узел показывает свой тип, краткое описание того, что он делает, и значки своих настроек: ↻ и число — повтор при ошибке, × и число (или время) — серия отправок, ⚡ — нагрузка. Вход у узла слева — он есть у каждого узла, кроме Старт, — а выходы справа:

ВыходУ каких узловКогда по нему идут
ВыходУ большинства узловШаг прошёл
Да / НетВетвление по статусу, Ветвление по значениюСравнение выполнилось / не выполнилось
Поток 1 / Поток 2Параллельный запускВсегда, оба сразу
Получено / ТаймаутУзлы ожиданияПодходящее сообщение пришло / не пришло вовремя
Тело / Готово / ЛимитЦиклСледующая итерация / цикл закончен / итерации кончились

У выхода может быть несколько связей. Первая связь продолжает ветку; каждая следующая начинает параллельную ветку с копией переменных, известных в этой точке. Узел Слияние потоков ждёт все связи, которые в него входят. Подробности — на странице Как идёт запуск.

Выходы Таймаут и Лимит необязательны: если связи нет, таймаут или исчерпание итераций завершает шаг ошибкой. У всех остальных выходов связь должна быть, иначе эксперимент не запустится.

Связь от тела узла Цикл обратно к нему рисуется дугой над телом; это единственная связь, которая может вести назад.

Добавление узлов ​

Меню добавления ​

Меню добавления перечисляет все типы узлов по группам — Действия, Ожидание, Эмуляция, Сбои, Данные, Проверки, Сценарий — а затем Сохранённые сигналы: сигналы вашей библиотеки, которые можно превратить в узел (OSC, HTTP, UDP с текстовым содержимым, MQTT), с уже заполненными полями.

При открытии фокус стоит в поле поиска. Введите несколько букв: каждое слово должно встретиться в названии узла, его описании или типе (http, wait_osc); сигнал находится по названию, папке, протоколу или цели. ↑ ↓ выбирают, Enter добавляет, Esc закрывает. Строка сверху говорит, куда встанет узел: после какого-то узла или параллельно ему.

Новый узел выделяется, панель свойств открывается, а его главное поле — URL, адрес, топик, задержка — получает фокус с выделенным текстом, так что можно сразу печатать. Esc в поле возвращает к узлу на холсте, готовому к следующему A.

После выбранного узла ​

A, + Добавить нод на панели инструментов и + Добавить следующий на панели свойств добавляют следующий шаг после выбранного узла:

  • Он присоединяется к первому выходу узла, у которого ещё нет связи (скажем, к свободному выходу Нет узла Ветвление по статусу), а если такого нет — к первому выходу.
  • Если у этого выхода уже есть связь, новый узел вставляется в неё (в первую, если их несколько): теперь связь идёт через новый узел, а всё, что после него, сдвигается вправо, освобождая место.
  • Если выбран Финиш, узел встаёт перед ним — когда в него входит одна связь.
  • Если ничего не выбрано, узел появляется в середине видимой области, без связей.

Узел с единственным выходом, поставленный на пустой выход Тело узла Цикл — этим способом или на новой связи, — сразу соединяется и обратно с циклом, так что тело получается завершённым.

В связь ​

У каждой связи посередине есть + (Вставить нод). Он открывает меню добавления, и выбранный узел вставляется в эту связь. Вставленный так узел Цикл продолжает поток через свой выход Готово.

На новой связи ​

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

В любом месте ​

Дважды щёлкните пустой холст, чтобы добавить узел в этом месте, без связей.

С других экранов ​

  • Кнопка В эксперимент на экранах OSC и HTTP добавляет то, что вы только что попробовали, как следующий шаг — прямо перед Финиш, если в него входит одна связь, — и переключает на редактор.
  • Кнопка Ждать это рядом с сообщением в мониторе OSC добавляет узел Ждать OSC, который его распознаёт: по адресу и по текстовым, целым и логическим (true/false) аргументам (числа с плавающей точкой — меняющиеся измерения, поэтому их оставляют в стороне). Остановите монитор перед запуском: запуск сам слушает этот порт.
  • Кнопка Ждать это у топика в дереве MQTT добавляет узел Ждать MQTT на этот топик, на этом брокере.

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

Соединение узлов ​

  • Перетащите связь от выхода на узел. Достаточно отпустить её не дальше 24 пикселей от узла.
  • Щёлкните выход (или поставьте на него фокус и нажмите Enter или Space): на панели холста появится Выберите входящий порт. Щёлкните узел или его вход, чтобы соединить; щёлкните пустой холст, чтобы добавить там узел на новой связи; чтобы отказаться, нажмите Отмена или Esc.

Связь отклоняется, если создаёт цикл (кроме обратной связи узла Цикл), если ведёт в Старт или выходит из Финиш, а также если соединяет узел с ним самим; редактор об этом сообщает. Если провести уже существующую связь, ничего не изменится.

Чтобы удалить связь, щёлкните её — панель свойств покажет, что она соединяет, — и нажмите Delete или воспользуйтесь там кнопкой Удалить связь. Если навести указатель на связь, над её + появится ×. В свойствах узла перечислены его исходящие связи, у каждой есть × (Разъединить).

Выбор нескольких узлов ​

Что сделатьКак
Выбрать узелЩёлкнуть его или перейти к нему клавишей Tab
Добавить узел в выделение или убрать из негоShift или Ctrl и щелчок
Выделить рамкойShift и протяжка по пустому холсту: в выделение попадает каждый узел, которого коснулась рамка
Выделить все узлыCtrl+A
Снять выделениеЩёлкнуть пустой холст; Esc, если выбрано несколько узлов
ПереместитьПеретащить один из них: двигаются все
Сдвинуть понемногуКогда фокус на узле, стрелки двигают выделение на 5 пикселей, с Shift — на 20

Панель свойств показывает узел, выбранный последним; если выбрано несколько, она показывает их число и кнопки Копировать, Дублировать и Удалить ноды.

Копирование, вырезание и вставка ​

Ctrl+C копирует выбранные узлы и связи между ними как текст; Ctrl+X ещё и удаляет их; Ctrl+V вставляет — в этот эксперимент, в другой, открытый позже, или в другое окно Signal Lab. Этот текст — JSON, поэтому его можно сохранить и в файле, и в сообщении.

  • Старт и Финиш бывают только в единственном экземпляре: их никогда не копируют.
  • Связи между скопированным узлом и остальным графом не копируются; соедините копию сами.
  • Каждый вставленный узел получает новый идентификатор.
  • Узел, который ссылается на другой узел — Сменить помехи, Эмулятор: выкл./вкл., Отправка WebSocket, Ожидание WebSocket, Закрытие WebSocket, — ссылается на копию, если скопирован и тот; иначе он по-прежнему ссылается на оригинал, если тот есть в этом эксперименте, или на первый узел такого типа в нём.
  • Вставленный Эмулятор или Сетевые помехи, порт которого этот эксперимент уже слушает, переходит на следующий свободный порт. То, что отправляет на оригинал, продолжает отправлять на него.
  • Копия появляется на 32 пикселя правее и на одну строку ниже оригинала, а если место занято — ещё ниже, пока не перестанет перекрывать узлы, и оказывается выделенной.

Ctrl+D (Дублировать) делает то же без буфера обмена.

Удаление ​

Delete или Backspace (Удалить нод, Удалить ноды) удаляют выбранные узлы и их связи. Если у узла была ровно одна входящая и одна исходящая связь, на его месте остаётся связь от предыдущего узла к следующему, так что цепочка не рвётся. Узлы Старт и Финиш удалить нельзя.

Отмена и повтор ​

Ctrl+Z отменяет; Ctrl+Shift+Z или Ctrl+Y возвращает отменённое (↶ ↷ на панели холста). Перетаскивание, серия сдвигов стрелками или набор текста в одном поле — один шаг. Последние 100 шагов хранятся, пока приложение открыто, в том числе при переключении экранов; открытие другого эксперимента — тоже один шаг, так что Ctrl+Z возвращает предыдущий. Пока идёт запуск, отмена и повтор недоступны.

Упорядочение ​

Упорядочить раскладывает граф слева направо: каждый узел встаёт в столбец после последнего узла, который к нему ведёт, тело узла Цикл — в свою строку, — а затем подбирает масштаб, чтобы граф поместился. Это один шаг истории. Черновик с циклом, который не относится к циклу-узлу, остаётся как есть.

Панель свойств ​

Когда выбран один узел, панель показывает сверху вниз:

  1. Название узла (его подсказка объясняет, что он делает) и, если эксперимент не может запуститься из-за этого узла, что именно не так.
  2. Его поля. Поля, которые принимают шаблоны, предлагают параметры, переменные, секреты и генераторы, когда вы вводите {{ или нажимаете Ctrl+Space.
  3. Его настройки: отправлять под нагрузкой у HTTP-запроса, отправлять серией у узлов, которые отправляют, повторять при ошибке у узлов, которые отправляют или слушают, и ждать ответ у OSC- и UDP-сообщений (см. Настройки узлов). Пока нагрузка включена, она заменяет серию отправок и повтор при ошибке.
  4. Результат последней нагрузки — у HTTP-узла, который работал под нагрузкой.
  5. Предпросмотр — Будет отправлено, Будет ожидаться или Будет сравниваться — если в узле есть шаблоны: что он отправит, чего будет ждать или что сравнит, с подстановкой текущих параметров и значений, известных на данный момент (Пробная отправка и предпросмотр).
  6. Отправить сейчас или Слушать сейчас и то, что она сделала в последний раз.
  7. Исходящие связи узла, у каждой ×.
  8. ⚡ Пропустить через помехи у OSC- или UDP-сообщения: перед узлом ставится Сетевые помехи — он слушает свободный порт на loopback начиная с 9010 и пересылает на цель узла, — а узел перенаправляется на него, так что следующий запуск ухудшает то, что узел отправляет (Сбои).
  9. + Добавить следующий, Копировать, Дублировать и Удалить нод.

Двойной щелчок по узлу открывает панель с курсором в его главном поле. Если выбрано несколько узлов, панель предлагает то, что можно сделать со всеми сразу; если выбрана связь — что она соединяет и Удалить связь. Пока идёт запуск, поля заблокированы.

Пробная отправка и предпросмотр ​

Кнопка Отправить сейчас (Ctrl+Enter, в том числе из полей узла) отправляет выбранный узел сам по себе, не запуская эксперимент, тем же кодом, что и запуск. Она есть у узлов HTTP-запрос, TCP-сообщение, OSC-сообщение, UDP-датаграмма, Публикация MQTT, Подключение WebSocket и Отправка WebSocket. У узлов ожидания вместо неё Слушать сейчас: ожидание слушает с этого момента, пока не подойдёт сообщение или не истечёт таймаут.

  • Узел использует активный профиль, сохранённые секреты и значения переменных, известные к этому моменту, — из последнего запуска и из прежних результатов Отправить сейчас. Если шаблон называет значение, которого пока никто не задал, ничего не отправляется, а имена перечисляются.
  • Отправка выполняется один раз: повтор при ошибке, серия отправок и нагрузка не применяются, cookie не сохраняются, а эмуляторы и реле эксперимента не запускаются.
  • Отправка WebSocket или Ожидание WebSocket открывает соединение, описанное в его Подключение WebSocket, на время этой одной пробы.
  • У HTTP-запроса показывается ответ — статус, время, размер и тело, отформатированное как JSON. Значения, которые заберут узлы Извлечь значение, стоящие после запроса, подставляются сразу. Щёлкните значение в JSON-ответе, чтобы сразу после запроса добавить узел Извлечь значение для него — с названной переменной и известным значением. Кнопка Сымитировать превращает ответ в маршрут эмулятора.
  • Результат записывается и в консоль.

Предпросмотр тоже вычисляется движком — примерно через четверть секунды после изменения. Значения секретов не показываются ни там, ни где-либо ещё.

Проверка ​

Редактор проверяет эксперимент по ходу правки и ещё раз, когда вы нажимаете Запустить:

  • Выход, которому ещё нужна связь, пульсирует янтарным.
  • Узел, до которого не доходит ни одна связь от Старт, рисуется пунктиром; его подсказка это объясняет.
  • Узел, о котором говорит проблема, обводится, а сама проблема написана над его полями.
  • ⚠ Завершите схему на панели инструментов называет проблему; щелчок выделяет узел.

Эксперимент запускается, если, помимо прочего:

  • у него есть название, ровно один Старт и один Финиш, и не больше 64 узлов;
  • каждый узел достижим из Старт, а у каждого обязательного выхода есть связь;
  • единственные циклы — тела узлов Цикл, ведущие обратно к ним;
  • перед каждой проверкой и каждым Извлечь значение на любом пути есть HTTP-запрос (запрос под нагрузкой не считается: он не оставляет ответа);
  • Отправка WebSocket, Ожидание WebSocket или Закрытие WebSocket стоит после Подключение WebSocket, который он использует;
  • каждое поле заполнено и в допустимых пределах, а каждый шаблон называет то, что известно в этой точке.

Незаконченные черновики всё равно сохраняются. Запуск отклоняется, ещё до какого-либо трафика, если не сохранён нужный ему секрет. Все сообщения перечислены в справочнике ошибок.

Запуск ​

Запустить проверяет эксперимент, сохраняет и запускает его. Если запустить нельзя, показывается проблема и выделяется её узел. Иначе открывается лента запуска, и узлы загораются по мере того, как до них доходит запуск: ● выполняется, ✓ пройден, ✕ ошибка, ↻ повтор, ⟳ серия, ⚡ под нагрузкой; связи, по которым шёл поток, тоже окрашиваются.

  • Узлы ожидания, эмуляторы и реле помех открывают свои порты до первого шага, так что ничего из пришедшего раньше не пропадёт. Порт, который не удалось открыть (скажем, его занимает другая программа), не даёт запуску начаться, и показывается узел, которому он нужен.
  • Стоп немедленно завершает запуск, включая паузы, ожидания и нагрузки. Запуск — это ещё и задача в полосе задач консоли, откуда её тоже можно остановить.
  • Запуск, который длится дольше 300 секунд, останавливается и завершается ошибкой.
  • Пока идёт запуск, эксперимент нельзя редактировать; сдвиг, масштаб и выделение работают.

▾ Запустить с… рядом с кнопкой запускает эксперимент один раз с другим профилем, другими значениями параметров или заданным seed; сам эксперимент не меняется, а форма хранит введённое до закрытия приложения (Данные и шаблоны).

Ход запуска ​

Панель Ход запуска перечисляет по строке на шаг: время, узел и что произошло — пройден, ошибка и почему, повтор, ход серии отправок, цифры нагрузки раз в секунду. Щёлкните строку, чтобы выделить её узел на холсте.

В её заголовке:

  • итог: Успешно, Ошибка с причиной или Остановлено;
  • Отчёт сохранён — файл отчёта о запуске (на сервере — ссылка для скачивания);
  • Сравнить — этот запуск рядом с более ранним запуском того же эксперимента;
  • профиль и изменённые значения, с которыми шёл запуск, если они были;
  • seed запуска и кнопка Закрепить, чтобы сохранить его в эксперименте и следующие запуски выбирали те же случайные значения, или Открепить, когда он уже закреплён.

Если Инспектор вёл захват, ожидание (или ожидаемый ответ), в котором нашлось совпадение, ссылается на кадр, с которым совпало; щелчок открывает его в Инспекторе. Отчёты, seed и сравнение запусков описаны на странице Запуски и отчёты.

Режим фокуса и полный экран ​

▢ Режим фокуса скрывает боковую панель, шапку и нижнюю панель (консоль и Инспектор), оставляя экран редактору. ⛶ На весь экран разворачивает окно на весь экран и включает режим фокуса; при выходе из полноэкранного режима режим фокуса возвращается в прежнее состояние. При переходе на другой экран режим фокуса выключается.

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

Сохранение и файлы ​

Эксперимент сохраняется сам, через мгновение после каждого изменения, в файл experiment.json в папке данных (Documents/SignalLab на десктопе; у сервера своя — см. Файлы и папки). Черновики, которые пока не могут запуститься, тоже сохраняются. Запуск сначала сохраняет, так что на диске лежит то, что запускалось.

Если этот файл не читается — например, его вручную испортили до нечитаемого JSON, — редактор сообщает, что это за файл и почему он не читается, и не трогает его. Открытие другого эксперимента через ☰ Эксперименты заменит его при следующем сохранении.

☰ Эксперименты открывает диалог экспериментов:

  • Шаблоны: выберите шаблон и нажмите Открыть схему. Во всех используются адреса loopback.
  • Открыть JSON… читает файл эксперимента — записанный этой версией Signal Lab или более ранней, до 4 МиБ — и показывает его название, число узлов и число связей, прежде чем вы его откроете. Файлы от прежних версий обновляются при открытии. Файл, который не разбирается или не был бы допустимым экспериментом, отклоняется с указанием причины, а текущий эксперимент остаётся.
  • Экспорт текущей схемы записывает снимок текущего эксперимента — узлы, связи, позиции, параметры и профили, но не значения секретов — в новый файл в папке exports в папке данных и показывает его путь; на сервере — со ссылкой Скачать.
  • Открыть схему заменяет текущий эксперимент выбранным шаблоном или файлом. Он не запускает его, а Ctrl+Z возвращает предыдущий.
ШаблонЧто делает
Пустая схемаСтарт и Финиш — для вашего собственного сценария
Проверка HTTPGET на http://127.0.0.1:8080/ и проверка статуса 200 — эксперимент, с которого вы начинаете
HTTP → OSCТот же запрос; при 200 — OSC-сообщение на 127.0.0.1:9000, иначе — задержка 500 мс
Параллельные потокиДве ветки одновременно — запрос и строка лога — сходятся перед Финиш
OSC ping → ответОтправляет /ping с идентификатором запуска на 127.0.0.1:9000 и ждёт на 127.0.0.1:9001 сообщение /pong, которое возвращает его обратно
Опрос до готовностиКаждые 0,3 с спрашивает у устройства /status, пока оно не ответит ready, но не более десяти раз
Повтор ненадёжного APIЭмулируемый API, который дважды отказывает, прежде чем ответить, и цикл, который спрашивает, пока ответ не придёт
Фазы сбоевДатаграммы на эмулируемое устройство через реле помех, пока параллельная ветка переключает сеть: чистая, с потерями, недоступная и снова чистая
Отказ зависимостиЭмулируемый API, отключённый на две секунды параллельной веткой, и клиент, который продолжает спрашивать, пока тот снова не ответит
Эхо WebSocketПодключается к эхо-сервису ws://127.0.0.1:9001/echo, отправляет JSON ping, ждёт его обратно без изменений и закрывает соединение

Те же файлы запускаются без редактора: signallab run experiment.json — см. Командная строка.

Сочетания клавиш ​

Отдельные клавиши действуют на холсте и не срабатывают, пока вы печатаете в поле. На Mac в браузере там, где написано Ctrl, работает Cmd.

КлавишиДействие
AДобавить узел после выбранного или в середине видимой области, если ничего не выбрано
Ctrl+EnterОтправить сейчас или Слушать сейчас для выбранного узла
Ctrl+ZОтменить
Ctrl+Shift+Z, Ctrl+YВернуть отменённое
Ctrl+AВыделить все узлы
Ctrl+C / Ctrl+X / Ctrl+VКопировать / вырезать / вставить выбранные узлы и связи между ними
Ctrl+DДублировать выбранные узлы
Delete, BackspaceУдалить выбранную связь или выбранные узлы
Стрелки (фокус на узле)Сдвинуть выбранные узлы на 5 пикселей; с Shift — на 20
Ctrl+FНайти узел
Ctrl+0Показать весь граф
Ctrl+1Масштаб 100 %
Ctrl + колесо мышиМасштабировать вокруг указателя
Shift + щелчок, Ctrl + щелчокДобавить узел в выделение или убрать из него
Shift + протяжка по пустому холстуВыделить рамкой
Двойной щелчок по узлуПравить его поля
Двойной щелчок по пустому холстуДобавить там узел
Enter, Space на выходе в фокусеНачать от него связь
{{ или Ctrl+Space в полеПредложить параметры, переменные, секреты и генераторы
Esc в полеВернуться к узлу на холсте
Esc на холстеЗакрыть меню добавления; иначе отменить рисуемую связь; иначе снять выбор со связи; иначе снять выделение нескольких узлов; иначе выйти из полноэкранного режима; иначе выйти из режима фокуса

В меню добавления и в поиске ↑ ↓ выбирают, Enter принимает выбор, Esc закрывает. Все сочетания клавиш приложения собраны на странице Сочетания клавиш.