Evaluate SwiftUI snippets using Emacs org babel.
Big thanks to Chris Eidhof, who tweeted a snippet to run any SwiftUI view as a macOS app. Much of ob-swiftui’s Swift code is based on that snippet as well as some additional tweaks he made (like writing to png).
(require 'ob-swiftui)
(ob-swiftui-setup)
Runs SwiftUI in a separate window (default and can be omitted).
Use a generated root view and render in external window (default):
#+begin_src swiftui
Rectangle()
.fill(Color.yellow)
.frame(maxWidth: .infinity, maxHeight: .infinity)
#+end_src
is equivalent to:
#+begin_src swiftui :results window :view none
Rectangle()
.fill(Color.yellow)
.frame(maxWidth: .infinity, maxHeight: .infinity)
#+end_src
If view: is given, use FooView as the root view. Otherwise, generate a root view and embed source block in view body.
#+begin_src swiftui :results window :view FooView
struct FooView: View {
var body: some View {
VStack(spacing: 10) {
BarView()
BazView()
}
}
}
struct BarView: View {
var body: some View {
Rectangle()
.fill(Color.yellow)
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
}
struct BazView: View {
var body: some View {
Rectangle()
.fill(Color.blue)
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
}
#+end_src
Runs SwiftUI in the background and saves an image snapshot to a file.
#+begin_src swiftui :results file
Rectangle()
.fill(Color.yellow)
.frame(maxWidth: .infinity, maxHeight: .infinity)
#+end_src
If executing the block does not refresh the inlined image, try adding org-redisplay-inline-images in a hook. org-babel-after-execute-hook
(add-hook 'org-babel-after-execute-hook (lambda ()
(when org-inline-image-overlays
(org-redisplay-inline-images))))