tombol home / end / delete bash sedang memasukkan tilde, atau jika didahului dengan tombol escape, [1 ~ [3 ~

20

Dalam bash, tombol home/ end/ deletememasukkan tilde, atau jika didahului dengan tombol escape:[1~

Jadi saya ketik echo hellp, pindahkan kursor ke hel|lpdan ketik delete, dan bam, saya dapat~tilde

Juga, saya mengetik echo hellp, memindahkan kursor ke hel|lpdan ketik esc lalu hapus, dan bam, saya dapat[3~

$ echo hel~lp
hel~lp

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

Versi bash saya:

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

Yang saya inginkan adalah perilaku seperti cmd.exe:

  1. Saya ingin Esc menghapus garis / buffer saat ini
  2. Saya ingin Home memindahkan kursor untuk memulai baris sebelum karakter pertama
  3. Saya ingin End memindahkan kursor ke akhir baris sebelum karakter pertama
  4. Saya ingin menghapus untuk menghapus karakter berikutnya (kanan kursor) dari baris saat ini / buffer

Apa yang harus saya edit untuk memperbaikinya? Apakah ini default pada bash Anda?

pembaruan: Saya menggunakan mesin windows yang menjalankan program windows, sh.exe (seperti yang Anda lihat di atas GNU bash), dikompilasi dengan mingw untuk msys:

$ uname -s -m -o
MINGW32_NT-5.1 i686 Msys
pilihan
sumber
windows, tanpa terminal emulator, msys.bat, jika saya tahu cara melaporkan pengaturan, saya tidak akan bertanya bagaimana mengaturnya
opsional

Jawaban:

22

Anda menyesuaikan bash melalui .inputrcfile di Anda /home/username, Anda dapat menyalin default

cp /etc/inputrc.default   ~/.inputrc

ini milik saya (komentar dimulai dengan #)

# 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

untuk mengetahui apa yang perlu Anda ketik di inputrc Anda di sisi kiri (kode escape, karena dapat bervariasi antara laptop / desktop ...), pada prompt ketik echo 'lalu ketik Ctrl-Vdiikuti dengan kunci, seperti Home, lalu ketik ' contoh

$ 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
~

kemudian mengganti setiap ^[dengan \e add \M-untuk Alt secara teoritis Anda akan menggunakan \C-untuk Ctrltetapi saat ini tidak bekerja (Buka di jendela batasan)

perintah yang tersedia (seperti backward-kill-line) tercantum di http://www.gnu.org/software/bash/manual/bashref.html#index-backward_002dkill_002dline-_0028C_002dx-Rubout_0029

Anda dapat melihat pintasan / binding keyboard yang ada dengan bind -patau

$ 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".
~

jangan macam-macam dengan TERMCAP

pilihan
sumber
find / -name 'inputrc.default'tidak menemukan apa pun di komputer saya. Rumah dan akhir saya digunakan untuk bekerja ... :( Juga, FYI kepada orang lain: Untuk memuat ulang file .inputrc, gunakan bind -f ~/.inputrc.
aliteralmind
Ah! Koreksi: Saya menggunakan .inputrc Anda, kecuali untuk $if mode=emacsblok. Saya menambahkan dua baris ini, dan mereka bekerja lagi !! : D "\e[1~": beginning-of-line ... "\e[4~": end-of-line.
aliteralmind
pada RHL - file default di / etc / inputrc
Deian
sayangnya saya tidak punya akses tulis ke file itu di mesin cluster.
Herman Toothrot
5

Nah, karena Anda mengatakan Anda bekerja pada Windows dan tidak menggunakan emulator terminal yang tepat seperti Putty (dengan mintty , puttycyg et al ), saya akan merekomendasikan Anda membaca dokumentasi readline dan mempelajari cara pintas untuk readline. Akan lebih baik dalam jangka panjang.

Jika Anda menggunakan emulator terminal alih-alih jendela konsol (tidak membicarakan interpreter / shell di sini) yang disertakan dengan Windows, Anda akan mendapatkan alternatif yang lebih dapat dikonfigurasi. Setelah Anda mencoba menggunakan program lain seperti Vim, segalanya hanya akan bertambah buruk.

Intinya: gunakan emulator terminal yang tepat, bahkan pada Windows atau pelajari pintasan readline. Saya menguji yang paling saya gunakan sekarang dan mereka bekerja dengan msys.bat.

mingw-get install mintty && mintty

File yang akan diedit adalah /usr/share/terminfo(yang tidak ada di MinGW) - gunakan ticuntuk "mengkompilasi" aturan (yang bahkan tidak termasuk karena semua orang tahu bahwa dukungan akan sangat lumpuh). Namun, saya belum melihat perkembangan yang berguna untuk membuat ini bahkan dapat digunakan pada Windows. Inilah sebabnya mengapa Anda harus menggunakan emulator terminal yang tepat di tempat pertama. Tapi saya yakin seorang ahli bedah akan dapat menggunakan pisau dapur untuk operasi, jadi mengapa Anda tidak menggunakan Windows built-in console windows. Semoga berhasil.

0xC0000022L
sumber
4

Periksa pemasangan Readline

Ketika ini terjadi pada instalasi minimal Debian / Ubuntu baru-baru ini, itu mungkin karena Anda belum menginstal readline-commonpaket. Cukup menginstal paket akan menyelesaikannya.

Misalnya di Docker dengan pengetikan Debian Stretch 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

Harap dicatat bahwa setelah menginstal readline-common hanya akan berpengaruh pada shell login baru.

gertvdijk
sumber
exec bashadalah cara untuk mengganti instance bash saat ini dengan yang baru, tanpa keluar dari terminal (seperti yang mungkin diperlukan saat bermain dalam wadah pTTY).
Kevin
@Kevin Sementara itu pernyataan yang valid, apa hubungannya dengan konteks Q&A di sini?
gertvdijk
1
itulah sebabnya saya meninggalkannya sebagai komentar alih-alih menyarankannya sebagai edit untuk jawaban Anda. Anda mencatat perlunya shell baru untuk menggunakan readline-common yang baru diinstal, dan menunjukkan menempatkan sebuah wadah sebagai gambar sebagai salah satu cara untuk mencapai itu. Terutama, karena Anda menggunakan Docker sebagai contoh, saya pikir komentar saya relevan.
Kevin
@ Kevin Ah, oke, salah paham maksudmu kalau begitu. Ada banyak cara untuk mendapatkan shell login baru, milik Anda adalah salah satunya. :)
gertvdijk
2

Saya menemukan yang berikut ini juga membantu: https://wiki.archlinux.org/index.php/Home_and_End_keys_not_working

Secara khusus:

Jika kunci Anda tidak berfungsi, bisa jadi karena terminal khusus Anda mengirim kode melarikan diri yang tidak ada dalam daftar ini. Pertama, Anda perlu mencari tahu kode melarikan diri apa yang sedang dikirim. Untuk melihatnya, Anda dapat menggunakan perintah Readline yang disebut "quot-insert" atau menjalankan perintah showkey --scancodes yang menampilkan nilai kata kunci. Ikatan default untuk kutipan-sisipkan adalah Ctrl + V.

Misalnya, Anda bisa memberikan serangkaian input berikut di terminal Anda:

Ctrl+V
Home
Spacebar
Ctrl+V
End

Dan dapatkan sebagai output

$ ^ [[1 ~ ^ [[4 ~

The ^ [menunjukkan karakter escape di shell Anda, jadi ini berarti bahwa key Home Anda memiliki kode escape [1 ~ dan Anda End key memiliki kode escape dari [4 ~. Karena kode pelarian ini tidak tercantum dalam konfigurasi Readline default, Anda harus menambahkannya:

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

Perhatikan bahwa Readline menggunakan \ e untuk mengindikasikan karakter pelarian.

Bagian yang relevan bagi saya adalah menempatkan ini di inputrc:

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