Многие из нас уже работали с Monaco Editor. Он используется в Visual Studio Code, StackBlitz и многом другом. Это действительно быстрый и красивый редактор кода, и лично мне и многим другим людям он очень нравится. Он имеет открытый исходный код и распространяется под лицензией MIT License, поэтому вы можете использовать его в любом проекте, который хотите и как хотите.

Таким образом, возникла потребность в простом редакторе кода для приложения, полностью написанного на SwiftUI (и взаимодействующего с AppKit) для macOS.

Введение

Прежде всего, я решил сделать это полностью нативно и попробовал доступную библиотеку с открытым исходным кодом, написанную на Swift, и это было очень плохо. Потом я решил написать что-нибудь сам, и это было просто ужасно. Я чувствовал себя действительно подавленным в тот момент. После нескольких часов размышлений я решил просто использовать Monaco Editor и взаимодействовать с ним с помощью API WebKit.

В начале я искал похожие решения и нашел одно. Это была та же идея: просто оболочка Monaco Editor, написанная на Swift, которая взаимодействует с Monaco Editor через API WebKit. Это SwiftMonacoEditor. Он относительно новый (последний коммит на данный момент был 24 августа 2020 г.), но он был написан для iOS/iPadOS, и мне нужна была поддержка конкретно для macOS. Кроме того, в нем нет поддержки подсветки синтаксиса (есть, но она работает не так, как я хотел), поэтому я решил сделать что-то подобное со всеми необходимыми мне функциями.

И я сделал это за день. Я назвал его SwiftyMonaco. Это простая библиотека (можно линковать статически и динамически по вашему желанию), которая позволяет вам использовать редактор Monaco Editor из SwiftUI.

Конечный продукт

Давайте рассмотрим несколько примеров. Прежде всего, вы можете использовать его как обычный редактор:

Мы просто используем представление SwiftyMonaco и передаем ему привязку text. Это похоже на обычное представление TextEditor в SwiftUI.

Подсветка синтаксиса

Теперь давайте сделаем что-нибудь с подсветкой синтаксиса. В примерах показано, как использовать подсветку синтаксиса для Swift, C++ и Verilog/SystemVerilog:

Как видите, достаточно просто передать SyntaxHighlight в модификатор syntaxHighlight, и вы получите подсветку синтаксиса в представлении SwiftyMonaco.

Появления

Как вы знаете, все мы любим темный режим, поэтому SwiftyMonaco прекрасно работает с темным режимом. Внешний вид синхронизируется с внешним видом системы, поэтому, когда вы меняете внешний вид в своей системе или используете автоматическое изменение внешнего вида, все будет работать отлично.

И, очевидно, SwiftyMonaco отлично работает и в облегченном режиме.

Вывод

SwiftyMonaco имеет открытый исходный код и распространяется под лицензией Apache License 2.0. Я глубоко хочу поблагодарить вас за чтение этой истории и буду признателен, если вы захотите помочь мне с этим проектом. Вы можете делать все, что хотите: отправлять вопросы об ошибках или запрашивать функции, добавлять свой собственный код или поддерживать меня на Патреоне (я из Беларуси, так что в основном это единственный способ, который хоть как-то здесь работает). Я буду очень признателен за любые предложения, потому что я понимаю, что код, который я написал для этого проекта, совершенно далек от совершенства, поэтому оставьте свои мысли по этому поводу.