{"id":40473,"date":"2023-08-29T11:58:54","date_gmt":"2023-08-29T15:58:54","guid":{"rendered":"https:\/\/mjtsai.com\/blog\/?p=40473"},"modified":"2023-08-29T13:02:35","modified_gmt":"2023-08-29T17:02:35","slug":"chime-text-editor-now-open-source","status":"publish","type":"post","link":"https:\/\/mjtsai.com\/blog\/2023\/08\/29\/chime-text-editor-now-open-source\/","title":{"rendered":"Chime Text Editor Now Open Source"},"content":{"rendered":"<p><a href=\"https:\/\/github.com\/ChimeHQ\/Chime\">Chime<\/a>:<\/p>\n<blockquote cite=\"https:\/\/github.com\/ChimeHQ\/Chime\">\n<p>The code in this repo should be considered <strong>Non-Functional<\/strong> right now. You can <a href=\"https:\/\/www.chimehq.com\/download\" rel=\"nofollow\">download<\/a> the currently released version.<\/p>\n<p>Chime used to be commercial, but is now <a href=\"https:\/\/www.chimehq.com\/download\" rel=\"nofollow\">free<\/a>. It built up some pretty significant cruft over time. In particular, the core UI application architecture is just in a bad state. It is also quite complex to build. So, I've opted to re-implement that core and pull in parts as appropriate. I'll be putting an emphasis on extracting components into packages as I go. A fitting rebirth, I would say.<\/p>\n<\/blockquote>\n\n<p>There are also some interesting libraries, such as <a href=\"https:\/\/github.com\/ChimeHQ\/Rearrange\">Rearrange<\/a>:<\/p>\n<blockquote cite=\"https:\/\/github.com\/ChimeHQ\/Rearrange\"><p>Rearrange is a collection of utilities for making it easier to work with <code>NSRange<\/code> and <code>NSTextRange<\/code>. It&rsquo;s particularly handy when used with the Cocoa text system.<\/p><p>[&#8230;]<\/p><p>[<code>RangeMutation<\/code>] is a struct that encapsulates a single change to an <code>NSRange<\/code>. It&rsquo;s useful for serializing, queuing, or otherwise storing changes and applying them.<\/p><p>You can also use this class to tranform individual points or other <code>NSRange<\/code>s. This is handy for updating a set of stored <code>NSRange<\/code>s as text is changed. This might seem easy, but there are a large number of edge cases that <code>RangeMutation<\/code> handles, including mutations that invalidate (for example completely delete) a range.<\/p><\/blockquote>\n\n<p>See also: <a href=\"https:\/\/github.com\/coteditor\/CotEditor\">CotEditor<\/a>.<\/p>\n\n<p>Previously:<\/p>\n<ul>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2023\/07\/18\/extensionkit-and-xpc\/\">ExtensionKit and XPC<\/a><\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>Chime: The code in this repo should be considered Non-Functional right now. You can download the currently released version. Chime used to be commercial, but is now free. It built up some pretty significant cruft over time. In particular, the core UI application architecture is just in a bad state. It is also quite complex [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"apple_news_api_created_at":"2023-08-29T15:58:57Z","apple_news_api_id":"788d806e-be95-435a-89f1-b3a80e5c2b26","apple_news_api_modified_at":"2023-08-29T17:02:38Z","apple_news_api_revision":"AAAAAAAAAAAAAAAAAAAAAQ==","apple_news_api_share_url":"https:\/\/apple.news\/AeI2Abr6VQ1qJ8bOoDlwrJg","apple_news_coverimage":0,"apple_news_coverimage_caption":"","apple_news_is_hidden":false,"apple_news_is_paid":false,"apple_news_is_preview":false,"apple_news_is_sponsored":false,"apple_news_maturity_rating":"","apple_news_metadata":"\"\"","apple_news_pullquote":"","apple_news_pullquote_position":"","apple_news_slug":"","apple_news_sections":"\"\"","apple_news_suppress_video_url":false,"apple_news_use_image_component":false,"footnotes":""},"categories":[4],"tags":[69,2454,30,32,2385,74,71,1812,68,591],"class_list":["post-40473","post","type-post","status-publish","format-standard","hentry","category-programming-category","tag-cocoa","tag-coteditor","tag-mac","tag-macapp","tag-macos-14-sonoma","tag-opensource","tag-programming","tag-swiftui","tag-texteditor","tag-text-kit"],"apple_news_notices":[],"_links":{"self":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/40473","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/comments?post=40473"}],"version-history":[{"count":3,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/40473\/revisions"}],"predecessor-version":[{"id":40481,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/40473\/revisions\/40481"}],"wp:attachment":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/media?parent=40473"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/categories?post=40473"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/tags?post=40473"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}