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