9

Я использую коробку 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 ответ1

8

(К сведению: это обычные последовательности, сгенерированные этими ключами на большинстве терминалов, их интерпретация зависит от терминала или программы / библиотеки). Вы можете показать это на работающем терминале, нажав Ctrl+v, затем нажав End или другую не символьную клавишу, где 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"

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

Вы также можете проверить привязки readline в 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 - это "мета", что эквивалентно escape, поэтому там, где вы видите « \M- », « \e » также должно работать. При печати escape отображается как ^[ (control- [).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .