一个 Swift DSL,用于修改文本缓冲区。
一次性表达多个更改的意图。
我们用声明式 DSL 替换过程式代码来实现这一点。
代表用户对文本视图进行更改并提供正确的撤销支持,通常需要:
如果您想一次修改文本中的多个位置,仅索引反转就使代码更难理解。
将用户的选择扩展到整行,然后将文本包装在 GitHub 风格的 Markdown 围栏代码块中,并将插入点放在开头的三个反引号之后
buffer.evaluate(in: buffer.selectedRange) { selectedRange in
// Expand selection to the whole block (full lines).
Select(LineRange(selectedRange)) { lineRange in
// In that range, attempt to wrap the selected text
// in two lines to make it a code block.
// (Abort if the text view doesn't permit changes.)
Modifying(lineRange) { rangeToWrap in
Insert(rangeToWrap.location) { Line("```") }
Insert(rangeToWrap.endLocation) { Line("```") }
}
// Move insertion point to the
// position after the opening backticks
Select(lineRange.location + length(of: "```"))
}
}
我们操作 文本缓冲区 的抽象来执行更改。
这使得可以在多个缓冲区上一次性使用声明式 API,而无需将文本放入 UI 组件进行渲染。
NSTextView
是一个缓冲区。 您可以使用此声明式 API 对屏幕上的文本视图进行更改。
您还可以使用纯内存缓冲区对不想渲染的内容进行文本修改。 这使您能够将多个文件读入应用程序中的缓冲区,并使用声明式 API 更改其内容,同时仅在文本视图中渲染单个选定的文件。
版权所有 © 2024 Christian Tietze。 版权所有。 根据 MIT 许可证分发。