krz/orgstar

A native macOS editor for org-mode files. editor org-mode swift

Sources/OrgCore/Keymap/Presets.swift

85c633a83a4744bef9dde8b52462f9c2a1c037e4
orgstar/Sources/OrgCore/Keymap/Presets.swift history · blame · raw

262 lines · 6768 bytes

  1/// The keymaps the app ships. The user's `keymap.toml` is layered on top of the chosen one.
  2public enum KeymapPreset: String, Sendable, CaseIterable {
  3    case emacs, mac
  4
  5    public var title: String {
  6        switch self {
  7        case .emacs: "Emacs"
  8        case .mac: "Mac"
  9        }
 10    }
 11
 12    public var keymap: Keymap {
 13        var problems: [String] = []
 14        let map = try! Keymap(toml: toml, problems: &problems)
 15        precondition(problems.isEmpty, "preset \(rawValue): \(problems)")
 16        return map
 17    }
 18
 19    public var toml: String {
 20        switch self {
 21        case .emacs: Self.common + Self.emacsBindings
 22        case .mac: Self.common + Self.macBindings
 23        }
 24    }
 25
 26    static let common = """
 27        [[bind]]
 28        keys = "TAB"
 29        command = "org.cycle"
 30        when = "heading"
 31
 32        [[bind]]
 33        keys = "S-TAB"
 34        command = "org.cycle-global"
 35
 36        """
 37
 38    static let emacsBindings = """
 39        # Movement and editing. With a mark set (C-SPC), movement extends the region.
 40        [[bind]]
 41        keys = "C-f"
 42        command = "edit.forward-char"
 43        [[bind]]
 44        keys = "C-b"
 45        command = "edit.backward-char"
 46        [[bind]]
 47        keys = "C-n"
 48        command = "edit.next-line"
 49        [[bind]]
 50        keys = "C-p"
 51        command = "edit.previous-line"
 52        [[bind]]
 53        keys = "C-a"
 54        command = "edit.beginning-of-line"
 55        [[bind]]
 56        keys = "C-e"
 57        command = "edit.end-of-line"
 58        [[bind]]
 59        keys = "M-f"
 60        command = "edit.forward-word"
 61        [[bind]]
 62        keys = "M-b"
 63        command = "edit.backward-word"
 64        [[bind]]
 65        keys = "M-<"
 66        command = "edit.beginning-of-buffer"
 67        [[bind]]
 68        keys = "M->"
 69        command = "edit.end-of-buffer"
 70        [[bind]]
 71        keys = "C-v"
 72        command = "edit.scroll-up"
 73        [[bind]]
 74        keys = "M-v"
 75        command = "edit.scroll-down"
 76        [[bind]]
 77        keys = "C-l"
 78        command = "edit.recenter"
 79        [[bind]]
 80        keys = "C-d"
 81        command = "edit.delete-char"
 82        [[bind]]
 83        keys = "M-d"
 84        command = "edit.kill-word"
 85        [[bind]]
 86        keys = "M-DEL"
 87        command = "edit.backward-kill-word"
 88        [[bind]]
 89        keys = "C-k"
 90        command = "edit.kill-line"
 91        [[bind]]
 92        keys = "C-y"
 93        command = "edit.yank"
 94        [[bind]]
 95        keys = "C-SPC"
 96        command = "edit.set-mark"
 97        [[bind]]
 98        keys = "C-x h"
 99        command = "edit.select-all"
100        [[bind]]
101        keys = "C-w"
102        command = "edit.kill-region"
103        [[bind]]
104        keys = "M-w"
105        command = "edit.copy-region"
106        [[bind]]
107        keys = "C-/"
108        command = "edit.undo"
109        [[bind]]
110        keys = "C-_"
111        command = "edit.undo"
112        [[bind]]
113        keys = "C-x u"
114        command = "edit.undo"
115        [[bind]]
116        keys = "C-g"
117        command = "edit.keyboard-quit"
118        [[bind]]
119        keys = "C-t"
120        command = "edit.transpose-chars"
121        [[bind]]
122        keys = "C-s"
123        command = "edit.find"
124        [[bind]]
125        keys = "C-r"
126        command = "edit.find"
127
128        # Files and commands
129        [[bind]]
130        keys = "C-x C-s"
131        command = "app.save"
132        [[bind]]
133        keys = "C-x C-f"
134        command = "app.quick-open"
135        [[bind]]
136        keys = "C-x b"
137        command = "app.quick-open"
138        [[bind]]
139        keys = "M-x"
140        command = "app.palette"
141
142        # Org
143        [[bind]]
144        keys = "C-c C-t"
145        command = "org.todo.cycle"
146        [[bind]]
147        keys = "S-<right>"
148        command = "org.todo.cycle"
149        when = "heading"
150        [[bind]]
151        keys = "S-<up>"
152        command = "org.priority.up"
153        when = "heading"
154        [[bind]]
155        keys = "S-<down>"
156        command = "org.priority.down"
157        when = "heading"
158        [[bind]]
159        keys = "M-<left>"
160        command = "org.heading.promote"
161        when = "heading"
162        [[bind]]
163        keys = "M-<right>"
164        command = "org.heading.demote"
165        when = "heading"
166        [[bind]]
167        keys = "M-S-<left>"
168        command = "org.subtree.promote"
169        when = "heading"
170        [[bind]]
171        keys = "M-S-<right>"
172        command = "org.subtree.demote"
173        when = "heading"
174        [[bind]]
175        keys = "M-<up>"
176        command = "org.subtree.up"
177        when = "heading"
178        [[bind]]
179        keys = "M-<down>"
180        command = "org.subtree.down"
181        when = "heading"
182        [[bind]]
183        keys = "M-RET"
184        command = "org.heading.insert"
185        [[bind]]
186        keys = "C-RET"
187        command = "org.heading.insert-after-subtree"
188        [[bind]]
189        keys = "M-S-RET"
190        command = "org.heading.insert-todo"
191        [[bind]]
192        keys = "C-c C-n"
193        command = "org.heading.next"
194        [[bind]]
195        keys = "C-c C-p"
196        command = "org.heading.previous"
197        [[bind]]
198        keys = "C-c C-f"
199        command = "org.heading.forward-same-level"
200        [[bind]]
201        keys = "C-c C-b"
202        command = "org.heading.backward-same-level"
203        [[bind]]
204        keys = "C-c C-u"
205        command = "org.heading.up"
206        [[bind]]
207        keys = "C-c C-q"
208        command = "org.tags.set"
209
210        """
211
212    /// Standard Mac text keys stay as they are; org commands use Control-Command chords, which
213    /// macOS text editing leaves free.
214    static let macBindings = """
215        [[bind]]
216        keys = "C-s-t"
217        command = "org.todo.cycle"
218        [[bind]]
219        keys = "C-s-<up>"
220        command = "org.priority.up"
221        [[bind]]
222        keys = "C-s-<down>"
223        command = "org.priority.down"
224        [[bind]]
225        keys = "C-s-<left>"
226        command = "org.heading.promote"
227        [[bind]]
228        keys = "C-s-<right>"
229        command = "org.heading.demote"
230        [[bind]]
231        keys = "C-M-s-<left>"
232        command = "org.subtree.promote"
233        [[bind]]
234        keys = "C-M-s-<right>"
235        command = "org.subtree.demote"
236        [[bind]]
237        keys = "C-M-s-<up>"
238        command = "org.subtree.up"
239        [[bind]]
240        keys = "C-M-s-<down>"
241        command = "org.subtree.down"
242        [[bind]]
243        keys = "s-RET"
244        command = "org.heading.insert"
245        [[bind]]
246        keys = "C-s-RET"
247        command = "org.heading.insert-after-subtree"
248        [[bind]]
249        keys = "s-S-RET"
250        command = "org.heading.insert-todo"
251        [[bind]]
252        keys = "M-s-<down>"
253        command = "org.heading.next"
254        [[bind]]
255        keys = "M-s-<up>"
256        command = "org.heading.previous"
257        [[bind]]
258        keys = "C-s-q"
259        command = "org.tags.set"
260
261        """
262}