8

Se voglio avere un prompt sul terminale con un valore predefinito già digitato, come posso farlo?Cosa mi darà qualcosa di simile a ruby ​​readline con un valore predefinito?

Ruby serie Readline.readline() mi permette di impostare la storia ma non riempire un valore di default (per quanto posso dire, almeno)

Vorrei qualcosa di simile:

codice:

input = Readline.readline_with_default('>', 'default_text') 

console:

> default_text| 
+0

Un esempio o illustrazione potrebbe rendere questa domanda più chiara. –

+1

è difficile dare un esempio per il comportamento della console interattiva, ma ecco un tentativo. – jes5199

+0

hai bisogno che l'utente sia in grado di modificare il testo predefinito, come backspace, o semplicemente vuoi leggere una riga vuota come testo predefinito? –

risposta

1

Highline non fa esattamente quello che descrivi, ma forse è abbastanza vicino.

2

Sto lottando con la stessa cosa.

Il modo in cui lo sto facendo in questo momento è:

options = ["the_text_you_want"] 
question = "use TAB or up arrow to show the text > " 

Readline.completion_append_character = " " 
Readline::HISTORY.push options.first 
Readline.completion_proc = proc { |s| options.grep(/^#{Regexp.escape(s)}/) } 

while value = Readline.readline(question, true) 
    exit if value == 'q' 
    puts value.chomp.strip #do something with the value here 
end 

sì, è stupido, ma è stato l'unico modo che ho trovato per farlo.

qualcuno ha trovato una soluzione a questo?

+1

Sì, c'è una soluzione, cerca l'elemento' pre_input_hook' in giro. –

5

+1 a Highline

provare con qualcosa di simile:

require 'highline/import' 
input = ask('> ') {|q| q.default = 'default_text'} # > |default_text| 
+0

E cosa fanno le barre verticali (nel commento) significare? –

+0

Questo è l'output come lo vedresti. Se non inserisci nulla, l'input è impostato su 'default_text'. – rainkinz

+1

@rainkinz: Quindi, l'utente dovrà vedere le barre verticali, non sarà ? In qualche modo insolito: inserire qualcosa non solo dopo il pr ompt, ma tra due barre verticali. –

4

quello che chiedete è possibile con Readline. C'è un callback in cui è possibile ottenere il controllo dopo la visualizzazione del prompt e inserire del testo nel buffer di lettura.

questo ha funzionato per me:

Readline.pre_input_hook = -> do 
    Readline.insert_text "hello.txt" 
    Readline.redisplay 

    # Remove the hook right away. 
    Readline.pre_input_hook = nil 
end 

input = Readline.readline("Filename: ", false) 
puts "-- input:#{input.inspect}" 

BTW, ho piuttosto cercato di usare HighLine, ma sembrava essere un no-alternative, a me. Uno dei motivi deludenti è stato il fatto che lo HighLine#ask legge i tasti di spostamento del cursore come input regolare. Ho smesso di guardare in quella direzione dopo quella specie di scoperta.

+0

Questo è esattamente quello che stavo cercando! Grazie! – wrzasa