ปุ่ม Delete ไม่ทำงานในบรรทัดคำสั่ง


10

** หมายเหตุ: ฉันถามคำถามเดียวกันนี้กับ SuperUser แต่ไม่ได้รับคำตอบใด ๆ ตอนนี้ฉันรู้แล้วว่านี่เป็นฟอรัมที่เหมาะสมกว่าสำหรับคำถามนี้โดยเฉพาะ *

ในเชลล์ ksh ปุ่ม Delete ไม่ทำงานอย่างเหมาะสมในบรรทัดคำสั่ง ฉันได้รับ ~ เมื่อฉันกด Delete

ฉันจะทำอย่างไร:

  1. ผูกฟังก์ชันของ"ลบอักขระที่เคอร์เซอร์" กับปุ่มลบคีย์บอร์ดหรือไม่ (การควบคุม -D ทำงานเหมือนที่ฉันคาดหวังว่าปุ่มลบจะทำงานได้และความพยายามในการใช้นามแฝงนั้นไม่ประสบความสำเร็จและไร้เดียงสา)
  2. ผูกฟังก์ชันการทำงานของ " ย้ายไปที่บรรทัดแรก"กับปุ่มแป้นพิมพ์หน้าแรกหรือไม่ (การควบคุม A ทำได้ในตอนนี้ แต่ฉันต้องการให้ Home ทำ)
  3. ผูกฟังก์ชันการทำงานของ " ย้ายไปยังจุดสิ้นสุดของบรรทัด " ไปยังปุ่มแป้นพิมพ์สิ้นสุดหรือไม่ (การควบคุม E ทำสิ่งนี้ในตอนนี้ แต่ฉันต้องการให้จบ)

อัปเดตสุดท้าย (?)

ฉันสะดุดสิ่งที่ใช้งานได้ แต่ฉันไม่เข้าใจว่าทำไม งานนี้:

bind '^[[3'=prefix-2
bind '^[[3~'=delete-char-forward

ตามhttp://www.qnx.com/developers/docs/6.3.2/neutrino/utilities/k/ksh.html#bind ,

prefix-2
Key binding: ^X, ^[[
Introduces a 2-character command sequence.

ดังนั้นคำถามที่อัปเดตprefix-2ของฉันคือทำไมฉันต้องใช้กับสิ่งนี้ โปรดแปลให้ฉันเพื่อที่ฉันจะได้เข้าใจดังนั้นฉันจึงไม่ต้องทำตัวคนอื่นผิดเกี่ยวกับเรื่องนี้

ฟังก์ชั่นเก่า ๆ

UPDATE

แต่กลับกลายเป็นว่า ESC ใน QNX ^[เป็น การใช้คำสั่งฉันสามารถที่จะได้รับเคอร์เซอร์ไปเขียนทับตัวอักษรภายใต้เคอร์เซอร์ด้วยbind '^[[3~'='delete-char-backward' ~นี่คือความคืบหน้าอย่างน้อยตอนนี้ฉันรู้วิธีสะกดปุ่มลบสำหรับเชลล์ สิ่งที่ฉันได้เห็นบนเว็บส่วนใหญ่บอกว่าปุ่มลบคือ^?แต่ดูเหมือนจะไม่ทำงานสำหรับฉัน นอกจากนี้ฉันควรพูดถึงว่าฉันกำลังเข้าถึงสิ่งนี้ผ่าน PuTTy

ฉันไม่เข้าใจเพราะControl Dทำในสิ่งที่ฉันต้องการให้ปุ่มลบทำ ฉันพยายามผูกมันeot-or-deleteอีกครั้งเพื่อไม่เป็นประโยชน์

มันควรจะง่ายใช่มั้ย

อัปเดต 2:

 bind | grep prefix
^X = prefix-2
^[ = prefix-1
ÿ = prefix-3
^[O = prefix-2
^[[ = prefix-2


bind | grep '[^ -~]'
ÿ = prefix-3
à  = beginning-of-line
à¡ = up-history
ठ= backward-char
ঠ= forward-char
ਠ= end-of-line
à© = down-history
ଠ= delete-char-forward
à´ = backward-word
ච= forward-word

อัปเดต 3: การตั้งค่าของฉันเพิ่มเติม

การตั้งค่า ENV

 echo $ENV
/etc/kshrc

ผูกเอาท์พุทที่สมบูรณ์

bind
^A = beginning-of-line
^B = backward-char
^C = abort
^D = eot-or-delete
^E = end-of-line
^F = forward-char
^G = abort
^H = delete-char-backward
^I = complete
^J = newline
^K = kill-to-eol
^L = redraw
^M = newline
^N = down-history
^O = newline-and-next
^P = up-history
^R = search-history
^T = transpose-chars
^U = kill-line
^V = version
^W = kill-region
^X = prefix-2
^Y = yank
^[ = prefix-1
^\ = no-op
^] = search-character-forward
^^ = quote
^_ = eot
^? = delete-char-backward
ÿ = prefix-3
^[^H = delete-word-backward
^[^X = complete-file
^[^[ = complete
^[^] = search-character-backward
^[  = set-mark-command
^[# = comment
^[* = expand-file
^[. = prev-hist-word
^[0 = set-arg
^[1 = set-arg
^[2 = set-arg
^[3 = set-arg
^[4 = set-arg
^[5 = set-arg
^[6 = set-arg
^[7 = set-arg
^[8 = set-arg
^[9 = set-arg
^[< = beginning-of-history
^[= = complete-list
^[> = end-of-history
^[? = list
^[C = capitalize-word
^[L = downcase-word
^[O = prefix-2
^[U = upcase-word
^[[ = prefix-2
^[_ = prev-hist-word
^[b = backward-word
^[c = capitalize-word
^[d = delete-word-forward
^[f = forward-word
^[g = goto-history
^[h = delete-word-backward
^[l = downcase-word
^[u = upcase-word
^[y = yank-pop
^[^? = delete-word-backward
^X^X = exchange-point-and-mark
^X^Y = list-file
^X^[ = complete-command
^X? = list-command
^XA = up-history
^XB = down-history
^XC = forward-char
^XD = backward-char
^XH = beginning-of-line
^XP = delete-char-forward
^XY = end-of-line
^Xc = forward-word
^Xd = backward-word
^Xw = end-of-line
à  = beginning-of-line
à¡ = up-history
ठ= backward-char
ঠ= forward-char
ਠ= end-of-line
à© = down-history
ଠ= delete-char-forward
à´ = backward-word
ච= forward-word

/ etc / kshrc

/etc # cat kshrc
case $- in
*i*)
    export SHELL_COLOR_BLUE="print -n \\033[0;34m"
    export SHELL_COLOR_GREEN="print -n \\033[0;32m"
    export SHELL_COLOR_RED="print -n \\033[0;31m"
    export SHELL_COLOR_LIGHTGRAY="print -n \\033[0;37m"
    export SHELL_COLOR_YELLOW="print -n \\033[1;33m"

    export COLOR_BLACK="\\033[0;30m"
    export COLOR_BLUE="\\033[0;34m"
    export COLOR_GREEN="\\033[0;32m"
    export COLOR_CYAN="\\033[0;36m"
    export COLOR_RED="\\033[0;31m"
    export COLOR_PURPLE="\\033[0;35m"
    export COLOR_BROWN="\\033[0;33m"
    export COLOR_LIGHTGRAY="\\033[0;37m"
    export COLOR_DARKGRAY="\\033[1;30m"
    export COLOR_LIGHTBLUE="\\033[1;34m"
    export COLOR_LIGHTGREEN="\\033[1;32m"
    export COLOR_LIGHTCYAN="\\033[1;36m"
    export COLOR_LIGHTRED="\\033[1;31m"
    export COLOR_LIGHTPURPLE="\\033[1;35m"
    export COLOR_YELLOW="\\033[1;33m"
    export COLOR_WHITE="\\033[1;37m"

    if [[ `id -u` -eq 0 ]]; then
        export PS1=`$SHELL_COLOR_RED`'$(hostname -s):'`$SHELL_COLOR_YELLOW`'$(pwd) # '`$SHELL_COLOR_LIGHTGRAY`
    else
        export PS1=`$SHELL_COLOR_BLUE`'$(hostname -s):'`$SHELL_COLOR_GREEN`'$(pwd) $ '`$SHELL_COLOR_LIGHTGRAY`
    fi

esac

การตั้งค่า PuTTy:

ป้อนคำอธิบายรูปภาพที่นี่

หมายเหตุที่อาจมีหรือไม่มีความหมาย แต่อาจมีภูมิหลัง:

เปลือกคือ "PD KSH v5.2.14 99/07 / 13.2" ใช่ฉันไม่มีตัวเลือกในการอัพเกรด ... มันเป็นระบบฝังตัว "Get a modern shell" ไม่ใช่คำตอบที่เหมาะสม ระบบปฏิบัติการคือ QNX Neutrino 6.4.1

ผูกแสดงต่อไปนี้:

 bind | grep del
^D = eot-or-delete
^H = delete-char-backward
^? = delete-char-backward
^[^H = delete-word-backward
^[d = delete-word-forward
^[h = delete-word-backward
^[^? = delete-word-backward
^XP = delete-char-forward
ଠ= delete-char-forward

infocmp แสดงสิ่งต่อไปนี้:

infocmp  #      Reconstructed via infocmp from file:
/usr/lib/terminfo/x/xterm xterm|vs100|xterm terminal emulator,
        am, km, mir, msgr, xenl, xon,
        cols#80, it#8, lines#65, vt@,
        acsc=Oa``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
        bel=^G, blink=@, bold=\E[1m, clear=\E[H\E[2J, cr=^M,
        csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
        cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
        cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
        dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
        el=\E[K, el1=\E[1K$<3>, enacs=\E(B\E)0, home=\E[H, ht=^I,
        hts=\EH, ich=\E[%p1%d@, ich1=\E[2~, il=\E[%p1%dL, il1=\E[L,
        ind=^J, is1=\E=\E[?1l, kBEG=\ENn, kCPY=\ENs, kCRT=\ENt,
        kDL=\ENv, kEXT=\ENw, kFND=\ENx, kHLP=\ENy, kOPT=\ENz,
        ka3=\EOs, kb2=\EOr, kbs=^H, kc1=\EOq, kcan=\EOm, kclo=\ENc,
        kclr=\ENa, kcmd=\EOu, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
        kcuu1=\E[A, kdch1=\E[P, kend=\E[9, kf1=\E[11~, kf10=\E[21~,
        kf11=\E[23~, kf12=\E[24~, kf2=\E[12~, kf3=\E[13~,
        kf4=\E[14~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~,
        kf9=\E[20~, kfnd=\ENf, khlp=\ENh, khome=\E[8, khts=\ENb,
        kich1=\E[2~, kmov=\ENi, kmrk=\ENm, kmsg=\ENe, knp=\E[6~,
        kopn=\ENo, kopt=\ENk, kpp=\E[5~, kref=\ENl, kres=\ENp,
        krfr=\ENg, krpl=\ENr, krst=\ENj, ksav=\ENq, kslt=\EOM,
        ktbc=\ENd, kund=\ENu, rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O,
        rmam=\E[?7l, rmkx=\E>, rmso=\E[m,
        rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H, rs2=@,
        sc=\E7,
        setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
        setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
        sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m,
        sgr0=\E[m, smacs=^N, smam=\E[?7h, smkx=\E=, smso=\E[7m,
        tbc=\E[3g,

stty แสดงสิ่งต่อไปนี้:

stty Name:  /dev/ttyp0 Type:  pseudo Opens: 2
+edit +echok +echonl
+osflow  intr=^C  quit=^\ erase=^?  kill=^U   eof=^D start=^Q  stop=^S  susp=^Z lnext=^V   min=01  time=00   pr1=^[   pr2=5B  left=44 right=43
up=41  down=42   ins=40   del=50  home=48   end=59


จริง ๆ แล้วฉันเห็นลิงก์เหล่านั้นทั้งสองแล้วและฉันพยายามแก้ไขkshrcให้ไม่มีประโยชน์ ฉันเข้าใจว่า sh: /etc/kshrc[21]: trap: bad signal KEYBDฉันไม่มีตัวเลือกเชลล์อีกแล้ว ฉันไม่รู้ว่านี่เป็นปัญหากับ PDKSH หรือกับ QNX หรือทั้งสองอย่าง ฉันรู้ว่าชุดค่าผสมที่สำคัญจะทำให้สิ่งที่ฉันต้องการ ฉันแค่ต้องรู้ไวยากรณ์เพื่อจับคู่กับปุ่มที่เหมาะสม
kmort

ปุ่ม Delete ใช้งานได้กับฉันด้วย Pdksh (รุ่นเดียวกันมันไม่ได้รับการดูแลรักษามาตั้งแต่ศตวรรษที่แล้ว) ภายใต้ Linux อะไรที่bind | grep prefixแสดงให้คุณเห็น? และbind | grep '[^ -~]'?
Gilles 'หยุดชั่วร้าย'

@Gilles ฉันอัปเดตพร้อมกับผลลัพธ์ของคำสั่งการโยงของคุณ มันอาจเป็นการตั้งค่า PuTTy ของฉันหรือไม่? ฉันขอขอบคุณสำหรับความช่วยเหลือของคุณ :-)
kmort

AFAIK น่าbind '^[[3~'='delete-char-forward'จะทำงานได้ดี ฉันไม่เข้าใจว่าอักขระที่ไม่ใช่ ASCII นั้นมาจากไหน (ไม่ใช่ลำดับ ESC + foo ด้วยชุดบิตที่ 8 และไม่ได้สับสน latin1 / utf8) `ผูก '^ X3 ~ = ลบ-char-forward' ทำงานหรือไม่
Gilles 'หยุดชั่วร้าย'

คำตอบ:


6

สำหรับชาว Google:

ต๊าย สำหรับสิ่งที่ควรเรียบง่ายนี่เป็นเรื่องยาก

วิธีการแก้ปัญหาในระยะสั้นคือการใช้ต่อไปนี้เพื่อตั้งค่าปุ่มลบ (ในkshrcหรือที่ใดก็ตาม)

bind '^[[3'=prefix-2
bind '^[[3~'=delete-char-forward

และตั้งค่าขั้วฉาบของคุณเพื่อแทนrxvtStandard

ตั้งค่า PuTTy

สิ่งที่ช่วยให้ฉันทำงานนี้ได้จริงๆคือ: http://www.mail-archive.com/misc@openbsd.org/msg81796.html

ksh ทำสิ่งที่โง่ด้วยปุ่ม home และ end โดยทั่วไปฉันไม่สามารถบอกความแตกต่างระหว่าง Home, End และ Delete ได้ในเวลาเดียวกัน สิ่งที่ถูกผูกไว้ครั้งสุดท้ายทั้งสามปุ่มจะทำ การเปลี่ยนสิ่งที่ PuTTy ส่งให้กับปุ่มเหล่านี้ช่วยได้มาก

หมายเหตุ: บางคนแนะนำว่าคุณต้องการดูรหัสที่เปลือกได้รับเมื่อคุณกดคีย์พิมพ์catกด Enter จากนั้นกดปุ่ม สำหรับเปลือกของฉันมันไม่ทำงาน ฉันได้รับ~ทุกปุ่มควบคุม สิ่งที่ฉันทำแทนคือกดEscหนึ่งครั้งจากนั้นกดปุ่ม รหัสควบคุมจะปรากฏขึ้นจากนั้นแสดงขึ้น ใช้รหัสควบคุมนั้นbindและคุณก็พร้อม


ฉันสามารถยืนยันได้ว่างานนี้ใน Conemu + Cygwin เช่นกัน
Janac Meena

2

[แม้ว่าเราจะมีการตั้งค่าที่แตกต่างกันบ้าง แต่ฉันหวังว่าคุณสามารถใช้สิ่งต่อไปนี้กับบางคนได้เนื่องจากฉันคิดว่ามีหลักการทั่วไปบางข้อที่เหมือนกัน นี่เป็นประสบการณ์การเรียนรู้ที่ดีสำหรับฉันเกี่ยวกับวิธีที่ Linux จัดการกับ terminal พื้นฐาน i / o]

หากเชลล์กำลังทำงานภายในหน้าต่างเทอร์มินัล GNOMEจากนั้นภายใต้Preferences| Profilesเลือกรูปแบบจากนั้นเลือกEditแล้วCompatibilityแท็บและเปลี่ยนไปDelete key generates Automatic(หรือหากล้มเหลวให้ลองตัวเลือกอื่นที่นั่น)

[ฉันอยู่ใน Debian Stretch]


ฉันไม่ทราบวิธีหรือแม้กระทั่งเมื่อ Del ของฉันแตกหัก แต่มันเริ่มลบไปทางซ้ายมากกว่าใช่!

บทความนี้มีประโยชน์มากสำหรับฉันที่จะเข้าใจว่าสิ่งต่าง ๆ ทำงานอย่างไร


ฉันใช้กลยุทธ์การดีบักที่แนะนำในบทความที่ลิงก์ด้านบน:

พิมพ์^v Delและ^v Backspace, [control-v แล้วลบคีย์ ... ] เพื่อค้นหารหัสลำดับเทอร์มินัลที่ส่งคืน

และการใช้งานshowkey -s, showkey -k, showkey -aแล้วDelและBackspaceกุญแจในการตรวจสอบสามชั้น (ดิบจากแป้นพิมพ์เป็นผลผลิตจากคนขับ TTY และเป็นตัวอักษรที่ได้รับไปยังสถานี)

จากนี้ฉันสังเกตเห็นว่าเมื่อใช้ stty (เช่น stty1) ว่าพฤติกรรมเชลล์ของฉันแตกต่างจากเมื่อใช้ xterm (จากภายใน Graphical X terminal) ลบไปข้างหน้าอย่างถูกต้อง (ขวา) ใน stty1 แต่ย้อนกลับ (ซ้าย) ใน xterm ของฉัน


บทความเป็นลิงค์ที่ตายแล้ว
นม

1

สองคำตอบที่มีอยู่ไม่ได้ผลสำหรับฉันไปจาก Linux (Ubuntu 18.10) ทุบตีผ่าน SSH ถึง Solaris 11.3 ทุบตีโดยใช้ terminal gnome

ฉันพบว่าฉันต้องใช้bindคำสั่ง แต่มีวิธีแก้ไขเนื่องจากฉันไม่สามารถใช้Deleteฟังก์ชันเนทีฟ

ดังนั้นการทำงานรอบคือว่าเมื่อDeleteมีการกดเพื่อจำลองการลบโดยการทำแผนที่ปุ่มกดลบเพื่อและBackspace

bind '"^[[3~":"^[[C^?"'

ในการพิมพ์ให้ใช้การกดปุ่ม:

CTRL-vDeleteสำหรับส่วนแรก
และส่วนCTRL-vCTRL-vBackspaceที่สอง
(หรือใช้\eสำหรับการหลบหนีแทนเช่น: "\e[3~")

มันไม่สมบูรณ์แบบถ้าคุณDeleteอยู่ที่ท้ายบรรทัดมันจะยังคงอยู่ในพื้นที่ด้านหลัง แต่มันช่วยให้ฉันไม่ต้องถอยกลับออกไปจาก~ตัวละครที่มีอยู่มากมายต่อวัน

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