Contents

wildthink/lineeditor

A tiny Swift wrapper around the system libedita.a line editor.

Example Usage

Refer to repl.swift for the complete example.

The CommandREPLRunner makes it easy to wrap your ParsableCommands with and interactive REPL.


struct HelloWorld: ParsableCommand {
    ...
}

@main
struct DemoMain {
    static func main() throws {
        try CommandREPLRunner(cmd: HelloWorld.self).run()
    }
}

Or you can easily "roll-your-own" evaluater loop.

struct ExampleLineEditor {
    
    @MainActor
    func run() {
        var editor = LineEditor(historyPrefix: "repl")
        
        /// Configure a small set of completion candidates for demonstration.
        editor.setCompletions([
            "help", "hello", "halt", "history", "host", "hover",
            "exit", "list", "load", "save"
        ])
        
        print("Libedit demo. Tab for completion, Ctrl-D to quit.")
        
        /// Read, evaluate, and print loop.
        /// - Exits on `.exit`
        editor.readEvaluateLoop(prompt: "repl > ") { line in
            if line == ".exit" { return .exit }
            print("echo: \(line)")
            return .step
        }
    }
}

Installation

You can add LineEditor to an Xcode project by adding it to your project as a package.

https://github.com/wildthink/LineEditor

If you want to use LineEditor in a SwiftPM project, it's as simple as adding it to your Package.swift:

dependencies: [
  .package(url: "https://github.com/wildthink/LineEditor", from: "1.0.4"),
]

And then adding the product to any target that needs access to the library:

    .product(name: "LineEditor", package: "LineEditor"),

Package Metadata

Repository: wildthink/lineeditor

Default branch: main

README: README.md