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