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


20

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

を入力しecho hellp、カーソルを移動しhel|lpてdeleteを入力し、bamを取得しました~tilde

また、を入力しecho hellp、カーソルをhel|lpescに移動して削除し、bamと入力しました。[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. Homeにカーソルを最初の文字の前の行の先頭に移動させたい
  3. Endでカーソルを最初の文字の前の行末に移動させたい
  4. deleteで現在の行/バッファーから次の文字(カーソルの右)を削除します

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

更新:私は、msys用のmingwでコンパイルされた、Windowsプログラムsh.exe(GNU bashの上で見ることができる)を実行しているWindowsマシンにいます:

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

windows、ターミナルエミュレーターなし、msys.bat、設定を報告する方法を知っていれば、設定方法を尋ねることはありません
オプションの

回答:


22

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

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を入力し、次に' example を入力します

$ 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 、追加\M-のためのAlt 理論的にあなたが使用したい\C-ためにCtrl、それは現在、(Windowsの制限)が動作しません。

利用可能なコマンド(など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を台無しにしないでください


find / -name 'inputrc.default'私のマシンでは何も見つかりません。私の家と終わりは働いていました... :(また、他の人へのbind -f ~/.inputrc
参考

あ!修正:$if mode=emacsブロックを除き、.inputrcを使用しました。これらの2行を追加しましたが、再び機能します!! :D "\e[1~": beginning-of-line ... "\e[4~": end-of-line
-aliteralmind

RHLの-のデフォルトのファイルは/ etc / INPUTRC
Deian

残念ながら、クラスタマシン上のそのファイルへの書き込みアクセス権はありません。
ハーマントゥーロット16

5

さて、あなたはWindowsで作業していて、PuTTY(minttyputtycygなど)などの適切なターミナルエミュレータを使用していないと言っているので、readlineのドキュメントを参照してreadlineのショートカットを学ぶことをお勧めします。長期的には良くなるでしょう。

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

要点:Windowsでも適切なターミナルエミュレータを使用する、readlineのショートカットを学んでください。私が今一番使っているものをテストしましたmsys.bat

mingw-get install mintty && mintty

編集するファイルがこと/usr/share/terminfo(MinGWのでは存在しない) -使用tic(誰もがサポートがひどく不自由されるだろうことを知っているためにも含まれていません)「コンパイル」のルールに。ただし、これをWindowsでもほぼ使用できるようにする便利な開発は見ていません。そもそも適切な端末エミュレータを使用する必要があるのはこのためです。しかし、外科医は手術に包丁を使用できると確信しているので、Windowsの組み込みコンソールウィンドウを使用しない方がよいのはなぜでしょう。幸運を。


4

Readlineのインストールを確認してください

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

例えば、Debian Stretchタイピングを使用した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をインストールした後は、新しいログインシェルにのみ影響することに注意してください。


exec bashこれは、ターミナルを終了せずに、現在のbashインスタンスを新しいインスタンスに置き換える方法です(コンテナpTTYで再生するときに必要になる場合があります)。
ケビン

@Kevinこれは有効なステートメントですが、ここでのQ&Aのコンテキストとは何の関係がありますか?
gertvdijk

1
そのため、回答の編集として提案するのではなく、コメントとして残しました。新しくインストールしたreadline-commonを使用するために新しいシェルが必要であることに注意し、それを実現する1つの手段として、コンテナーをイメージとしてコミットすることを示しました。特に、例としてDockerを使用しているので、私のコメントは関連性があると思いました。
ケビン

@ケビンああ、わかりました、あなたのポイントをよく誤解しました。新しいログインシェルを取得する方法はたくさんありますが、あなたのものもその一つです。:)
gertvdijk

2

以下も役立つことがわかりました: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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.