mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
readline: add custom prompt feature
This commit is contained in:
parent
93716ee944
commit
510fb2a981
@ -39,6 +39,7 @@ mut:
|
||||
cursor int // Cursor position
|
||||
overwrite bool
|
||||
cursor_row_offset int
|
||||
prompt string
|
||||
}
|
||||
|
||||
|
||||
@ -107,10 +108,12 @@ fn (r Readline) read_char() byte {
|
||||
// Main function of the readline module
|
||||
// Will loop and ingest characters until EOF or Enter
|
||||
// Returns the completed line
|
||||
pub fn (r mut Readline) read_line() string {
|
||||
pub fn (r mut Readline) read_line(prompt string) string {
|
||||
r.current = ''
|
||||
r.cursor = 0
|
||||
r.prompt = prompt
|
||||
|
||||
print(r.prompt)
|
||||
for {
|
||||
c := r.read_char()
|
||||
a := r.analyse(c)
|
||||
@ -235,15 +238,17 @@ fn calculate_screen_position(x_in int, y_in int, screen_columns int, char_count
|
||||
}
|
||||
|
||||
// Will redraw the line
|
||||
// TODO: Fix if prompt is longer than terminal columns
|
||||
fn (r mut Readline) refresh_line() {
|
||||
mut end_of_input := [0, 0]
|
||||
calculate_screen_position(0, 0, get_screen_columns(), r.current.len, mut end_of_input)
|
||||
calculate_screen_position(r.prompt.len, 0, get_screen_columns(), r.current.len, mut end_of_input)
|
||||
end_of_input[1] += r.current.count('\n')
|
||||
mut cursor_pos := [0, 0]
|
||||
calculate_screen_position(0, 0, get_screen_columns(), r.cursor, mut cursor_pos)
|
||||
calculate_screen_position(r.prompt.len, 0, get_screen_columns(), r.cursor, mut cursor_pos)
|
||||
|
||||
shift_cursor(0, -r.cursor_row_offset)
|
||||
term.erase_toend()
|
||||
print(r.prompt)
|
||||
print(r.current)
|
||||
if end_of_input[0] == 0 && end_of_input[1] > 0 {
|
||||
print('\n')
|
||||
@ -264,14 +269,9 @@ fn (r mut Readline) insert_character(c byte) {
|
||||
// Overwriting
|
||||
}
|
||||
r.cursor++
|
||||
// Simply print new character if at end of line
|
||||
// Otherwise refresh the line if cursor != r.current.len
|
||||
if r.cursor == r.current.len && r.current.len < get_screen_columns() {
|
||||
print(c.str())
|
||||
} else {
|
||||
// Refresh the line to add the new character
|
||||
r.refresh_line()
|
||||
}
|
||||
}
|
||||
|
||||
// Removes the character behind cursor.
|
||||
fn (r mut Readline) delete_character() {
|
||||
|
Loading…
Reference in New Issue
Block a user