multiline

package module
v0.11.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 19, 2023 License: MIT Imports: 10 Imported by: 5

README

go-multiline-ny

Go Reference

This is the readline package that supports multiline input and extends go-readline-ny with new keybindings. It is compatible with Emacs.

Key Feature
Ctrl-M or Enter Insert a new line
Ctrl-J(or Ctrl-Enter[^X]) Submit all lines
Ctrl-P or Up Move the cursor to the previous line
Ctrl-N or Down Move the cursor to the next line
Alt-P or Ctrl-Up Fetch the previous lines-set of the history
Alt-N or Ctrl-Down Fetch the next lines-set of the history
Ctrl-Y Paste the string in the clipboard

[^X]: Only WindowsTerminal or Teraterm

Example

image

package main

import (
    "context"
    "fmt"
    "io"
    "os"
    "strings"

    "github.com/hymkor/go-multiline-ny"
    "github.com/mattn/go-colorable"
    "github.com/nyaosorg/go-readline-ny/simplehistory"
)

func main() {
    ctx := context.Background()
    fmt.Println("Ctrl-M or Enter      : Insert a linefeed")
    fmt.Println("Ctrl-P or UP         : Move to the previous line.")
    fmt.Println("Ctrl-N or DOWN       : Move to the next line")
    fmt.Println("Ctrl-J               : Submit")
    fmt.Println("Ctrl-C               : Abort.")
    fmt.Println("Ctrl-D with no chars : Quit.")
    fmt.Println("Ctrl-UP   or ALT-P   : Move to the previous history entry")
    fmt.Println("Ctrl-DOWN or ALT-N   : Move to the next history entry")

    var ed multiline.Editor
    ed.SetPrompt(func(w io.Writer, lnum int) (int, error) {
        return fmt.Fprintf(w, "[%d] ", lnum+1)
    })

    // To enable escape sequence on Windows.
    // (On other operating systems, it can be ommited)
    ed.SetWriter(colorable.NewColorableStdout())

    history := simplehistory.New()
    ed.SetHistory(history)
    ed.SetHistoryCycling(true)

    for {
        lines, err := ed.Read(ctx)
        if err != nil {
            fmt.Fprintln(os.Stderr, err.Error())
            return
        }
        L := strings.Join(lines, "\n")
        fmt.Println("-----")
        fmt.Println(L)
        fmt.Println("-----")
        history.Add(L)
    }
}

Example to swap Ctrl-J and Ctrl-M

package main

import (
    "context"
    "fmt"
    "os"
    "strings"

    "github.com/hymkor/go-multiline-ny"
    "github.com/mattn/go-colorable"
    "github.com/nyaosorg/go-readline-ny"
    "github.com/nyaosorg/go-readline-ny/keys"
    "github.com/nyaosorg/go-readline-ny/simplehistory"
)

func main() {
    var ed multiline.Editor

    ed.SetWriter(colorable.NewColorableStdout())
    history := simplehistory.New()
    ed.SetHistory(history)
    ed.SetHistoryCycling(true)

    ed.BindKey(keys.CtrlM, readline.AnonymousCommand(ed.Submit))
    ed.BindKey(keys.CtrlJ, readline.AnonymousCommand(ed.NewLine))

    ctx := context.Background()
    for {
        lines, err := ed.Read(ctx)
        if err != nil {
            fmt.Fprintln(os.Stderr, err.Error())
            return
        }
        L := strings.Join(lines, "\n")
        fmt.Println("-----")
        fmt.Println(L)
        fmt.Println("-----")
        history.Add(L)
    }
}

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Editor added in v0.4.0

type Editor struct {
	LineEditor readline.Editor
	// contains filtered or unexported fields
}

func (*Editor) BindKey added in v0.8.0

func (m *Editor) BindKey(key keys.Code, f readline.Command) error

func (*Editor) NewLine added in v0.8.0

func (m *Editor) NewLine(_ context.Context, b *readline.Buffer) readline.Result

func (*Editor) Read added in v0.4.0

func (m *Editor) Read(ctx context.Context) ([]string, error)

func (*Editor) SetColoring added in v0.6.6

func (m *Editor) SetColoring(c readline.Coloring)

func (*Editor) SetDefault added in v0.9.0

func (m *Editor) SetDefault(d []string)

func (*Editor) SetHistory added in v0.6.6

func (m *Editor) SetHistory(h readline.IHistory)

func (*Editor) SetHistoryCycling added in v0.6.7

func (m *Editor) SetHistoryCycling(value bool)

func (*Editor) SetMoveEnd added in v0.9.0

func (m *Editor) SetMoveEnd(value bool)

func (*Editor) SetPrompt added in v0.6.6

func (m *Editor) SetPrompt(f func(io.Writer, int) (int, error))

func (*Editor) SetWriter added in v0.6.6

func (m *Editor) SetWriter(w io.Writer)

func (*Editor) Submit added in v0.8.0

func (m *Editor) Submit(_ context.Context, B *readline.Buffer) readline.Result

func (*Editor) SwapEnter deprecated added in v0.6.7

func (m *Editor) SwapEnter() error

Deprecated:

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL