multiline

package module
v0.20.2 Latest Latest
Warning

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

Go to latest
Published: Feb 19, 2025 License: MIT Imports: 11 Imported by: 6

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[^Y]
Ctrl-J/Enter or Escape-Enter Submit all lines
Ctrl-P or Up Move cursor to previous line or last line of previous set of inputs in history
Ctrl-N or Down Move cursor to next line or first line of next set of inputs in history
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
Ctrl-R Incremental search

[^Y]: It is possible to give the condition to submit.

Example

image

package main

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

    "github.com/mattn/go-colorable"

    "github.com/nyaosorg/go-readline-ny"
    "github.com/nyaosorg/go-readline-ny/simplehistory"

    "github.com/hymkor/go-multiline-ny"
)

func main() {
    ctx := context.Background()
    fmt.Println("C-m or Enter      : Insert a linefeed")
    fmt.Println("C-p or UP         : Move to the previous line.")
    fmt.Println("C-n or DOWN       : Move to the next line")
    fmt.Println("C-j or Esc+Enter  : Submit")
    fmt.Println("C-c               : Abort.")
    fmt.Println("C-D with no chars : Quit.")
    fmt.Println("C-UP   or M-P     : Move to the previous history entry")
    fmt.Println("C-DOWN or M-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)
    })
    ed.SetPredictColor(readline.PredictColorBlueItalic)

    ed.Highlight = []readline.Highlight{
        // Words -> dark green
        {Pattern: regexp.MustCompile(`(?i)(SELECT|INSERT|FROM|WHERE|AS)`), Sequence: "\x1B[33;49;22m"},
        // Double quotation -> light magenta
        {Pattern: regexp.MustCompile(`(?m)"([^"\n]*\\")*[^"\n]*$|"([^"\n]*\\")*[^"\n]*"`), Sequence: "\x1B[32;49;1m"},
        // Single quotation -> light red
        {Pattern: regexp.MustCompile(`(?m)'([^'\n]*\\')*[^'\n]*$|'([^'\n]*\\')*[^'\n]*'`), Sequence: "\x1B[31;49;1m"},
        // Number literal -> light blue
        {Pattern: regexp.MustCompile(`[0-9]+`), Sequence: "\x1B[34;49;1m"},
        // Comment -> dark gray
        {Pattern: regexp.MustCompile(`(?s)/\*.*?\*/`), Sequence: "\x1B[30;49;1m"},
        // Multiline string literal -> dark red
        {Pattern: regexp.MustCompile("(?s)```.*?```"), Sequence: "\x1B[31;49;22m"},
    }
    ed.ResetColor = "\x1B[0m"
    ed.DefaultColor = "\x1B[37;49;1m"

    // 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)
    }
}

Terminate input only if you type Enter when it ends with a semicolon

package main

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

    "github.com/atotto/clipboard"
    "github.com/mattn/go-colorable"

    "github.com/nyaosorg/go-readline-ny/simplehistory"

    "github.com/hymkor/go-multiline-ny"
)

type OSClipboard struct{}

func (OSClipboard) Read() (string, error) {
    return clipboard.ReadAll()
}

func (OSClipboard) Write(s string) error {
    return clipboard.WriteAll(s)
}

func main() {
    ctx := context.Background()
    fmt.Println("C-m or Enter      : Submit when lines end with `;`")
    fmt.Println("                    Otherwise insert a linefeed.")
    fmt.Println("C-j               : Submit always")
    fmt.Println("C-c               : Abort.")
    fmt.Println("C-D with no chars : Quit.")

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

    ed.SubmitOnEnterWhen(func(lines []string, _ int) bool {
        return strings.HasSuffix(strings.TrimSpace(lines[len(lines)-1]), ";")
    })

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

    // Use the clipboard of the operating system.
    ed.LineEditor.Clipboard = OSClipboard{}

    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)
    }
}

Acknowledgements

Release notes

Documentation

Index

Constants

This section is empty.

Variables

View Source
var NewLineMarkForIncrementalSearch = "\u21B2 "

NewLineMarkForIncrementalSearch is the string used instead of "\n". This variable is not guaranteed to remain valid in the future.

Functions

This section is empty.

Types

type Editor added in v0.4.0

type Editor struct {
	LineEditor readline.Editor
	Dirty      bool

	StatusLineHeight int
	Highlight        []readline.Highlight
	ResetColor       string
	DefaultColor     string
	// 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) CmdBackwardChar added in v0.11.2

func (m *Editor) CmdBackwardChar(ctx context.Context, b *readline.Buffer) readline.Result

func (*Editor) CmdBackwardDeleteChar added in v0.11.2

func (m *Editor) CmdBackwardDeleteChar(ctx context.Context, b *readline.Buffer) readline.Result

func (*Editor) CmdDeleteChar added in v0.11.2

func (m *Editor) CmdDeleteChar(ctx context.Context, b *readline.Buffer) readline.Result

func (*Editor) CmdForwardChar added in v0.11.2

func (m *Editor) CmdForwardChar(ctx context.Context, b *readline.Buffer) readline.Result

func (*Editor) CmdNextHistory added in v0.11.2

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

func (*Editor) CmdNextLine added in v0.11.2

func (m *Editor) CmdNextLine(ctx context.Context, rl *readline.Buffer) readline.Result

func (*Editor) CmdPreviousHistory added in v0.11.2

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

func (*Editor) CmdPreviousLine added in v0.11.2

func (m *Editor) CmdPreviousLine(ctx context.Context, rl *readline.Buffer) readline.Result

func (*Editor) CmdYank added in v0.11.2

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

func (*Editor) CursorLine added in v0.11.1

func (m *Editor) CursorLine() int

func (*Editor) GotoEndLine added in v0.11.1

func (m *Editor) GotoEndLine() func()

func (*Editor) Lines added in v0.11.1

func (m *Editor) Lines() []string

func (*Editor) NewLine added in v0.8.0

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

func (*Editor) NewPrefixCommand added in v0.18.1

func (m *Editor) NewPrefixCommand(prompt string) *PrefixCommand

func (*Editor) Read added in v0.4.0

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

func (*Editor) SetColoring deprecated added in v0.6.6

func (m *Editor) SetColoring(c interface{})

Deprecated: set LineEditor.Highlight instead

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) SetPredictColor added in v0.16.0

func (m *Editor) SetPredictColor(colors [2]string)

SetPredictColor enables the prediction of go-readline-ny v1.5.0 and specify the colors (e.g.) `m.SetPredictColor([...]string{"\x1B[3;22;34m", "\x1B[23;39m"})`

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) SubmitOnEnterWhen added in v0.12.0

func (m *Editor) SubmitOnEnterWhen(f func([]string, int) bool)

SubmitOnEnterWhen defines the condition to submit when Enter-key is pressed.

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

func (m *Editor) SwapEnter() error

Deprecated:

func (*Editor) Sync added in v0.11.2

func (m *Editor) Sync(line string)

type PrefixCommand added in v0.11.1

type PrefixCommand struct {
	readline.KeyMap
	// contains filtered or unexported fields
}

func (*PrefixCommand) Call added in v0.11.1

func (cx *PrefixCommand) Call(ctx context.Context, B *readline.Buffer) readline.Result

func (*PrefixCommand) String added in v0.11.1

func (*PrefixCommand) String() string

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL
JackTT - Gopher 🇻🇳