bash home / end / delete tuşu yaklaşık işareti ekliyor veya öncesinde kaçış tuşu varsa, [1 ~ [3 ~


20

Bash'ta home/ end/ deletetuşu bir tilde işareti ekliyor veya öncesinde kaçış tuşu varsa:[1~

Bu yüzden echo hellpimleci yazıyorum hel|lpve imleci sil yazıyorum ve bam,~tilde

Ayrıca, echo hellpimleci üzerine yazıyorum hel|lpve esc yazıp siliyorum ve bam, aldım[3~

$ echo hel~lp
hel~lp

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

Benim bash versiyonum:

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

Ne istiyorum gibi davranışıdır cmd.exe:

  1. Esc'in mevcut satırı / arabelleği temizlemesini istiyorum
  2. Home'un imleci ilk karakterden önce satırın başına getirmesini istiyorum
  3. End'in imleci ilk karakterden önce satır sonuna götürmesini istiyorum
  4. Geçerli satırdan / arabellekten sonraki karakteri (imlecin sağını) silmek için silmek istiyorum

Bunu düzeltmek için ne düzenlemem gerekiyor? Bu, bashınızda varsayılan mı?

güncelleme: ben mysw için mingw ile derlenmiş bir Windows programı, sh.exe (GNU bash yukarıda gördüğünüz gibi) çalıştıran bir windows makinesindeyim:

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

pencereler, terminal öykünücüsü yok, msys.bat, ayarın nasıl bildirileceğini bilsem, nasıl ayarlayacağımı sormazdım
isteğe bağlı

Yanıtlar:


22

Bash .inputrcdosyasını içindeki bir dosya ile özelleştirebilir /home/username, varsayılanı kopyalayabilirsiniz.

cp /etc/inputrc.default   ~/.inputrc

işte benim (yorumlar # ile başlıyor)

# 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

sol taraftaki inputrc'nize ne yazmanız gerektiğini (dizüstü bilgisayar / masaüstü arasında değişebileceği için kaçış kodu ...) bulmak için, bilgi istemi yazın ve echo 'ardından Ctrl-Vanahtarı Homeyazın, sonra ' örnek yazın

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

daha sonra her yerini ^[ile \e eklenti \M-için Alt kullandığınız ediyorum teorik \C-için Ctrlancak şu anda değil iş (windows sınırlama) yapar

kullanılabilir komutlar (gibi backward-kill-line) http://www.gnu.org/software/bash/manual/bashref.html#index-backward_002dkill_002dline-_0028C_002dx-Rubout_0029

bind -pveya ile mevcut klavye kısayollarını / ciltlerini görebilirsiniz

$ 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 ile uğraşma


find / -name 'inputrc.default'makinemde hiçbir şey bulamıyor. Evim ve bind -f ~/.inputrc
sonum eskiden

Ah! Düzeltme: $if mode=emacsBlok hariç .inputrc'nizi kullandım . Bu iki satırı ekledim ve tekrar çalışıyorlar! : D "\e[1~": beginning-of-line ... "\e[4~": end-of-line.
aliteralmind

on RHL - / etc / inputrc içindeki varsayılan dosya
Deian

maalesef bir küme makinesinde bu dosyaya yazma erişimim yok.
Herman Toothrot

5

Peki, Windows üzerinde çalıştığınızı ve PuTTY ( nane , puttycyg et al ile ) gibi uygun bir terminal emülatörü kullanmadığınızı söylediğiniz için, readline belgelerine başvurmanızı ve readline kısayollarını öğrenmenizi öneririm . Uzun vadede daha iyi olacak.

Windows ile birlikte gelen konsol penceresi (burada yorumlayıcı / kabuk hakkında konuşmamak yerine) yerine bir terminal öykünücüsü kullanacak olsaydınız, daha yapılandırılabilir bir alternatif elde edersiniz. Vim gibi diğer programları kullanmaya çalıştığınızda işler daha da kötüleşir.

Gist: Windows'da bile uygun bir terminal emülatörü kullanın veya readline kısayollarını öğrenin. Şu anda en çok kullandıklarımı test ettim ve birlikte çalışıyorlar msys.bat.

mingw-get install mintty && mintty

Düzenlemek dosya ediyorum olmak /usr/share/terminfokullanımını - (MinGW yok olan) tic"derleme" kurallarına (herkes destek ciddi sakat olacağını bildiği için bile dahil değil). Ancak, bunu Windows'da bile neredeyse kullanılabilir hale getirmek için herhangi bir yararlı gelişme görmedim. Bu yüzden ilk etapta uygun bir terminal emülatörü kullanmalısınız. Ama eminim bir cerrah ameliyat için bir mutfak bıçağı kullanabilecektir, bu yüzden neden Windows yerleşik konsol pencerelerini kullanmıyorsunuz? İyi şanslar.


4

Readline kurulumunu kontrol edin

Bu , son Debian / Ubuntu'nun minimal kurulumunda gerçekleştiğinde, muhtemelen readline-commonpaketi yüklememiş olmanızdır . Sadece paketi yüklemek sorunu çözecektir.

Debian Stretch yazarak Docker'da 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 ortak kurulumundan sonra sadece yeni giriş kabukları üzerinde etkili olacağını lütfen unutmayın.


exec bashmevcut bash örneğini terminalden çıkmadan yenisiyle değiştirmenin bir yoludur (bir pTTY konteynerinde oynatılması gerektiğinde).
Kevin

@Kevin Bu geçerli bir ifade olmakla birlikte, buradaki Soru-Cevap bağlamıyla ne ilgisi var?
gertvdijk

1
bu yüzden cevabınıza bir düzenleme olarak önermek yerine yorum olarak bıraktım. Yeni takılan readline-ortak kullanmak için yeni bir kabuk ihtiyacına dikkat ettiniz ve bunu gerçekleştirmenin bir yolu olarak bir konteyneri görüntü olarak göstermeyi gösterdiniz. Özellikle Docker'ı örnek olarak kullandığınız için yorumumun alakalı olduğunu düşündüm.
Kevin

@ Kevin Ah, tamam, o zaman ne demek istediğini yanlış anlamışsın. Yeni bir giriş kabuğu almanın birçok yolu var, sizinki bunlardan biri. :)
gertvdijk

2

Aşağıdakileri de yararlı buldum: https://wiki.archlinux.org/index.php/Home_and_End_keys_not_working

özellikle:

Anahtarlarınız çalışmıyorsa, bunun nedeni terminalinizin bu listede bulunmayan çıkış kodları göndermesidir. Öncelikle hangi kaçış kodlarının gönderildiğini bulmanız gerekir. Bunları görmek için, "quoted-insert" adlı bir Readline komutunu kullanabilir veya bir anahtar kelimesinin değerini veren showkey --scancodes komutunu çalıştırabilirsiniz. Alıntılanan ekleme için varsayılan ciltleme Ctrl + V'dir.

Örneğin, terminalinizde aşağıdaki giriş serilerini verebilirsiniz:

Ctrl+V
Home
Spacebar
Ctrl+V
End

Ve çıktı olarak alın

$ ^ [[1 ~ ^ [[4 ~

^ [Kabuğunuzdaki bir kaçış karakterini belirtir, yani bu Ana Sayfa anahtarınızın [1 ~ kaçış koduna sahip olduğunuz ve End anahtarınızın [4 ~ kaçış koduna sahip olduğu anlamına gelir. Bu çıkış kodları varsayılan Readline yapılandırmasında listelenmediğinden, bunları eklemeniz gerekir:

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

Readline'ın bir kaçış karakterini belirtmek için \ e kullandığını unutmayın.

Benim için ilgili parça inputrc'ye koyuyordu:

"\e[1~": beginning-of-line
"\e[4~": end-of-line
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.