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

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- [).


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.