Dziwna klawiatura podczas używania powłoki sqlite w systemie Linux

9

Używam linuksa połączonego przez kit. Używając go z bash, moja klawiatura działa dobrze, ale kiedy używam powłoki sqlite (program sqlite3), moje klawisze zwariowały:

del=^[[3~
up=^[[A
left=^[[D
right=^[[C
down=^[[B

oto moja env (odpowiednia część):

TERM=linux
SHELL=/bin/bash
SHLVL=1
INPUTRC=/etc/inputrc

Chciałbym używać moich kluczy normalnie na sqlite, tak jak na Windowsie.

moje inputrc:

# do not bell on tab-completion
#set bell-style none

set meta-flag on
set input-meta on
set convert-meta off
set output-meta on

# Completed names which are symbolic links to
# directories have a slash appended.
set mark-symlinked-directories on

$if mode=emacs

# for linux console and RH/Debian xterm
"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[5~": beginning-of-history
"\e[6~": end-of-history
"\e[3~": delete-char
"\e[2~": quoted-insert
"\e[5C": forward-word
"\e[5D": backward-word
"\e[1;5C": forward-word
"\e[1;5D": backward-word

# for rxvt
"\e[8~": end-of-line

# for non RH/Debian xterm, can't hurt for RH/DEbian xterm
"\eOH": beginning-of-line
"\eOF": end-of-line

# for freebsd console
"\e[H": beginning-of-line
"\e[F": end-of-line
$endif
kurast
źródło

Odpowiedzi:

9

(FYI: są to normalne sekwencje generowane przez te klawisze na większości terminali, interpretacja ich zależy od terminala lub programu / biblioteki. Możesz to pokazać na działającym terminalu, naciskając Ctrl+, va następnie naciskając klawisz Endlub znak inny niż znak, gdzie ctrl-V ustawia kolejne naciśnięcie klawisza, które będzie traktowane dosłownie.)

Wygląda na to, że twój sqlite3plik binarny nie używa readlinelub konfiguracja readline ( inputrc) jest zepsuta (mniej prawdopodobne, jeśli bashdziała poprawnie).

Możesz być w stanie potwierdzić / odrzucić, jeśli używasz readline z następującymi, zamień which sqlite3na pełną ścieżkę, jeśli nie ma tego w twoim PATH.

ldd `which sqlite3` 

Jeśli widzisz libreadline.solub coś podobnego, to powinno działać, więc sprawdź swoją INPUTRCzmienną środowiskową ~/.inputrci /etc/inputrc. Istnieje niewielka szansa, że ​​jest to statycznie powiązane ( libreadline.a), aby sprawdzić spróbuj:

strings -a `which sqlite3`| grep -i inputrc

Jeśli struny INPUTRC, ~/.inputrcczy /etc/inputrcsą obecne wygląda readline została statycznie połączone i powinien działać.

(W najlepszym wypadku można uzyskać tylko niektóre podstawowe informacje o wersji i kompilacji ( pragma compile_optionsjeśli są obsługiwane) sqlite3, ale nie pełny zestaw funkcji, dlatego musimy przejść do binarnego.)

Jeśli ani lddnie stringswskazuje readline, to prawie pewne, że plik binarny nie ma wsparcia.

W przeciwnym razie sprawdź tę odpowiedź: SQLite z obsługą readline na Ubuntu

Jeśli nie masz wsparcia readline w twoim sqlite3pliku binarnym, możesz go owinąć za pomocą jednego z:

rlwrap sqlite3
socat READLINE EXEC:"sqlite3"

Oba pozwalają określić plik historii w wierszu poleceń.

Możesz również sprawdzić swoje bashpowiązania readline, aby upewnić się, że readline działa i jest skonfigurowany zgodnie z oczekiwaniami:

bind -p | egrep '\[[ABCD3].?":'

W moim systemie (działającym bash-3.xw ramach rxvt) otrzymuję:

"\M-[3~": delete-char
"\M-[D": backward-char
"\M-[C": forward-char
"\M-[B": next-history
"\M-[A": previous-history

\Mto „meta”, co jest równoznaczne z ucieczką , więc tam, gdzie widzisz, „ \M-” „ \e” również powinno działać. Po wydrukowaniu symbol ucieczki jest przedstawiany jako ^[(control- [).

pan. spuratic
źródło
Dodałem mój inputrc, jeśli możesz spróbować wykluczyć tę możliwość
kurast
a mój ldd z sqlite nie pokazuje libreadline
kurast
1
To prawdopodobnie nie ma realdine wsparcie wtedy, albo uaktualnić swój pakiet (problemy ze zgodnością Sprawdź, czy trzeba uaktualnić wersję) lub użycie rlwrapjako obejście. Odpowiedź zaktualizowana.
mr. Spuratic
Mój plik binarny nie jest statycznie powiązany, a mój wynik wiązania jest podobny do twojego. Jednak nie mam ani rlwrap ani socat w mojej instalacji i nie mam dostępu do konta root, aby je zainstalować.
kurast