web-dev-qa-db-ja.com

bash home / end / deleteキーがチルダを挿入しているか、エスケープキーが前にある場合は、[1〜[3〜

Bashでは、 home/end/delete キーがチルダを挿入しているか、エスケープキーが前にある場合:[1~

echo hellpと入力し、カーソルをhel|lpに移動して、「delete」と入力すると、~tildeが得られます

また、echo hellpと入力し、カーソルをhel|lpに移動してescと入力してから削除し、[3~を取得しました

$ echo hel~lp
hel~lp

$ echo hell[3~o
hell[3~o
~

私のバージョンのbash:

$ bash --version
GNU bash, version 3.1.17(1)-release (i686-pc-msys)
Copyright (C) 2005 Free Software Foundation, Inc.

私が欲しいのはcmd.exeのような動作です

  1. Escで現在の行/バッファをクリアしてほしい
  2. ホームでカーソルを最初の文字の前の行の先頭に移動したい
  3. Endでカーソルを最初の文字の前の行末に移動する
  4. 現在の行/バッファから次の文字(カーソルの右側)を削除するために削除したい

これを修正するには何を編集する必要がありますか?これはあなたのbashのデフォルトですか?

pdate: Windowsプログラムを実行しているWindowsマシンのsh.exe(上記のように、GNU bash)で、msys用にmingwでコンパイルされています):

$ uname -s -m -o
MINGW32_NT-5.1 i686 Msys
22
optional

.inputrc/home/usernameファイルを使用してbashをカスタマイズします。デフォルトをコピーできます

cp /etc/inputrc.default   ~/.inputrc

これは私のものです(コメントは#で始まります)

# Key-bindings for the command-line editor.

# Ask before displaying >50 items
# Since $WINDIR $PATH var can be in $PATH, this could list
# all window exectables in C:\WINDOWS
set completion-query-items 50

# Ignore case for the command-line-completion functionality
# on:  default to a Windows style console
# off: default to a *nix style console
set completion-ignore-case on

# none, visible or audible
set bell-style audible

# disable/enable 8bit input
set meta-flag on
set input-meta on
set output-meta off
set convert-meta on

# visible-stats
# Append a mark according to the file type in a listing
set visible-stats off
set mark-directories on

# Show all instead of beeping first
set show-all-if-ambiguous off

# MSYSTEM is emacs based
$if mode=emacs
    # Common to Console & RXVT
    "\C-?": backward-kill-line          # Ctrl-BackSpace
    "\e[2~": paste-from-clipboard       # "Ins. Key"
    "\e[5~": beginning-of-history       # Page up
    "\e[6~": end-of-history             # Page down

    $if term=msys # RXVT
        "\e[7~": beginning-of-line      # Home Key
        "\e[8~": end-of-line            # End Key
        "\e[11~": display-Shell-version # F1
        "\e[15~": re-read-init-file     # F5
    #$endif
    #$if term=cygwin # Console
    $else
        "\e[1~": beginning-of-line      # Home Key
        "\e[4~": end-of-line            # End Key


"\e[3~": delete-char            # Delete Key
#~      "\e\e[D": backward-Word         # Alt-LeftArrow
#~      "\e\e[C": forward-Word          # Alt-RightArrow
            "\M-\e[D": backward-Word            # Alt-LeftArrow
            "\M-\e[C": forward-Word         # Alt-RightArrow
    `#~`        "\C-\E[D": backward-Word        # Ctrl-LeftArrow, nowork, can't be made to work
    #~`enter preformatted text here`        "\C-\E[C": forward-Word         # Ctrl-RightArrow, nowork, can't be made to work
    #~ to see current bindings use    bind -q backward-kill-line
            "\e\e": kill-whole-line        # double/triple escape works :) Esc/Escape to delete current line like cmd.exe

        $endif
    $endif

左側のinputrcに入力する必要があるものを見つけるには(ラップトップ/デスクトップ間で異なる可能性があるため、エスケープコード)、プロンプトでecho 'と入力し、次にCtrl-Vと入力します。 Homeのようなキーで、次に'の例を入力します

$ echo ' home key ^[[1~  '
 home key
~
$ echo ' end key ^[[4~  '
 end key
~
$ echo ' pg up page up ^[[5~ '
 pg up page up
~
$ echo ' pg dn page down ^[[6~ '
 pg dn page down
~

次に、各^[\eに置き換えますAltに対して\M-を追加します理論的にはCtrlに対して\C-を使用しますが、現在は使用していません仕事(ウィンドウの制限)

使用可能なコマンド(backward-kill-lineなど)は http://www.gnu.org/software/bash/manual/bashref.html#index-backward_002dkill_002dline-_0028C_002dx-Rubout_0029 にリストされています

bind -pを使用して、既存のキーボードショートカット/バインディングを表示できます。

$ bind -q backward-kill-Word
backward-kill-Word can be invoked via "\M-\C-h", "\M-\C-?".
~
$ bind -q backward-Word
backward-Word can be invoked via "\M-\M-[D", "\M-b", "\C-\E[[D".
~
$ bind -q beginning-of-line
beginning-of-line can be invoked via "\C-a", "\M-OH", "\M-[1~", "\M-[H".
~

tERMCAPをいじらないでください

23
optional

まあ、あなたはWindowsで作業していて、PuTTY( minttyputtycyg et al など)のような適切なターミナルエミュレーターを使用していないと言うので、相談することをお勧めします- readlineドキュメント とreadlineのショートカットについて学びます。長い目で見ればより良いでしょう。

Windowsに付属しているコンソールウィンドウ(ここではインタープリター/シェルについて話していない)の代わりにターミナルエミュレーターを使用する場合は、より構成可能な代替手段が得られます。 Vimのような他のプログラムを使用しようとすると、事態は悪化するだけです。

要点:Windowsまたはでも、適切なターミナルエミュレータを使用して、readlineのショートカットを学習します。私は今最もよく使用するものをテストし、それらはmsys.bat

mingw-get install mintty && mintty

編集するファイルwould be /usr/share/terminfo(MinGWには存在しません)-ticを使用してルールを「コンパイル」します(サポートが大幅に機能しなくなることは誰もが知っているため含まれていません)。ただし、これをWindowsでほぼ使用できるようにするための有用な開発は見ていません。これが、最初に適切なターミナルエミュレータを使用する必要がある理由です。しかし、外科医が包丁を使って手術できると確信しているので、Windows組み込みのコンソールウィンドウを使用すべきではありません。幸運を。

5
0xC0000022L

Readlineのインストールを確認する

最近のDebian/Ubuntuの minimal インストールでこれが発生する場合、おそらくreadline-commonパッケージをインストールしていないことが原因です。パッケージをインストールするだけで解決します。

例えば。 Debianストレッチ付きのDockerでの入力ls HOME

$ docker run --rm -it debian:stretch
root@6ae7baea9e5a:/# ls~

$ docker run -it --name=debian-stretch-readline-temp debian:stretch
root@2092cb968232:/# apt-get update
root@2092cb968232:/# apt-get install readline-common

$ docker commit debian-stretch-readline-temp debian-stretch-with-readline
$ docker run --rm -it debian-stretch-with-readline
root@53739343e9f7:/# ls

Readline-commonのインストール後は、新しいログインシェルにのみ影響することに注意してください。

4
gertvdijk

次の情報も参考になりました。 https://wiki.archlinux.org/index.php/Home_and_End_keys_not_working

具体的には:

キーが機能しない場合は、特定の端末がこのリストにないエスケープコードを送信している可能性があります。まず、送信されているエスケープコードを確認する必要があります。それらを表示するには、 "quoted-insert"と呼ばれるReadlineコマンドを使用するか、キーの値を逐語的に出力するコマンドshowkey --scancodesを実行します。 quoted-insertのデフォルトのバインディングはCtrl + Vです。

たとえば、端末に次の一連の入力を与えることができます。

Ctrl+V
Home
Spacebar
Ctrl+V
End

そして、出力として取得します

$ ^ [[1〜^ [[4〜

^ [はシェルのエスケープ文字を示します。つまり、ホームキーには[1〜]のエスケープコードがあり、エンドキーには[4〜]のエスケープコードがあります。これらのエスケープコードはデフォルトのReadline設定にリストされていないため、追加する必要があります。

"\e[1~": beginning-of-line
"\e[4~": end-of-line

Readlineは\ eを使用してエスケープ文字を示すことに注意してください。

私に関連する部分はこれをinputrcに入れていました:

"\e[1~": beginning-of-line
"\e[4~": end-of-line
2
Paul