Странная клавиатура при использовании sqlite shell на linux

Я использую коробку linux, соединенную через шпаклевку. Используя его с bash, моя клавиатура работает хорошо, но когда я использую оболочку sqlite (программа sqlite3), мои клавиши сходят с ума:

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

вот мой env (соответствующая часть):

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

Я хотел бы использовать мои ключи нормально на sqlite, как я делаю на Windows.

мой ввод:

# 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

1 ответ

Решение

(К сведению: это обычные последовательности, сгенерированные этими клавишами на большинстве терминалов, это зависит от терминала или программы / библиотеки, чтобы интерпретировать их. Вы можете показать это на рабочем терминале, нажав Ctrl + v, затем нажав End или другой не-символьный key, где ctrl-V устанавливает следующее нажатие клавиши, которое будет обрабатываться буквально.)

Похоже на ваш sqlite3 бинарный не используется readline или конфигурация readline ( inputrc ) сломан (менее вероятно, если bash работает нормально, хотя).

Вы можете быть в состоянии подтвердить / отклонить, если readline используется со следующими, заменить 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 укажите readline, тогда почти наверняка бинарный файл не имеет поддержки.

В противном случае проверьте этот ответ: SQLite с поддержкой readline в Ubuntu

Если у вас нет поддержки readline в вашем sqlite3 бинарный вы можете обернуть его, используя один из:

rlwrap sqlite3
socat READLINE EXEC:"sqlite3"

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

Вы также можете проверить свои bash привязки readline, просто для того, чтобы убедиться, что 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 "должно работать тоже. Когда напечатано, побег представлен как ^[ (Управления- [).

Другие вопросы по тегам