Tombol hapus tidak berfungsi di baris perintah

10

** Catatan: Saya mengajukan pertanyaan yang sama tentang SuperUser, tetapi tidak mendapat respons. Saya sekarang menyadari ini adalah forum yang lebih tepat untuk pertanyaan khusus ini. *

Dalam shell ksh, tombol Delete tidak berfungsi dengan baik pada baris perintah. Saya mendapatkan ~ ketika saya menekan Delete.

Bagaimana saya:

  1. ikat fungsi "Hapus karakter di kursor" ke tombol Hapus keyboard? (Control-D berperilaku seperti saya harapkan tombol hapus berfungsi dan upaya saya menggunakan alias tidak berhasil dan mungkin naif.)
  2. ikat fungsi " Pindah ke yang pertama dari baris" ke tombol keyboard Rumah? (Kontrol A melakukan ini sekarang, tetapi saya ingin Home melakukannya.)
  3. ikat fungsi " Pindahkan ke ujung garis " ke tombol Akhiri keyboard? (Kontrol E melakukan ini sekarang, tetapi saya ingin mengakhiri melakukannya.)

Pembaruan Terakhir (?)

Saya menemukan sesuatu yang berhasil, tetapi saya tidak mengerti mengapa. Ini bekerja:

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

Menurut 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.

Jadi pertanyaanprefix-2 saya yang terbaru adalah mengapa saya harus menggunakan ini? Tolong terjemahkan untuk saya sehingga saya dapat mengerti sehingga saya tidak perlu lagi mengganggu semua orang tentang ini.

STUFF STUFF FOLLOWS

MEMPERBARUI

Ternyata ESC di QNX adalah ^[. Menggunakan perintah bind '^[[3~'='delete-char-backward'saya bisa mendapatkan kursor untuk menimpa karakter di bawah kursor dengan a ~. Ini adalah beberapa kemajuan setidaknya - Saya sekarang tahu cara mengeja Delete Key untuk shell. Sebagian besar hal yang saya lihat di web mengatakan bahwa tombol hapus adalah ^?, tetapi sepertinya itu tidak berhasil bagi saya. Juga, saya harus menyebutkan saya mengakses ini melalui Putty.

Saya tidak mengerti karena Kontrol D melakukan apa yang saya ingin lakukan tombol hapus. Saya mencoba mengikatnya eot-or-deletelagi dan tidak berhasil.

Ini harusnya sederhana, bukan?

PEMBARUAN 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

UPDATE 3: Lebih banyak pengaturan saya

Pengaturan ENV

 echo $ENV
/etc/kshrc

BIND, Output Lengkap

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

Pengaturan Putty:

masukkan deskripsi gambar di sini

Catatan yang mungkin atau mungkin tidak penting, tetapi dapat memberikan latar belakang:

Shell adalah "PD KSH v5.2.14 99/07 / 13.2". Ya, saya tidak punya opsi untuk memutakhirkan ... ini adalah sistem yang disematkan. "Dapatkan shell modern" bukanlah jawaban yang layak. Sistem operasinya adalah QNX Neutrino 6.4.1.

bind menunjukkan yang berikut ini:

 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 menunjukkan yang berikut:

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 menunjukkan yang berikut:

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
kmort
sumber
Apakah unix.stackexchange.com/questions/23041/… atau unix.stackexchange.com/questions/42753/… membantu?
Gilles 'SANGAT berhenti menjadi jahat'
Sebenarnya saya sudah melihat kedua tautan itu, dan saya telah mencoba untuk memodifikasi tetapi kshrctidak berhasil. Saya mendapatkan sh: /etc/kshrc[21]: trap: bad signal KEYBDsaya tidak punya pilihan shell lain sayangnya. Saya tidak tahu apakah ini masalah dengan PDKSH atau dengan QNX atau keduanya. Saya tahu kombinasi tombol apa yang akan menyebabkan apa yang saya inginkan. Saya hanya perlu tahu sintaks untuk memetakannya ke tombol yang sesuai.
kmort
Tombol Delete berfungsi untuk saya dengan Pdksh (versi yang sama, belum dipelihara sejak abad terakhir) di Linux. Apa yang bind | grep prefixditunjukkan untuk Anda? Dan bind | grep '[^ -~]'?
Gilles 'SO- stop being evil'
@Gilles Saya memperbarui dengan hasil dari perintah bind Anda. Mungkinkah itu pengaturan Putty saya? Saya menghargai bantuan Anda. :-)
kmort
AFAIK bind '^[[3~'='delete-char-forward'seharusnya bekerja. Saya tidak mengerti dari mana karakter non-ASCII itu berasal (mereka bukan ESC + foo urutan dengan set bit ke-8, atau kebingungan latin1 / utf8 daripadanya). Apakah `bind '^ X3 ~ = delete-char-forward' berfungsi?
Gilles 'SO- stop being evil'

Jawaban:

6

Untuk Karyawan Google:

Wah. Untuk sesuatu yang seharusnya sangat sederhana, ini sulit.

The solusi singkat adalah menggunakan berikut untuk mengatur tombol hapus (di kshrcatau di mana pun),

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

Dan atur pengaturan terminal Putty Anda rxvtsebagai ganti Standard.

Pengaturan Putty

Hal yang benar-benar membantu saya agar ini berfungsi adalah: http://www.mail-archive.com/[email protected]/msg81796.html

ksh melakukan hal-hal konyol dengan tombol home dan end. Pada dasarnya, saya tidak bisa membedakan antara Home, End, dan Delete secara bersamaan. Apa pun yang terakhir kali terikat, ketiga kunci akan dilakukan. Mengubah apa yang dikirim Putty untuk kunci-kunci ini sangat membantu.

Catatan: Beberapa orang menyarankan jika Anda ingin melihat kode apa yang diperoleh shell ketika Anda menekan tombol, ketik cat, tekan enter, lalu tekan tombol. Bagiku, ini tidak berhasil. Saya ~dapat semua kunci kontrol. Yang saya lakukan adalah menekan Escsekali, lalu tekan tombol. Kode kontrol akan muncul kemudian muncul. Gunakan kode kontrol itu binddan Anda siap.

kmort
sumber
Saya dapat mengonfirmasi bahwa ini juga berfungsi di Conemu + Cygwin.
Janac Meena
2

[Meskipun kami memiliki pengaturan yang agak berbeda, saya harap yang berikut ini dapat berguna bagi seseorang, karena saya pikir beberapa prinsip umum yang sama berlaku. Ini terbukti menjadi pengalaman belajar yang baik bagi saya tentang bagaimana Linux menangani terminal dasar i / o.]

Jika shell berjalan di dalam jendela terminal gnome , maka di bawah Preferences| Profilespilih profil, lalu pilih Editdan kemudian Compatibilitytab, dan ubah Delete key generateske Automatic. (Atau jika ini gagal coba pilihan lain di sana.)

[Aku menggunakan Debian Stretch.]


Saya tidak tahu bagaimana, atau bahkan kapan tepatnya Del saya rusak, tetapi mulai menghapus ke kiri daripada ke kanan!

Artikel ini sangat membantu saya untuk memahami bagaimana segala sesuatunya bekerja.


Saya menggunakan strategi debugging yang disarankan dalam artikel tertaut di atas:

Ketik ^v Deldan ^v Backspace, [control-v lalu hapus kunci ...] untuk menemukan kode urutan terminal yang dikembalikan.

Dan penggunaan showkey -s, showkey -k, showkey -adan kemudian Deldan Backspacekunci untuk memeriksa tiga lapisan (mentah dari keyboard, sebagai output dari sopir tty, dan sebagai string karakter diberikan kepada terminal).

Dari sini saya perhatikan bahwa ketika menggunakan stty (misalnya stty1) perilaku shell saya berbeda dari ketika menggunakan xterm (dari dalam terminal X Graphical). Del dihapus dengan benar ke depan (kanan) di stty1, tetapi mundur (kiri) di xterm saya.

Pandangan elips
sumber
Artikel adalah tautan mati
Susu
1

Dua jawaban yang ada tidak berfungsi untuk saya pergi dari Linux (Ubuntu 18.10) bash, melalui SSH ke Solaris 11.3 bash, menggunakan terminal gnome.

Saya menemukan saya perlu menggunakan bindperintah, tetapi dengan bekerja-sekitar, karena saya tidak bisa mendapatkan Deletefungsi asli.

Jadi yang perlu diperhatikan adalah ketika Deleteditekan, untuk mensimulasikan penghapusan dengan memetakan penekanan tombol delete ke dan Backspace.

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

Untuk mengetik itu, gunakan tombol-tekan:

CTRL-vDeleteuntuk bagian pertama
dan CTRL-vCTRL-vBackspaceuntuk yang kedua.
(atau menggunakan \euntuk melarikan diri sebaliknya, misalnya: "\e[3~")

Itu tidak sempurna, jika Anda berada Deletedi garis akhir, itu masih mundur. Tapi itu menyelamatkan saya karena harus mundur ~karakter beberapa kali sehari.

Kingsley
sumber