Deleteキーがコマンドラインで機能しない


10

**注:これと同じ質問をSuperUserで行いましたが、応答がありませんでした。これが、この特定の質問にとってより適切なフォーラムであることに気づきました。*

kshシェルでは、Deleteキーはコマンドラインで適切機能しません。Deleteを押すと〜が表示されます。

方法:

  1. 「カーソル位置の文字を削除する」の機能を キーボードの削除ボタンにバインドしますか?(Control-Dは、削除ボタンが機能することを期待しているように動作し、エイリアスを使用する私の試みは失敗し、おそらく素朴です。)
  2. 行の最初に移動」の機能をホームキーボードのボタンにバインドしますか?(コントロールAがこれを実行しますが、ホームに実行してもらいます。)
  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これを使用する必要があるのですか?私が理解できるように私のために翻訳してください。そうすれば、これについてみんなに再度バグを報告する必要がなくなります。

古いものは次のとおりです

更新

QNXのESCは^[です。コマンドbind '^[[3~'='delete-char-backward'を使用して、カーソルの下の文字をで上書きすることができます~。これは少なくともある程度の進歩です-私は今、シェルの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

/ 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は以下を示します。

 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 2013

Deleteキーは、LinuxでPdksh(同じバージョン、前世紀から維持されていない)で動作します。何をbind | grep prefix示していますか?そしてbind | grep '[^ -~]'
Gilles 'SO-悪をやめる'

@Gillesバインドコマンドの結果で更新しました。それは私のPuTTy設定ですか?私はあなたの助けに感謝します。:-)
kmort 2013

AFAIK bind '^[[3~'='delete-char-forward'は機能するはずでした。これらの非ASCII文字の出所がわかりません(8番目のビットが設定されたESC + fooシーケンスではなく、latin1 / utf8の混乱でもありません)。`bind '^ X3〜= delete-char-forward'は機能しますか?
Gilles 'SO-悪をやめる'

回答:


6

Google社員向け:

ふew。非常に単純なはずなのに、これは大変でした。

短いソリューションは、(中にDeleteキーを設定するには、次を使用しているkshrcか、どこ)、

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

そして、PuTTyターミナル設定をのrxvt代わりにに設定しますStandard

PuTTyの設定

この作業を本当に手助けしてくれたのは:http : //www.mail-archive.com/misc@openbsd.org/msg81796.html

kshはhomeキーとendキーを使って愚かなことをします。基本的に、Home、End、Deleteの違いを同時に判断させることはできませんでした。最後にバインドされたものは何でも、3つのキーすべてで実行できます。PuTTyがこれらのキーに送信するものを変更すると、非常に役立ちます。

注:キーをcat押してと入力し、Enter キーを押してからキーを押すと、シェルが取得しているコードを確認したいという人もいます。私のシェルでは、これはうまくいきませんでした。~すべてのコントロールキーを手に入れました。代わりにEsc、一度押してからキーを押しました。制御コードが表示されてから表示されます。その制御コードを使用bindすれば、準備は完了です。


これがConemu + Cygwinでも動作することを確認できます。
Janac Meena、2017

2

[設定は多少異なりますが、同じ一般的な原則の一部が当てはまると思うので、以下が誰かの役に立つことを願っています。これは、Linuxが基本的なターミナルI / Oをどのように処理するかについて、私にとって良い学習経験であることがわかりました。]

シェルがgnomeターミナルウィンドウ内で実行されている場合はPreferences| Profilesプロファイルを選択しEdit、次にCompatibilityタブを選択して、をに変更しDelete key generatesましたAutomatic。(または、これが失敗した場合は、他の選択肢を試してください。)

[私はDebianストレッチをしています。]


Delがどのように、あるいは正確に壊れたのかはわかりませんが、右ではなく左を削除し始めました!

この記事は、物事の仕組みを理解するのに非常に役立ちました。


上記のリンクされた記事で提案されたデバッグ戦略を使用しました:

^v Delandと入力し^v Backspace、[control-v次にキーを削除...]を入力して、返された端末シーケンスコードを検索します。

及び使用showkey -sshowkey -kshowkey -a、次いでDel及びBackspaceキー(ttyドライバからの出力として、キーボードから生、及び端末に指定された文字列など)は、3つの層を検査します。

このことから、stty(たとえばstty1)を使用する場合、シェルの動作がxterm(グラフィカルX端末内)を使用する場合とは異なることに気付きました。Delはstty1では正しく前方(右)に削除されましたが、私のxtermでは後方(左)に削除されました。


記事はデッドリンクです
Milk

1

Linux(Ubuntu 18.10)bashから、SSH経由でSolaris 11.3 bashに、gnome端末を使用して、既存の2つの回答が機能しませんでした。

bindコマンドを使用する必要があることがわかりましたが、ネイティブDeleteを機能させることができなかったため、回避策を使用しました。

したがって、回避策は、Deleteが押されたときに、削除キープレスをおよびにマッピングすることによって削除をシミュレートすることです。Backspace

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

入力するには、キープレスを使用します。

CTRL-vDelete最初の部分
CTRL-vCTRL-vBackspace2番目の部分。
(または使用\eの代わりに、例えばエスケープ用:"\e[3~"

それは完璧ではありません、もしあなたDeleteが行末にいたとしても、それはまだバックスペースです。しかし、それは私が~一日に数回キャラクターをバックスペースアウトする手間を省きます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.