A => .gitignore +6 -0
@@ 1,6 @@
+# environment files (e.g. managed by direnv) and other secrets
+/.env*
+
+# output files for different tools, e.g. code coverage
+/*.out
+
A => .golangci.toml +30 -0
@@ 1,30 @@
+[linters]
+ disable-all = true
+ enable = [
+ "deadcode",
+ "errcheck",
+ "gochecknoinits",
+ "gochecknoglobals",
+ "gofmt",
+ "golint",
+ "gosec",
+ "gosimple",
+ "govet",
+ "ineffassign",
+ "interfacer",
+ "misspell",
+ "nakedret",
+ "prealloc",
+ "staticcheck",
+ "structcheck",
+ "typecheck",
+ "unconvert",
+ "unparam",
+ "unused",
+ "varcheck",
+ ]
+
+[issues]
+ # regexps of issue texts to exclude
+ exclude = [
+ ]
A => README.md +4 -0
@@ 1,4 @@
+# mauve
+
+[![GoDoc](https://godoc.org/git.sr.ht/~mna/mauve?status.svg)](https://godoc.org/git.sr.ht/~mna/mauve)
+
A => cmd/mauve-keys/mauve_keys.go +34 -0
@@ 1,34 @@
+package main
+
+import (
+ "fmt"
+ "log"
+
+ "github.com/pkg/term"
+ "github.com/tj/go-terminput"
+)
+
+func main() {
+ t, err := term.Open("/dev/tty")
+ if err != nil {
+ log.Fatalf("error: %s\n", err)
+ }
+
+ t.SetRaw()
+ defer t.Restore()
+
+ fmt.Printf("Type something, use 'q' to exit.\r\n")
+
+ for {
+ e, err := terminput.Read(t)
+ if err != nil {
+ log.Fatalf("error: %s\n", err)
+ }
+
+ if e.Key() == terminput.KeyEscape || e.Rune() == 'q' {
+ break
+ }
+
+ fmt.Printf("%s (%d) — shift=%v ctrl=%v alt=%v meta=%v\r\n", e.String(), e.Key(), e.Shift(), e.Ctrl(), e.Alt(), e.Meta())
+ }
+}
A => doc/design.md +20 -0
@@ 1,20 @@
+# mauve - a text editor
+
+## concepts
+
+* editor: the mauve instance
+* terminal: the tty instance used for I/O
+* document: the document being edited, might not be a "file" yet (e.g. not saved to disk, no path/name)
+* buffer: a loaded instance of a document in memory - typically a 1:1 relationship?
+* view: a view in a buffer, each view is independent and may have different positions, cursors, modes, etc.
+* cursor: an input position into a view, each view may have multiple cursors
+* selection: a range of selected text, each cursor may have a selection, and the cursor may be at the start or end of it
+* mode: the current edit mode, each view has a distinct edit mode
+* settings: a layered set of options, loaded from system-global, user file, environment variables, command-line flags, and view-specific.
+* global settings: a layered set of options that apply to the mauve instance as a whole (e.g. status bar visibility, color scheme, ...)
+
+* global marks : via extension mechanisms?
+* local marks : via extension mechanisms?
+* recorded macros : via extension mechanisms?
+* highlights (*not* text selections) : maybe not first-class concept, implement via extension mechanisms?
+* search : via extension mechanisms?
A => doc/mauve_concepts.drawio +1 -0
@@ 1,1 @@
+<mxfile host="Electron" modified="2019-11-26T16:16:51.859Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/12.2.2 Chrome/78.0.3904.94 Electron/7.1.0 Safari/537.36" etag="GEh_OKscpK4vonHhQ4D3" version="12.2.2" type="device" pages="1"><diagram id="pgsMLVG_pbv6QXweCJr3" name="Page-1">7Ztbb6M4FMc/TR634p70sU3bmYfubNWutNOnkQNO8BZwZJxbP/0eg801lCSTBLRiVGnwwTd8/vbPt4zMabj9xtDS/5N6OBgZmrcdmQ8jw9A13YD/hGWXWhzLTg0LRjwZKTe8kU+sUkrring4LkXklAacLMtGl0YRdnnJhhijm3K0OQ3KpS7RAtcMby4K6tZ/iMf91Dqxtdz+HZOFr0rWNfkmRCqyNMQ+8uimYDIfR+aUUcrTp3A7xYFoPNUuabqnhrdZxRiO+J4EdPavaA9DC9AMfJJEwB7hlKUJVT4/f3gf+vp7zH/92H1om1/vrjv+Q7ezCmYFx3ynGiXekDBAEYTuXZ8E3jPa0ZWoRMyR+6FC9z5l5JNGHInidTDAa8alj02tFONNpASzsM5JEExpADUVpZmaNnHnc2GHmAX7U/IP7IyuIg97shARS5ahWyos664llWD0I3OmIdLjGOK/qJbUMtMzirmquvKeeOuh2E/KEwEUkEUEzy6kxlC1+7R915hxvG30lV5o4G+YhpizHUSRCUxHikb2GksGN7kEdRXFL8pPiQ1J2S+yrHNlwIN0qgpKrewX2l6BmLKcNQpWUhQj416k4jgcmXeiCpwzMltxLOWfywfahWeOUA6NaKKnou+lSTVwgOcimWhYAh30Tpo5XYrMlsgl0eI5ifNg5ZZX2TrCRCHtPEjc6BPPw1EiHo44mmXyWFIS8aT17Hv4g++cajf2yIaKTyGs52H4E9EZaDKCb0Ek8S0GzWyw0M1hQmjvfwV5SDmYB8rh9ng1HOZ+fVxz/yKgM5SME5hzaPe45vZh1LjwqOFY1xs1DhwmjGGYuOQwMe73MGHso0TFy9iD+ZYMwtcSvnvFAeKERo/5m1L3FJ3P56EaHnDk3YmJHgQfX0MUeX8lckhGjX0v8JbwnyotPL8Lj4Kr0tDDVjo4CexUIILm+FkMFFKJYJ4sCal06deKT/y6S0OL0BVzcSsSYPaL2AKfIoqiCrR9o4AysqT91+Uq79OGLONFdIV8FLK08ihk6hV5pZ8qUxVnuJWM7EpGRjWjtClqGSVSzT78N9Sr19QLQ3VIIoG5gW3XZdukd2irq2NA2/nQ1iSH3qDN7CPaTsTUKUg8I9qyjZ1WtDUsi66FtsoglIWPJZteyUivZnRhspl18XrUXYVYFjeQ7YpkM6rTHLt7tjkD2y7ItrT79Zdt1m07246g1q5AGO3GmkwKlNFvNF1Rp2HpBYEXzAh8muhxqa0AVvCQTxcUJuVFqLorts5GiRyLOQnfSyC8+OpN+bQVcU3a6AhxVlVkpyLOrGZ0YcSpQbSg4dlqPsdsANy1AWcbvQOcPexLXhJwtrZfEH0BnG2dFXD/02WZmgW2MivtTQOzfptZdk2Wa4I3A7E6P0hzuidW/cQ1JVZIPZwSS9zuUAYD+q7YeFfNMeDrGHz1/PTdnrTjq32JdPIKTgFIrt9EUx25fiutzs5ILDWtaydWxxuJllkeYBzzRGTZlYzsakYNyAL3ol0hmux3jRV2KptU6pCvqV5j48v48JDW4Lz8rO9bDJdROrvCVp2Vdc9QZziyuyg2b/uNTWffov8LbA5Hdu1dqZ20Hd9GqYxCY+1Ma0OnmtGF14ZO/cgOZlGxus09kK271aHT/X6mU985GMh2PrI5PT+wc/ZtDpy+n7kbnX5mdt6DvjMSS22gtBKrydnXIpZT+e2Hc+r9ySqyxlfeznTq2xQxDrArZlMDtbpej/WAWuPhR0QXpdak39QaH7AeO5Ran5jRv6laUnlPJMiiKSAdsVDK4JfdHrn6dX/n0Ov+44az1o4WWJNzHb6dj1YQzH9lm0bPf6tsPv4H</diagram></mxfile><
\ No newline at end of file
A => mauve.go +18 -0
@@ 1,18 @@
+package mauve
+
+import "io"
+
+// Concepts:
+//
+// - terminal: the tty instance used for I/O
+// - document: the document being edited, might not be a "file" yet (e.g. not saved to disk, no path/name)
+// - buffer: a loaded instance of a document in memory - typically a 1:1 relationship?
+// - view: a view in a buffer, each view is independent and may have different positions, cursors, modes, etc.
+// - cursor: an input position into a view, each view may have multiple cursors
+// - selection: a range of selected text, each cursor may have a selection, and the cursor may be at the start or end of it
+// - mode: the current edit mode, each view has a distinct edit mode
+// - settings: a layered set of options, loaded from system-global, user file, environment variables, command-line flags, and view-specific.
+
+type Input struct {
+ r io.Reader // the terminal, typically
+}