Pull to refresh

Идеи для Sublime от CudaText

Reading time7 min
Views8.3K

С 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, то есть она выполняется через плагин. В сайдбаре могут появляться новые кнопки, если плагины добавляют новые панели.


toolbar_sidebar


Добавление тулбара в Sublime не нарушило бы никаких прежних его технологий.


Статус-бар


В Sublime статус-бар бедный.


sub_statusbar


(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 будет отображать в статус-баре


  • Если одна каретка: 1crt
  • Если четыре каретки: 4crt
  • Если вертикальное выделение: vert

Еще Cuda позволяет настраивать, как долго нужно показывать текст в поле Сообщение.


Дерево кода


Стремление Sublime все представлять в текстовом виде понятно. Однако, отказ от панели Дерево, которая есть во всех IDE и продвинутых текстовых редакторах, очень болезненный. Можно применять «текстовое Дерево», размещенное в обычной вкладке (например, с плагином Outline), но оно слабо интегрировано с интерфейсом Sublime, и полноценной заменой не является.


В Cuda есть панель Code tree для отображения синтаксических элементов активного файла: функции/классов/полей для программных языков, тегов/ключей для разметочных языков.


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 есть настройки и команды для отображения Консоли в отдельном окне. Это позволяет удобно растянуть ее без ущерба для высоты основного текста и, например, поместить на второй монитор. Кроме того, можно отделить и панель с Деревом, чтобы не ограничивать ширину основного текста.
flow_panels


Кстати, пользователи 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) нужно учитывать. В помощь пользователям есть плагин, отображающий все настройки на всех уровнях в виде таблицы, упрощающий поиск и редактирование.
ops-dlg
Обратите внимание на колонку Section — настройки приписаны к узлам дерева. Это дает дополнительные сортировки и фильтры. Разметка для построения этого дерева включена в комментарии к настройкам в файле settings_default\default.json. Например, комментарий


// [UI/Listbox]`

припишет следующие за ним опции к узлу UI/Listbox. Дерево целиком тоже можно увидеть
ops-tree


Для Sublime аналогичный диалог вполне возможен:


  • Имя и семь уровней перекрытия — это всего лишь восемь колонок в таблице.
  • Форму и контролы можно взять из Tk или более продвинутой GUI-библиотеки Питона.
  • Изменение опций может приводить к изменениям в файлах и их перезагрузке при сохранении.

Мелочи


Есть несколько незначительных претензий, которым, конечно, правильное место не здесь, а в форуме техподдержки Sublime. Пусть будут для полноты.


  1. Не работают PgDn/PgUp в диалогах-списках, например, в Палитре Команд.
  2. Часто нужно вставить какой-нибудь хитрый символ, например, стрелку или дробь. Не хватает инструмента для просмотра/выбора всех юникод-символов. В Cuda такой инструмент есть в виде диалога Char map
    char-map
  3. Нет возможности задать индивидуальную раскраску ярлыков. Когда открыто много файлов, часто возникает желание пометить цветом ярлыки некоторых из них. В Cuda команда Set tab color... есть в локальном меню над ярлыком. Настроенные таким образом цвета сохраняется в сессии.

Заключение


Как же легко раздавать советы!


Но перечисленные выше соображения, на мой взгляд, не лишены пользы. Если в следующей версии Sublime Text что-то пригодится, будет хорошо. Кстати, может быть кто-то переведет и передаст идеи Скиннеру (Jon Skinner).

Tags:
Hubs:
+9
Comments26

Articles