Дивна клавіатура при використанні sqlite оболонки на Linux


9

Я використовую linux box, пов'язаний через шпаклівку. Використовуючи його з bash, моя клавіатура спрацьовує добре, але коли я використовую оболонку sqlite (програма sqlite3), мої клавіші божеволіють:

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

ось моя енв (відповідна частина):

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

Я хотів би використовувати свої клавіші зазвичай на sqlite, як це робиться у Windows.

мій 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

Відповіді:


9

(FYI: це звичайні послідовності, згенеровані цими клавішами на більшості терміналів, інтерпретувати їх слід до терміналу або програми / бібліотеки. Це можна показати на робочому терміналі, натиснувши клавішу Ctrl+, vпотім натиснувши клавішу Endабо іншу не символьну клавішу, де ctrl-V встановлює наступне натискання клавіш, яке слід обробляти буквально.)

Здається, що ваш sqlite3двійковий файл не використовується readline, або конфігурація readline ( inputrc) порушена (менше ймовірність, якщо bashпрацює нормально).

Можливо, ви зможете підтвердити / заперечити, якщо використовується лінія читання з наступним, замініть which sqlite3на повний шлях, якщо він не є у вашому PATH.

ldd `which sqlite3` 

Якщо ви бачите libreadline.soчи подібне, це має спрацювати, тому перевірте INPUTRCзмінну середовища ~/.inputrcта /etc/inputrc. Існує невеликий шанс статично пов'язаного ( libreadline.a), щоб перевірити спробу:

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

Якщо рядки INPUTRC, ~/.inputrcабо /etc/inputrcприсутні, схоже , Readline статично пов'язані між собою , і повинен працювати.

(У кращому випадку ви можете отримати лише базову версію і зібрати інформацію ( pragma compile_optionsякщо вона підтримується) sqlite3, але не повний набір функцій, саме тому нам потрібно пікнути бінарним.)

Якщо ні, lddні stringsвказувати читання рядків, то майже впевнене, що двійковий файл не має підтримки.

В іншому випадку перевірте цю відповідь: SQLite із підтримкою читання на Ubuntu

Якщо у вас немає Readline підтримки в sqlite3довічним ви можете обернути його з допомогою одного з:

rlwrap sqlite3
socat READLINE EXEC:"sqlite3"

Обидва дозволяють вам вказати файл історії в командному рядку.

Ви також можете перевірити bashприв'язки для читання рядків, щоб переконатися, що функція readline працює та налаштована так, як очікувалося:

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

У моїй системі (працює bash-3.xв межах rxvt) я отримую:

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

\Mце "мета", що еквівалентно втечі , тож там, де ви бачите, " \M-" \e"має працювати також. Під час друку « Екстра» представляється як ^[(control- [).


Я додав свій inputrc, якщо ви можете поглянути, щоб виключити цю можливість
kurast

а мій ldd sqlite не показує libreadline
kurast

1
Тоді, мабуть, немає підтримки realdine, або оновити пакет (перевірити проблеми сумісності, якщо вам доведеться оновити версію), або використовувати rlwrapяк спосіб вирішення. Відповідь оновлено.
mr.spuratic

Мій бінарний файл не є статично пов'язаним, а також мій вихідний зв'язок такий, як ваш. Однак у мене немає ні rlwrap, ні socat в моїй установці, і у мене немає кореневого доступу для їх установки.
kurast
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.