Редактор кода

Открытие, подсветка и форматирование

Текстовые/кодовые файлы открываются в редакторе (Scintilla) с подсветкой синтаксиса. Есть комментирование/раскомментирование (Ctrl+/), перемещение и дублирование строки, закладки (Ctrl+F2), список символов/функций, автодополнение по словам, направляющие отступов, перенос строк, масштабирование и обнаружение изменений файла на диске. При включённом версионировании на полях отмечаются строки, добавленные или изменённые с последней версии.

Есть также макросы (запись/воспроизведение последовательности правок клавишами Ctrl+Shift+R / F4, в Инструменты → Выполнить → Макросы), форматирование/причёсывание (Shift+Alt+F), таблица ASCII на панели инструментов вкладки (для вставки символов/псевдографики) и орфографический словарь (Hunspell). pt-BR и en-US встроены сразу; остальные языки скачиваются по требованию из таблицы в Настройки → Заметки и письмо → Орфография (по одной строке на язык, с кнопкой Скачать/Удалить). Чтобы следить за растущим лог-файлом, используйте кнопку Мониторинг (tail -f) на панели инструментов самой вкладки. Очень большие файлы (свыше ~1 МБ) открываются в виртуализированном облегчённом редакторе, который загружает только видимые фрагменты; его можно вызвать принудительно через Открыть → Открыть в облегчённом редакторе... Если памяти не хватает, чтобы проиндексировать все строки, полоса редактора предупреждает об этом, и доступны только первые строки.

Форматирование и линтинг: Shift+Alt+F форматирует документ. JSON, XML и SQL LightNote форматирует сам, ничего не нужно устанавливать, — и меняет только пробелы: порядок ключей, числа и тексты остаются такими, как вы их написали. Учитывается тип, показанный в строке состояния, а не только расширение: во вкладке черновика вставьте JSON, выберите тип JSON и отформатируйте (текст, начинающийся с {, [ или <, распознаётся и без выбора). При ошибке текст не меняется: место подчёркивается красным, курсор переходит к нему, а строка состояния называет строку, столбец и причину (не хватает запятой, ключ без кавычек…). Стрелка кнопки форматирования предлагает Сжать (JSON или XML в одну строку), а при выделении обе команды действуют только на выделенный фрагмент — удобно для JSON внутри строки журнала. Текст, в котором на каждой строке записан полный документ JSON (JSON Lines, он же NDJSON — частый формат журналов и выгрузок), распознаётся и форматируется построчно, не превращаясь в один документ.

F7 выполняет проверку: JSON и XML проверяются прямо в тексте, без сохранения; для остальных языков запускается линтер (ruff, eslint, shellcheck, luacheck…), который отмечает проблемы в редакторе и на панели Проблемы (нижняя область, с переходом по клику). Для остальных языков используется внешний форматтер (black, prettier, clang-format, gofmt, rustfmt…); если для типа его ещё нет, форматирование, F7 и F5 открывают помощник, который показывает только инструменты для этого типа, сообщает, какие уже установлены, и устанавливает выбранный одним щелчком (или принимает команду другой программы). Полные списки находятся в Настройки → Инструменты кода → Форматтеры по языкам и → Линтеры по языкам, вместе с опциями форматировать при сохранении / проверять при сохранении. Запустите файл на панели вывода клавишей F6 (фиксирует код завершения и длительность, можно остановить/перезапустить) или только фрагмент — клавишей F8.

Преобразование из одного формата в другой: подменю Преобразовать есть в меню Правка, в стрелке кнопки форматирования, в меню типа в строке состояния и в контекстном меню редактора — в том числе в заметке. Оно действует на выделение, а если ничего не выделено — на весь текст. Вверху указано, что распознано («Выделение: JSON», «Весь текст: CSV»), и сначала идут преобразования, подходящие к этому содержимому; остальные собраны в группы и, если не подходят, показаны серым с причиной. Есть JSON ↔ YAML, JSON ↔ XML (атрибуты становятся @имя), JSON ↔ CSV и JSON → таблица Markdown (вложенный объект становится столбцом a.b), CSV ↔ таблица Markdown, CSV → INSERT SQL, JSON Lines (NDJSON) ↔ массив JSON, HTML ↔ Markdown, параметры URL ↔ JSON, Base64, кодирование URL, HTML-сущности, строка JSON и метка времени Unix ↔ дата ISO 8601. Порядок ключей и числа остаются такими, как вы их написали, а CSV распознаёт ; из Excel. Преобразование всего текста меняет и тип вкладки (CSV, ставший таблицей, становится Markdown), но расширение файла остаётся прежним — строка состояния об этом сообщает. В JSON подменю Имена полей переименовывает только ключи в camelCase, PascalCase, snake_case или kebab-case: значения, числа и отступы остаются как есть, и ничего не меняется, если два поля одного объекта получили бы одинаковое имя. Стили имён (camelCase, PascalCase, snake_case, kebab-case и CONSTANT_CASE) находятся в Правка → Регистр, под ВЕРХНИМ и нижним регистром и «Каждое Слово С Заглавной». Они действуют на выделение или, без выделения, на имя под курсором — никогда на весь файл — и меняют только имена: кавычки, двоеточия и фигурные скобки остаются на месте. Строка, состоящая из одной фразы («customer name»), превращается в одно имя (customerName).

Файл .md, открытый как код, возвращается к заметке одним щелчком. На панели редактора появляется Открыть как заметку, когда открытый файл — заметка. Это обратная операция к Открыть как → Код из меню дерева: вкладка возвращается к виду заметки с форматированным редактированием, чтением, оглавлением и свойствами. Кнопка появляется только когда переключение возможно: слишком большая заметка остаётся в редакторе кода.

Мультикурсор, история и определение

Дополнительные возможности редактирования: мультикурсор по вхождениям (Ctrl+D, все сразу — Alt+F3), дублирование строки (Ctrl+Shift+D), объединение строк (Ctrl+Shift+J), расширение/ сужение выделения по области видимости (Ctrl+Shift+Space / Ctrl+Alt+Space), прямоугольное выделение (Alt+перетаскивание), свернуть/развернуть все блоки, сниппеты (Ctrl+J, редактируются в Настройки → Редактор), Перейти к символу в файле (# в палитре) и в проекте (Ctrl+T или ##), история навигации (Alt+←/→), дорожка «хлебных крошек» в верхней части редактора, линейки колонок, подсветка парных скобок цветом, автозакрытие/оборачивание парных символов и очистка при сохранении (обрезка пробелов, финальный перевод строки) — всё в Настройки → Редактор.

Фрагменты по Tab. Наберите триггер и нажмите Tab: в SQL-файле sf превращается в SELECT * FROM TABLE;, где TABLE уже выделено — наберите имя таблицы, и Tab перейдёт к следующему полю (Shift+Tab — назад, Esc — выход). Готовы sf, sc, sw, sj, sg, ins, upd и del (последние два сразу с WHERE). Каждый фрагмент действует в одном языке или во всех, а в Настройки → Редактор можно создать свои для любого языка, с полями ${1:NAME}, повторами $1 и конечной позицией курсора $0; щелчок правой кнопкой по выделению предлагает Создать фрагмент из выделения. Фрагменты появляются и в списке автодополнения. Пока список открыт, Tab принадлежит ему; чтобы Tab не разворачивал фрагменты, выключите Разворачивать фрагменты по Tab — Ctrl+J продолжает работать.

Локальная история и буфер обмена: при каждом сохранении LightNote хранит версию файла (Файл → Локальная история…, с возможностью восстановления), независимо от Git. Ctrl+Alt+V открывает историю буфера обмена для вставки ранее скопированного элемента. Ctrl+Shift+T заново открывает последнюю закрытую вкладку; вкладки можно закрепить (контекстное меню) — это защищает их от освобождения при простое.

Перейти к определению: F12 или Ctrl+щелчок по идентификатору переходит к месту его определения в рабочем пространстве; Shift+F12 находит его использования.

Мини-карта и операции с текстом

Мини-карта. У правого края редактора показывается миниатюра всего документа: она передаёт «форму» кода (цвета подсветки синтаксиса в уменьшенном виде) и отмечает видимую область. Щёлкните или перетащите по ней, чтобы перейти в любое место файла. Включается в Вид → Мини-карта или в Настройки → Редактор. Кнопка Мини-карта на панели самой вкладки кода (рядом с ASCII) включает и выключает её, не покидая редактор. Вдоль левого края миниатюры идёт полоса меток: синим — строки с закладкой (тот же кружок, что и на поле), янтарным — совпадения быстрого поиска. Так с одного взгляда видно, как они распределены по всему файлу, включая части за пределами экрана.

Операции с текстом. В меню Правка — и в контекстном меню редактора — есть подменю Строки (переместить, дублировать, удалить, отсортировать, объединить, перевернуть, пронумеровать) и Очистка (убрать пробелы, удалить пустые/повторяющиеся строки, табуляции ↔ пробелы). При выделении контекстное меню также предлагает Сохранить выделение в новый файл…: фрагмент записывается в файл рядом с текущим и открывается во вкладке (оригинал не меняется).

Отступы, комментарии и скобки

Отступ файла. В строке состояния, рядом с кнопкой конца строки, кнопка Пробелы: 4 (или Табуляция: 4) показывает, как вкладка делает отступы. Щелчок открывает меню: Отступ пробелами или Отступ табуляцией, Ширина отступа (2, 3, 4 или 8 столбцов), Преобразовать отступ в пробелы и в табуляцию (переписывает отступы уже существующих строк), Определить по содержимому и Использовать по умолчанию — последнее сохраняет выбор для новых файлов. Выбранное здесь действует для этой вкладки.

Откуда берётся отступ. При открытии файла LightNote ищет .editorconfig в его папке и в папках выше (до файла с root = true) и применяет indent_style, indent_size и tab_width; trim_trailing_whitespace и insert_final_newline действуют при сохранении, а end_of_line и charset — только для нового файла. Без .editorconfig он смотрит на строки самого файла и берёт найденный отступ, если он однозначен; иначе остаётся значение по умолчанию. Порядок такой: .editorconfig, затем файл, затем значение по умолчанию из Настройки → Редактор, где находятся Отступ по умолчанию, Определять отступ каждого файла при открытии и Учитывать .editorconfig рабочего пространства.

Умный отступ. Enter после {, ( или [ — и после : в конце строки, только в Python — открывает следующую строку на уровень глубже. Между {} Enter раскрывает блок на три строки с курсором в средней, и одно нажатие Ctrl+Z отменяет всё. Скобка }, ) или ], набранная в пустой строке, возвращается к отступу строки, которая её открыла. Чтобы Enter только копировал отступ строки выше, отключите Умный отступ в Настройки → Редактор.

Комментарии, скобки и автодополнение. Ctrl+/ комментирует в синтаксисе языка, который использует вкладка, — в том числе в черновике без файла и когда вы меняете подсветку синтаксиса в строке состояния, — а там, где у языка есть только блочный комментарий (HTML, CSS), использует блочный. Ctrl+Shift+\ переводит курсор к парной круглой, квадратной или фигурной скобке, а Ctrl+Shift+Alt+\ выделяет до неё; обе команды есть и в контекстном меню. После слов документа список автодополнения предлагает ключевые слова языка (def, return…), даже те, которых ещё нет в файле. А Вид → Номера строк скрывает или показывает поле с номерами.

Недавние вкладки (Ctrl+Tab)

Ctrl+Tab возвращает к вкладке, которой вы пользовались до этого, в той же панели, — а не к соседней. Если удерживать Ctrl, каждое нажатие Tab спускается по списку недавних вкладок, который появляется посередине панели; отпустив Ctrl, вы открываете выбранную, а Esc отменяет. Ctrl+Shift+Tab идёт в обратном порядке. У каждой панели свой список, закрытая вкладка из него исчезает, а при одной вкладке ничего не появляется.

Панели рядом и сеткой

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

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

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

Готовые макеты. Окно → Макет (есть и в кнопке Разделить) расставляет сетку за один раз: 1 панель, 2 столбца, 3 столбца или Сетка 2×2. Применение макета никогда не закрывает вкладки: вкладки лишней панели переходят к соседней, которая остаётся, а терминалы не меняются. Выровнять размеры делает столбцы каждой строки одинаковой ширины, а строки — одинаковой высоты. Макет, который не помещается на этом экране, показан неактивным, и подсказка объясняет почему.

Пустая панель. Панель, которую макет создаёт пустой, показывает Перетащите сюда вкладку или щёлкните здесь и откройте файл: щелчок выбирает её, и следующий открытый файл попадёт в неё. Сама она не исчезает; её убирает кнопка Закрыть панель.

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

С клавиатуры. Ctrl+Alt+PgDn и Ctrl+Alt+PgUp переводят фокус на следующую и на предыдущую панель, по строкам, по кругу; терминалы тоже учитываются. В Окно → Макет есть также Переместить вкладку в следующую панель и Переместить вкладку в предыдущую панель.

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

Задачи проекта

Сборка, тесты и lint проекта запускаются без перехода в терминал, через Инструменты → Задачи проекта. LightNote сам находит задачи открытой папки: scripts из package.json (через npm, pnpm или yarn — по имеющемуся lock-файлу), цели Makefile, buildPresets из CMakePresets.json, cargo build/test/run/check в проекте Rust, pytest в настроенном для него pyproject.toml и рецепты justfile.

Свои задачи. Задачи, написанные вручную, хранятся в tasks.json в формате VS Code (версия 2.0.0), который читается из .vscode/tasks.json и из .lightnote/tasks.json: если у вас уже есть файл VS Code, писать ничего не нужно. Поддерживаются label, type (shell или process), command, args, options.cwd и options.env, group с isDefault, блоки windows/linux/osx, комментарии и переменные ${workspaceFolder}, ${file}, ${fileDirname} и ${fileBasenameNoExtension}. Файл с ошибкой показывается в меню с причиной и пропускается; читается до 200 задач.

Запуск. Выберите задачу в меню или нажмите Ctrl+Shift+B, чтобы запустить задачу по умолчанию: выбранную в Инструменты → Задачи проекта → Задача по умолчанию (хранится для каждой папки); если выбора нет — ту, что tasks.json помечает isDefault; если нет и её — LightNote спрашивает, какую запустить. Вывод идёт в панель вывода, с кодом выхода и кнопкой остановки. Изменить задачи проекта открывает .vscode/tasks.json, если он есть, или создаёт .lightnote/tasks.json с примером. Если программа задачи не установлена, строка состояния называет её и предлагает Внешние программы.

Языковые серверы (LSP)

Без настройки переход к определению, поиск использований, переименование и автодополнение ищут по имени: это быстро, но без понимания области видимости. Языковой сервер (LSP) — отдельная программа, та же, что использует VS Code, которая действительно понимает язык. По умолчанию он выключен: включите его в Настройки → Инструменты кода, в группе Языковые серверы (LSP), или в Инструменты → Языковой сервер → Использовать языковые серверы (LSP). У каждого типа файлов свой сервер: pyright (Python), typescript-language-server (JavaScript и TypeScript), clangd (C и C++), gopls (Go), rust-analyzer (Rust), lua-language-server (Lua) и bash-language-server (shell).

Что меняется. Когда сервер работает, F12 переходит к определению, на которое он указывает, Shift+F12 показывает настоящие использования в панели поиска, а переименование меняет только нужный символ: LightNote спрашивает «Переименовать в N файлах?», меняет открытые вкладки (в каждой это отменяется одним Ctrl+Z) и записывает закрытые файлы, сохраняя их кодировку. Автодополнение предлагает то, что советует сервер, ошибки подчёркиваются и выводятся в панели Проблемы, подсказка над именем показывает его тип и документацию, а Shift+Alt+F форматирует через сервер, если для этого типа не настроен форматировщик. Если сервер не отвечает, медлит (автодополнение ждёт 1,5 с) или не знает ответа, работает поиск по имени, как раньше; настроенный линтер продолжает работать при Ctrl+S.

Индикатор и установка. В строке состояния индикатор показывает сервер вкладки и его состояние (pyright · готов, запуск…, ошибка, не установлен); щелчок по нему открывает Перезапустить сервер, Остановить сервер, Показать журнал… и настройку. Для установки используйте Инструменты → Языковой сервер → Настроить для .py…: тот же помощник, что и для форматировщиков, показывает команду и устанавливает в один щелчок — простое открытие вкладки никогда не предлагает ничего устанавливать. Сервер запускается с первой вкладкой своего типа и останавливается через 5 минут после закрытия последней; одновременно работают не более 4 серверов, файл больше 1 МБ ему не отправляется, а для каждого файла показывается до 500 ошибок.

Указатель

Редактирование

Инструменты

Автоматизация (ИИ / скрипты)

Справочник