С 2012 года использую для просмотра и изменения почти всех текстовых файлов, логов и программных кодов на языках VFP/JS/Python/XML/HTML редакторы, созданные Алексеем Торгашиным: сначала это был SynWrite, теперь его потомок CudaText. Осознанно выбрал именно его редактор из списка опробованных, в который входили, в том числе, AkelPad, Notepad++ и Sublime Text. Решающей оказалась отзывчивость техподдержки — Алексей принимал от пользователей огромное число пожеланий/претензий и быстро их реализовывал. Поясню. Число пожеланий/претензий было все годы примерно равномерное, а после перехода три года назад на ГитХаб стало измеримым и оценивается мной как 400 пожеланий/год и 100 багов/год. Приятно удивляет, что расширение функционала по просьбам трудящихся не сказывалось на надежности редактора в целом. А когда ресурс устойчивого развития SynWrite был исчерпан, возник CudaText.
У меня с Алексеем случаются беседы на разнообразные темы. Недавно он перечислил "чего в Sublime не хватает". Мне это показалось интересным, и мы договорились представить эти идеи на Хабре. Дальше будет изложение тезисов от Алексея в моей редактуре.
Потратив несколько лет на создание своей программы, по другому смотришь на результаты конкурентов. Замечаешь в них не только удачные черты (их либо уже применил, либо хочешь применить), но и недостатки. Покажу, что можно было бы улучшить в Sublime Text (далее Sublime), если сравнивать его с моим CudaText (далее Cuda). При этом подчеркиваю, что мой редактор возник, когда Sublime уже был широко распространенным, многие его идеи были базовыми для Cuda:
- Текстовые конфиг-файлы
- Перекрытие настроек
- Мульти-каретки
- Плагины на Питоне
- Палитра всех команд
Sublime жестко навязывает текстово-командный стиль работы.
Например.
- Нет диалогов для настройки — есть только json-файлы (их много).
- Нет дополнительных контролов в диалоге ПоискПоФайлам — вместо них “язык” для заполнения текстовых полей.
Такой стиль эффективен, гибок и расширяем, но требует от пользователя непрерывного доучивания. Для новичков это создает заметный порог вхождения.
Cuda старается быть более доступным инструментом. Это оказывается возможным, так как он создается в среде Lazarus, предоставляющей богатый GUI арсенал и переносимость между Win/Linux/Mac. В результате гибкость json-настроек в Cuda сочетается с диалог-плагинами, например, ПоискПоФайлам (есть хабр-обзор), редактор настроек и прочими.
Попробую высказать несколько идей, как можно улучшить Sublime. Конечно, это лишь мое частное мнение.
Тулбары
В Sublime нет тулбаров. Так проявляется его текстово-командный стиль. Видимо, предполагается, что полезное место для редактируемого кода важнее. Можно все команды вызывать либо из меню, либо из Палитры по именам, либо через хоткеи. Есть явный недостаток у такого подхода — нужно заранее знать либо имя команды, либо ее хоткей. А ведь существование нужной команды и ее имя далеко не всегда очевидны.
Настраиваемый, в том числе отключаемый, тулбар — одна из деталей, которая снижает порог использования.
У Cuda есть горизонтальный настраиваемый тулбар для вызова команд и вертикальный сайдбар для переключения панелей: Дерево, Проект, Консоль. За настройку тулбара отвечает API, то есть она выполняется через плагин. В сайдбаре могут появляться новые кнопки, если плагины добавляют новые панели.
Добавление тулбара в Sublime не нарушило бы никаких прежних его технологий.
Статус-бар
В Sublime статус-бар бедный.
(1) Переключатель панелей Консоль/Поиск/Замена/ПоФайлам
(2) Сообщение
(3) Кодировка
(4) Тип EOL
(5) Настройка Tab
(6) Синтаксис
Из этих шести полей только два (Кодировка и EOL) можно спрятать через конфиг, и в поле Сообщение плагины могут добавлять/удалять пары ключ=значение. Ни спрятать, ни переставить, ни настроить остальные поля нельзя. Особенно странно, что важная информация о каретке(ах)/выделении(ях) попадает внутрь поля Сообщение, где перемешивается с текстами от команд.
В Cuda пользователь может в user.json
для полей статус-бара указать их последовательность, ширину и выравнивание:
"ui_statusbar_panels": "caret,L,250|msg,L,0|lexer,L,70|tabsize,L,70"
а заполнение поля caret
(информация о каретках/выделениях), можно настроить раздельно, применяя макроподстановки. Например, так
"ui_statusbar_no_sel": "r={y}/{count} c={xx}",
"ui_statusbar_carets": "carets={carets} top/bot={y}/{y2}",
"ui_statusbar_col_sel":"r={y}/{count} c={xx} s=[{sel} x {cols}]",
В результате таких настроек Cuda будет отображать в статус-баре
- Если одна каретка:
- Если четыре каретки:
- Если вертикальное выделение:
Еще Cuda позволяет настраивать, как долго нужно показывать текст в поле Сообщение.
Дерево кода
Стремление Sublime все представлять в текстовом виде понятно. Однако, отказ от панели Дерево, которая есть во всех IDE и продвинутых текстовых редакторах, очень болезненный. Можно применять «текстовое Дерево», размещенное в обычной вкладке (например, с плагином Outline
), но оно слабо интегрировано с интерфейсом Sublime, и полноценной заменой не является.
В Cuda есть панель Code tree
для отображения синтаксических элементов активного файла: функции/классов/полей для программных языков, тегов/ключей для разметочных языков.
Интеграция:
- Отображение синхронное, то есть дерево отображает состояние кода сразу после его изменения (с настраиваемой задержкой).
- Выделенный узел дерева синхронизирован с положением каретки в коде.
- Узлы дерева используются для выделения блоков, перемещения каретки и других операций.
Кроме того API Cuda позволяет создать новую панель с деревом и наполнить ее. Плагин Project Manager
как раз это и делает.
Папки с настройками и плагинами
Для пользователя, не глубоко погрузившегося в мануалы Sublime, ситуация с размещением настроек/пакетов/плагинов по папкам выглядит запутанной. Ошарашивает уже первый шаг внутри свежеустановленного редактора: по команде меню Preferences -- Settings
открываются два файла, один из которых (умолчательные настройки) в титуле редактора виден как (в Win)
Sublime Text 3/Packages/Default/Preferences.sublime-settings
но ни такого файла, ни такой папки на диске нет. В целом, логика в таком фокусе угадывается. Умолчательные настройки должны быть зашиты в код редактора, а будут они продублированы в каком-нибудь файле или нет — это на усмотрение разработчика. Sublime притворяется, что они в файле.
В Cuda умолчательные настройки тоже зашиты, но при этом в сборке есть реальный файл
settings_default\default.json
в котором они продублированы и прокомментированы. Наличие такого файла создает удобство не только для пользователей, но и для плагинов. Например, редактор настроек, извлекает из этого файла и сам список опций, и комментарии к ним, и разметку для распределения опций по дереву.
С пакетами в Sublime случаются аналогичные заморочки — ищешь их в Packages
и не находишь.
Хотя Cuda не обладает такой мощной базой дополнительных пакетов, как Sublime, но логика размещения у Cuda прозрачная. Например, для плагинов есть одна папка py
, в которой видны все — и стандартные, и доустановленные. Для тем есть папка data/themes
, для сниппетов — data/snippets
, для лексеров — data/lexlib
.
Package Control
Странная ситуация с плагином Package Control
. С одной стороны, из коробки Sublime приходит без этого плагина. С другой, почти ничего серьезного без него сделать нельзя — без дополнений редактор весьма куцый. Даже размещение плагина в меню Preferences
, а не в Tools--Packages
указывает на его особый статус. Видимо, какие-то “авторские права” мешают включить этот плагин в сборку Sublime.
В Cuda несколько плагинов (сейчас 10), в том числе Addons Manager
, входят в дистрибутив.
Плавающие панели
У Sublime монолитная компоновка окна, то есть Консоль и группы вкладок располагаются вместе. Можно запустить несколько экземпляров, но в каждом из них всегда будут вкладки и, может быть, Консоль.
В Cuda есть настройки и команды для отображения Консоли в отдельном окне. Это позволяет удобно растянуть ее без ущерба для высоты основного текста и, например, поместить на второй монитор. Кроме того, можно отделить и панель с Деревом, чтобы не ограничивать ширину основного текста.
Кстати, пользователи Atom (или VS Code) хотели бы иметь плавающие панели, но разработчики отказали, сославшись на ограничения в Electron. Так что это могло бы стать преимуществом Sublime над прямыми конкурентами.
Настроечный плагин
У Sublime более ста настроек ядра (107 в версии 3.1.1) и шесть дополнительных перекрывающихся уровней для размещения измененных значений:
(1) Packages/Default/Preferences (<platform>).sublime-settings
(2) Packages/User/Preferences.sublime-settings
(3) <Project Settings>
(4) Packages/<syntax>/<syntax>.sublime-settings
(5) Packages/User/<syntax>.sublime-settings
(6) <Buffer Specific Settings>
Легко представить ситуацию, когда чисто ручное сопровождение даже малой части от 700 значений (100 ключей на 7 уровнях) становится проблемой.
В Cuda настроек ядра почти 300, а дополнительных уровней для их перекрытия три:
(1) settings/user.json
(2) settings/lexer <syntax>.json
(3) <File Settings>
Проблема та же – слишком много значений (до 300*4) нужно учитывать. В помощь пользователям есть плагин, отображающий все настройки на всех уровнях в виде таблицы, упрощающий поиск и редактирование.
Обратите внимание на колонку Section
— настройки приписаны к узлам дерева. Это дает дополнительные сортировки и фильтры. Разметка для построения этого дерева включена в комментарии к настройкам в файле settings_default\default.json
. Например, комментарий
// [UI/Listbox]`
припишет следующие за ним опции к узлу UI/Listbox
. Дерево целиком тоже можно увидеть
Для Sublime аналогичный диалог вполне возможен:
- Имя и семь уровней перекрытия — это всего лишь восемь колонок в таблице.
- Форму и контролы можно взять из Tk или более продвинутой GUI-библиотеки Питона.
- Изменение опций может приводить к изменениям в файлах и их перезагрузке при сохранении.
Мелочи
Есть несколько незначительных претензий, которым, конечно, правильное место не здесь, а в форуме техподдержки Sublime. Пусть будут для полноты.
- Не работают
PgDn
/PgUp
в диалогах-списках, например, в Палитре Команд. - Часто нужно вставить какой-нибудь хитрый символ, например, стрелку или дробь. Не хватает инструмента для просмотра/выбора всех юникод-символов. В Cuda такой инструмент есть в виде диалога
Char map
- Нет возможности задать индивидуальную раскраску ярлыков. Когда открыто много файлов, часто возникает желание пометить цветом ярлыки некоторых из них. В Cuda команда
Set tab color...
есть в локальном меню над ярлыком. Настроенные таким образом цвета сохраняется в сессии.
Заключение
Как же легко раздавать советы!
Но перечисленные выше соображения, на мой взгляд, не лишены пользы. Если в следующей версии Sublime Text что-то пригодится, будет хорошо. Кстати, может быть кто-то переведет и передаст идеи Скиннеру (Jon Skinner).