Клавіша Delete не працює в командному рядку


10

** Примітка. Це саме запитання я задавав на SuperUser, але не отримав жодної відповіді. Тепер я розумію, що це більш підходящий форум для цього конкретного питання. *

У оболонці ksh клавіша Delete не працює належним чином у командному рядку. Я отримую ~, коли натискаю Видалити.

Як мені:

  1. прив’язати функціональність "Видалити символ у курсора" кнопкою Видалити клавіатуру? (Control-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для цього потрібно користуватися ? Будь ласка, перекладіть для мене, щоб я міг зрозуміти, тому мені більше не доведеться клопотати всіх про це.

СТАРИЙ СТРАНИЙ СТАРИЙ

ОНОВЛЕННЯ

Виявляється, ESC у QNX є ^[. За допомогою команди bind '^[[3~'='delete-char-backward'я можу змусити курсор перезаписати символ під курсором із символом a ~. Принаймні, це певний прогрес - я тепер знаю, як написати Delete Key для оболонки. Більшість речей, які я бачив в Інтернеті, кажуть, що ключ видалення є ^?, але це, здається, не працює для мене. Також я повинен зазначити, що я отримую доступ до цього через 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

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

/ тощо / 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". Так, у мене немає можливості оновити ... це вбудована система. "Отримати сучасну оболонку" не є життєздатною відповіддю. Операційна система - QNX Neutrino 6.4.1.

bind показує наступне:

 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 або обома. Я знаю, які комбінації клавіш спричинить те, що я хочу. Мені просто потрібно знати синтаксис, щоб відобразити їх у відповідні клавіші.
кморт

Клавіша Delete працює для мене з Pdksh (та ж версія, вона не підтримувалася з минулого століття) під Linux. Що bind | grep prefixпоказує для вас? І bind | grep '[^ -~]'?
Жил "ТАК - перестань бути злим"

@Gilles Я оновив результати своїх команд прив’язки. Чи можуть це бути мої налаштування PuTTy? Я вдячний за твою допомогу. :-)
кморт

AFAIK bind '^[[3~'='delete-char-forward'повинен був працювати. Я не розумію, звідки беруться ці символи, що не належать до ASCII (це не послідовності ESC + foo з 8-м бітним набором, ані латинка1 / utf8 плутанини). Чи працює "прив'язка" ^ X3 ~ = delete-char-forward '?
Жил "ТАК - перестань бути злим"

Відповіді:


6

Для Googlers:

Вау. Для чогось, що повинно бути таким простим, це було важко.

Коротке рішення , це використовувати такі параметри для видалення ключа (в kshrcабо де),

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

І rxvtзамість цього встановіть налаштування свого терміналу PuTTy Standard.

Налаштування PuTTy

Ця річ, яка мені справді допомогла працювати, була: http://www.mail-archive.com/misc@openbsd.org/msg81796.html

ksh робить нерозумні речі з домашнім і кінцевим клавішами. В основному, я не міг змусити його одночасно визначити різницю між Home, End та Delete. Що б не було останнє, всі три ключі будуть робити. Величезна допомога змінила те, що PuTTy надсилає за цими ключами.

Примітка. Деякі люди пропонують, якщо ви хочете побачити, який код отримує оболонка, коли ви натискаєте клавішу, введіть cat, натисніть клавішу Enter, а потім натисніть клавішу. Для моєї оболонки це не спрацювало. Я отримав ~для всіх клавіші управління. Що я зробив замість цього, було натиснути Escодин раз, потім натиснути клавішу. Код управління відображатиметься, потім з’являється. Використовуйте цей контрольний код у bindвас і все готово.


Я можу підтвердити, що це працює і в Conemu + Cygwin.
Janac Meena

2

[Хоча у нас дещо інша установка, я сподіваюся, що наступне може комусь корисно, оскільки, думаю, застосовуються деякі ті самі загальні принципи. Це виявилося для мене гарним досвідом навчання щодо того, як Linux обробляє базовий термінал i / o.]

Якщо оболонка працює всередині вікна терміналу gnome , то під Preferences| Profilesвиберіть профіль, потім виберіть, Editа потім Compatibilityвкладку та змініть Delete key generatesна Automatic. (Або якщо цього не вдасться, спробуйте інші варіанти.)

[Я на Debian Stretch.]


Я не знаю як, або навіть коли саме мій Дел зламався, але він почав видаляти лівий, а не правий!

Ця стаття мені дуже допомогла зрозуміти, як все працювало.


Я використав запропоновані стратегії налагодження у зв'язаній статті вище:

Наберіть ^v Delі ^v Backspace, [control-v, а потім видаліть ключ ...], щоб знайти повернені коди послідовності терміналів.

А використання showkey -s, showkey -k, showkey -aа потім Delі Backspaceключі , щоб оглянути три шари (сировина з клавіатури, в якості вихідного сигналу від драйвера терміналу, а також символьної рядок заданої на клему).

З цього я помітив, що при використанні stty (наприклад, stty1) моя поведінка оболонки відрізняється від використання xterm (з терміналу Graphical X). Del видалено правильно вперед (праворуч) у stty1, але назад (ліворуч) у моєму xterm.


Стаття є мертвою ланкою
Молоко

1

Існуючі два відповіді не працювали для мене, переходячи від Linux (Ubuntu 18.10) bash, через SSH до Solaris 11.3 bash, використовуючи gnome-термінал.

Я виявив, що мені потрібно використовувати bindкоманду, але з обробкою, оскільки я не міг змусити рідного Deleteфункціонувати.

Отже, обхід полягає в тому, що при Deleteнатисканні імітувати видалення, зіставивши клавішу видалення на і Backspace.

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

Щоб ввести це, використовуйте натискання клавіш:

CTRL-vDeleteдля першої частини
та CTRL-vCTRL-vBackspaceдля другої.
(Або використовувати \eдля втечі замість того, щоб , наприклад "\e[3~")

Це не ідеально, якщо ви Deleteв кінці лінії, воно все одно відстає. Але це врятує мене від необхідності відстороняти ~характер персонажа, який проводиться раз у день.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.