2011-01-12 20 views
5

Jeśli wykonuję odwrotne interaktywne wyszukiwanie w irb, a następnie wprowadź znak kontrolny (klawisze strzałek są jedynymi, które widziałem z faktycznie). Więc zacznę z tej sesji:Dlaczego irb wstawia znaki kontrolne do bufora do interaktywnego wyszukiwania wstecznego?

$ irb 
>> print "hello" 
hello 

następnie wprowadzić ^r, h

$ irb 
>> print "hello" 
hello 
(reverse-i-search)`he': print "hello" 

tak daleko tak dobry. Następnie uderzam w strzałkę w lewo i kończę z tym:

$ irb 
>> print "hello" 
hello 
>> print "[Dhello" 

Kolejne użycie strzałek przesuwa kursor w normalny sposób.

+2

Proponuję dodać tag 'readline'. –

Odpowiedz

3

to nie rozwiąże problemu, ale przynajmniej mogę odpowiedzieć na pytanie prosiłeś (dlaczego):

Strzałka w lewo zostaje wprowadzony do terminalu w postaci trzech znaków, ESC [i D. (można to sprawdzić wpisując read i wciskając strzałkę w lewo, który wyświetla ^[[D, gdzie ^[ jest jak postać ucieczka zostanie wygenerowana.)

Jakoś irb podnosi znak ESC gdy nie powinno; więc ESC kończy wyszukiwanie historii, a [D wpisuje się dosłownie. Patrząc na inne programy używające readline, Bash i Python zachowują się poprawnie, ale ledit (tak, niejasne - przepraszam ^^) również ma ten problem.

Jeśli ktoś nie zna rozwiązania tego problemu, jedynym rozwiązaniem, które mogę wymyślić jest naciśnięcie klawisza ESC zamiast klawisza strzałki w celu zakończenia wyszukiwania historii. Lub wciskanie Enter, jeśli nie musisz dalej edytować, oczywiście.

+1

Nie wiedziałem/zdałem sobie sprawy, że trafienie w ESC wybierze element historii, a także pozostawi mój kursor w miejscu, więc samo w sobie jest bardzo użyteczne. (Robiłem kontrolę - a lub kontrolowałem - e) –

1

Czy masz włączony tryb edycji vi?

~ $ irb 
1.9.3p392 :001 > Readline.vi_editing_mode? 
    => true 

miałem okazało się w moim pliku $HOME/.inputrc poprzez set editing-mode vi. Wyłączenie go "naprawiło" moje klawisze strzałek.

Jak wspomniano w @JoLiss, inne programy readline (bash itp.) Również działały poprawnie; AFAICT, to problem z Rubinem. Zobacz: http://bugs.ruby-lang.org/issues/7859#change-36333