แป้นพิมพ์แปลก ๆ เมื่อใช้ sqlite shell บน linux


9

ฉันใช้กล่องลินุกซ์ที่เชื่อมต่อรางน้ำฉาบ ใช้งานกับทุบตีแป้นพิมพ์ของฉันทำงานได้ดี แต่เมื่อฉันใช้ sqlite shell (โปรแกรม 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

คำตอบ:


9

(FYI: ผู้ที่มีลำดับปกติที่สร้างโดยคีย์เหล่านั้นบนขั้วมากที่สุดก็ขึ้นอยู่กับขั้วหรือโปรแกรมห้องสมุด / การตีความพวกเขาคุณสามารถแสดงนี้บนขั้วทำงานโดยการกด. Ctrl+ vแล้วกดEndหรือคีย์ไม่ใช่ตัวละครอื่น ๆ ที่ ctrl-V ตั้งค่าการกดปุ่มถัดไปเพื่อรับการรักษาอย่างแท้จริง)

ดูเหมือนว่าsqlite3ไบนารีของคุณไม่ได้ใช้readlineงานหรือการกำหนดค่า readline ( inputrc) เสีย (มีโอกาสน้อยกว่าหากbashใช้งานได้)

คุณอาจจะสามารถที่จะยืนยัน / ปฏิเสธถ้า ReadLine จะถูกนำมาใช้กับต่อไปนี้แทนกับเส้นทางแบบเต็มถ้ามันไม่ได้อยู่ในของคุณwhich sqlite3PATH

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-" a " \e" ก็ควรทำงานเช่นกัน เมื่อพิมพ์ออกมาEscapeจะแสดงเป็น^[(control- [)


ฉันได้เพิ่มอินพุทของฉันถ้าคุณสามารถตรวจสอบเพื่อแยกความเป็นไปได้นี้ออกมา
kurast

และ ldd ของ sqlite ของฉันไม่แสดง libreadline
kurast

1
มันอาจจะไม่ได้รับการสนับสนุนที่แท้จริงแล้วทั้งอัพเกรดแพ็คเกจของคุณ (ตรวจสอบปัญหาความเข้ากันได้ถ้าคุณต้องอัพเกรดเวอร์ชั่น) หรือใช้rlwrapเป็นวิธีแก้ปัญหา อัปเดตคำตอบแล้ว
mr.spuratic

ไบนารีของฉันไม่ได้ถูกเชื่อมโยงแบบคงที่และเอาท์พุทผูกของฉันเป็นเหมือนของคุณ อย่างไรก็ตามฉันไม่มี rlwrap หรือ socat ในการติดตั้งของฉันและฉันไม่มีสิทธิ์เข้าถึงรูทในการติดตั้ง
kurast
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.