2016-12-30 2 views
1

Я ищу, чтобы разрешить пользователям редактировать существующую строку.

Edit the following string: Edit me 
# After user delete and add characters 
Edit the following string: Edit you 

Я думал предварять некоторые данные в $ но стандартный ввод кажется, что это не возможно, и в любом случае ИМХО это слишком радикальное решение.

Кто-то сказал мне использовать Ruby-оболочку GNU Readline, поэтому я быстро просмотрел, и я нашел Readline#pre_input_hook, который действует до того, как Readline начнет принимать входные данные.

Я пробовал:

require 'readline' 
Readline.pre_input_hook = -> { "Edit me" } 
result = Readline.readline("Edit the following string: ") 
puts result 

Но, похоже, не работает.

+0

Я не понимаю вопроса. Что вы пытаетесь достичь здесь? Каков желаемый пользовательский интерфейс (ввод/вывод)? –

+0

Я хочу, чтобы пользователь мог начать с существующего ввода, поэтому вместо того, чтобы вводить все с нуля, у нее уже есть вход для редактирования. –

+1

Это будет очень сложно реализовать ... Это не так, как обычно работают интерфейсы командной строки. Гораздо чаще используется опция по умолчанию (строка или список). Например, посмотрите, как работают ['tty-prompt'] (https://github.com/piotrmurach/tty-prompt) и [' highline'] (https://github.com/JEG2/highline) , –

ответ

2
begin 
    system("stty raw -echo") 
    print (acc = "Edit me: ") 
    loop.each_with_object(acc) do |_,acc| 
    sym = $stdin.getc 
    case sym.ord 
    when 13 # carriage return 
     break acc 
    when 127 # backspace 
     print "\e[1D \e[1D" 
     acc.slice!(acc.length - 1) if acc.length > 0 
    else  # regular symbol 
     print sym 
     acc << sym 
    end 
    end 
ensure 
    system("stty -raw echo") 
    puts 
    puts "\e[0mEntered: |#{acc}|" 
end 

Здесь вы идете. Дополнительная информация о terminal control sequences. Также, ANSI terminal codes.

Смежные вопросы