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

VS Code

Расширение go-slides для VS Code: предпросмотр, показ, проблемы, автодополнение и экспорт — как Marp for VS Code для Marp.

Расширение — это go-slides/vscode, со своей собственной нумерацией версий (v0.5.0). Оно отрисовывает с помощью go-slides v0.14.0 (пакет editor, исходные строки для синхронной прокрутки, обзор и режим докладчика). Устанавливается из go-slides-0.5.0.vsix, приложенного к его релизу на GitHub: публикация в VS Code Marketplace и Open VSX подготовлена, но пока не выполнена.

Расширение — аналог Marp for VS Code для go-slides: презентация показывается в Markdown-превью VS Code в виде слайдов, её ошибки — в панели «Проблемы», а директивы, kinds (типы слайдов) и функции шаблонов дополняются по мере набора.

Установка

Скачайте go-slides-<version>.vsix со страницы релизов, затем выполните Extensions: Install from VSIX… или:

code --install-extension go-slides-0.5.0.vsix

Для предпросмотра больше ничего не нужно. Для экспорта нужна команда slides:

go install github.com/go-slides/slides/cmd/slides@latest

Предпросмотр

Откройте презентацию и выполните Markdown: Open Preview to the Side. Презентация — это файл Markdown, в front matter которого указано slides: true:

---
slides: true
paginate: true
data:
  who: World
---

# Hello {{ .who }}

---

<!-- _kind: title -->
# Page {{ page }} of {{ total }}

Файлы с marp: true тоже показываются в предпросмотре, если не установлен Marp for VS Code: оба расширения отрисовывали бы один и тот же документ. Решает настройка goSlides.preview.marpDocuments: auto (по умолчанию), always или never.

Предпросмотр — это сам go-slides, скомпилированный в WebAssembly и загружаемый расширением: без бинарного файла, и он работает на vscode.dev. Он читает из рабочей области то, что использует презентация, — slides.yaml или slides.hcl рядом с презентацией, файлы kinds, которые они называют, файлы, подключаемые шаблоном, CSS тем, — и только из папки рабочей области презентации.

Синхронная прокрутка

Начиная с v0.2.0 расширения (go-slides v0.7.0) редактор и предпросмотр прокручиваются вместе, в обе стороны, как для обычного Markdown: предпросмотр следует за слайдом и блоком под курсором редактора, а прокрутка предпросмотра двигает редактор. Настройки — собственные настройки VS Code, markdown.preview.scrollPreviewWithEditor и markdown.preview.scrollEditorWithPreview.

Строки прослеживаются сквозь шаблоны. Слайд, порождённый {{ range }}, следует за строкой своего шаблона, а то, что приносит {{ include }}, — за строкой включения. Презентация, разделённая headingDivider, синхронизируется по заголовкам.

Показ

Начиная с v0.4.0 расширения (go-slides v0.9.0) презентацию можно показывать, не выходя из VS Code. Когда презентация открыта в редакторе, из палитры команд или меню … редактора:

КомандаОткрывает
go-slides: Open Overviewпанель со всеми слайдами в сетке. Выбранный слайд показывает свой исходник в редакторе; Esc закрывает панель
go-slides: Start Presenter Viewслайды и рядом с ними режим докладчика: следующий шаг, заметки докладчика и таймер

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

Чтобы показывать на другом экране, переместите панель со слайдами туда командой View: Move Editor into New Window.

Каждая панель запускает презентацию в изолированном фрейме (без allow-same-origin) с политикой default-src 'none': фрейм загружает изображения, медиа, стили и шрифты и ничего больше, и запускает только те скрипты, которые go-slides встроил в страницу, названные по хешу. Скрипт, написанный в презентации, не запускается.

Проблемы, автодополнение, подсказки

  • Проблемы: ошибки шаблонов, YAML и HCL — на той строке, где они находятся, в презентации или в файле kinds, откуда они происходят.
  • Автодополнение: ключи директив в front matter и в комментариях <!-- --> (с _ для точечной директивы), значения kind и _kind (с тем, что задаёт каждый kind), theme, size, paginate, math, headingDivider; внутри {{ }} — функции шаблонов и поля данных.
  • Подсказки при наведении: что делает директива, что задаёт kind, аргументы функции шаблона. Начиная с v0.16.0 справка по директивам следует языку интерфейса редактора (языку отображения VS Code) и доступна на 11 языках.

Экспорт

go-slides: Export Slide Deck… (также в заголовке редактора) пишет HTML, векторный PDF, редактируемые PPTX и ODP, PNG или JPEG командой slides, как это сделал бы slides -o deck.pdf deck.md; см. Командная строка. Нужна доверенная рабочая область. Если slides не найден, расширение предлагает выполнить go install выше в терминале.

Начиная с v0.5.0 расширения (go-slides v0.14.0) записываемый им PDF доступен: при slides v0.12.0 или новее векторный PDF размечен тегами для скринридеров и объявляет PDF/UA-1, с title и lang презентации и разделом на каждый слайд. slides --pdf-tags=false записывает файл без тегов. Обновите команду через go install выше, чтобы получить это.

Настройки

НастройкаПо умолчанию
goSlides.cliPath""команда slides; пусто: slides из PATH. Настройка машины: рабочая область не может её задать
goSlides.exportTypepdfформат, который диалог экспорта предлагает первым
goSlides.exportAutoOpentrueоткрыть экспортированный файл
goSlides.htmlfalseразрешить весь сырой HTML вместо списка разрешённого Marp; учитывается только в доверенной рабочей области
goSlides.preview.marpDocumentsautoпоказывать презентации marp: true: auto, always, never

Безопасность

Презентация и рабочая область не считаются доверенными. Сырой HTML следует списку разрешённого Marp, если только goSlides.html не включён в доверенной рабочей области (slides.yaml с html: true не включает его в предпросмотре), а предпросмотр VS Code не запускает ни одного скрипта из презентации. Предпросмотр читает файлы только из папки рабочей области презентации, не следует символическим ссылкам, а шаблоны не видят переменных окружения. Экспорт запускает программу, поэтому ждёт доверия к рабочей области, а программу рабочая область никогда не называет.

Производительность

На презентации из 100 слайдов из теста производительности go-slides, в VS Code 1.142 на Apple M4 Max, с Marp for VS Code 3.6.1, измеренным в том же сеансе:

go-slidesMarp for VS Code
активация (загрузка модуля WebAssembly)189 мс—
первый предпросмотр52 мс78 мс
предпросмотр после правки (медиана)19 мс23–24 мс
.vsix7,5 МБ36,3 МБ

Данные относятся к расширению v0.3.0 (go-slides v0.8.0) на презентации из 100 слайдов, при наборе одного символа в слайде 50, по чередующимся раундам при средней загрузке за минуту ниже 8. Первый предпросмотр быстрее, чем у Marp, а предпросмотр после правки теперь тоже быстрее, чем у Marp.

В v0.8.0 и расширении v0.3.0

go-slides v0.8.0 хранит отрисованные слайды каждой открытой презентации и после правки заново отрисовывает только те, чей исходник или унаследованное состояние изменились (директивы, номер страницы, общее число, id заголовков, ссылки, исходные строки); результат совпадает с полной отрисовкой байт в байт. Набор символа в слайде 50 из 100 заново отрисовывает один слайд: 2,5 мс нативно, 11,5 мс в WebAssembly. Предпросмотр VS Code затем преобразует только DOM изменившегося слайда, а дымовой тест расширения набирает один символ в слайде 50 между замеряемыми отрисовками, для обоих расширений. Режим докладчика расширения синхронизируется через родительское окно (postMessage).

В v0.7.1 и расширении v0.2.2

go-slides v0.7.1 кэширует разобранные темы, собранные таблицы стилей и подсвеченный код между отрисовками, отмечает строки синхронной прокрутки, не двигаясь побайтно, и повторно использует свои writer’ы: отрисовка презентации из 100 слайдов выделяет 5,7 МБ против 52,7 МБ у расширения v0.2.0. Благодаря этому расширение v0.2.2 отказывается от переопределения GOGC=400. Для сравнения: расширению v0.2.1 требовалось 72 мс на первый предпросмотр и 44 мс после правки при GOGC по умолчанию (36 мс при GOGC=400), а v0.2.0 — 47–51 мс.

Расширение v0.2.2 показало 52 мс на первый предпросмотр и 24 мс после правки, вровень с 23 мс у Marp.

Created on by tannevaled

Modified on by tannevaled