// License: GPLv3 Copyright: 2022, Kovid Goyal, package readline import ( "fmt" "kitty/tools/tui/loop" "kitty/tools/wcswidth" ) var _ = fmt.Print const ST = "\x1b\\" const PROMPT_MARK = "\x1b]133;" type RlInit struct { Prompt string ContinuationPrompt string EmptyContinuationPrompt bool DontMarkPrompts bool } type Readline struct { prompt string prompt_len int continuation_prompt string continuation_prompt_len int mark_prompts bool loop *loop.Loop // The number of lines after the initial line cursor_y int // Input lines lines []string // The line the cursor is at currently cursor_line int // The offset into the text of the cursor line cursor_pos_in_line int } func New(loop *loop.Loop, r RlInit) *Readline { ans := &Readline{ prompt: r.Prompt, prompt_len: wcswidth.Stringwidth(r.Prompt), mark_prompts: !r.DontMarkPrompts, loop: loop, lines: []string{""}, } if r.ContinuationPrompt != "" || !r.EmptyContinuationPrompt { ans.continuation_prompt = r.ContinuationPrompt if ans.continuation_prompt == "" { ans.continuation_prompt = "> " } } if ans.mark_prompts { ans.prompt = PROMPT_MARK + "A" + ST + ans.prompt ans.continuation_prompt = PROMPT_MARK + "A;k=s" + ST + ans.continuation_prompt } return ans } func (self *Readline) Start() { self.loop.SetCursorShape(loop.BAR_CURSOR, true) self.Redraw() } func (self *Readline) Redraw() { self.loop.StartAtomicUpdate() self.RedrawNonAtomic() self.loop.EndAtomicUpdate() } func (self *Readline) RedrawNonAtomic() { self.redraw() } func (self *Readline) End() { self.loop.QueueWriteString("\r\n") self.loop.SetCursorShape(loop.BLOCK_CURSOR, true) if self.mark_prompts { self.loop.QueueWriteString(PROMPT_MARK + "C" + ST) } }