bash tecla home / end / delete está inserindo um til ou, se precedido pela tecla de escape, [1 ~ [3 ~

16

No bash, a tecla home / end / delete é a inserção de um til ou, se precedido pela chave de escape: [1~

Então eu digito echo hellp , movo o cursor para hel|lp e tipo delete, e bam, eu tenho ~tilde

Além disso, digito echo hellp , movo o cursor para hel|lp e digito esc e excluo, e bam, recebo [3~

$ echo hel~lp
hel~lp

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

Minha versão do bash:

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

O que eu quero é um comportamento como cmd.exe :

  1. Eu quero que Esc limpe a linha / buffer atual
  2. Eu quero que o Home mova o cursor para o início da linha antes do primeiro caractere
  3. Eu quero que o End mova o cursor para o final da linha antes do primeiro caractere
  4. Eu quero excluir para excluir o próximo caractere (à direita do cursor) da linha / buffer atual

O que preciso editar para corrigir isso? Este é o padrão no seu bash?

update: estou em uma máquina windows rodando um programa windows, sh.exe (como você pode ver acima do GNU bash), compilado com mingw para msys:

$ uname -s -m -o
MINGW32_NT-5.1 i686 Msys
    
por optional 16.02.2013 / 04:33

4 respostas

21

Você personaliza o bash por meio de um arquivo .inputrc no seu /home/username , você pode copiar o padrão

cp /etc/inputrc.default   ~/.inputrc

aqui é meu (os comentários começam com #)

# 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

para descobrir o que você precisa digitar em seu inputrc no lado esquerdo (o código de escape, pois ele pode variar entre o laptop / desktop ...), no tipo de prompt echo ' , digite Ctrl-V seguido por a chave, como Home , digite ' exemplo

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

substitua cada ^[ por \e adicione \M- para Alt teoricamente você usaria \C- para Ctrl , mas atualmente não funciona (limitação de janelas)

os comandos disponíveis (como backward-kill-line ) estão listados no link

você pode ver atalhos de teclado / ligações existentes com bind -p ou

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

não mexa com TERMCAP

    
por 30.04.2013 / 14:09
5

Bem, já que você diz que está trabalhando no Windows e não está usando um emulador de terminal adequado, como o PuTTY (com depósito a>, puttycyg et al ), eu recomendo que você consulte a documentação readline e aprenda os atalhos para readline. Vai ser melhor a longo prazo.

Se você usasse um emulador de terminal em vez da janela do console (sem falar do interpretador / shell aqui) que vem com o Windows, você obteria uma alternativa mais configurável. Depois de tentar usar outros programas como o Vim, as coisas só vão piorar.

O gist: use um emulador de terminal apropriado, mesmo no Windows ou aprenda os atalhos de readline. Eu testei os que eu mais uso agora e eles trabalham com msys.bat .

mingw-get install mintty && mintty

O arquivo a ser editado seria /usr/share/terminfo (que não existe no MinGW) - use tic para "compilar" as regras (que nem sequer são incluídas porque todos sabem que o suporte seria severamente aleijado). No entanto, eu não vi nenhum desenvolvimento útil para torná-lo ainda mais utilizável no Windows. É por isso que você deve usar um emulador de terminal adequado em primeiro lugar. Mas tenho certeza que um cirurgião será capaz de usar uma faca de cozinha para a cirurgia, então por que você não deveria usar as janelas internas do console do Windows? Boa sorte.

    
por 16.02.2013 / 04:46
3

Verifique a instalação do Readline

Quando isso acontece em uma instalação mínima de Debian / Ubuntu recente, provavelmente é porque você não instalou o pacote readline-common . Basta instalar o pacote para resolvê-lo.

Por exemplo no Docker com o Debian Stretch digitando 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

Por favor note que depois de instalar readline-common, isso só terá efeito em novos shells de login.

    
por 18.06.2017 / 18:01
1

Também encontrei as seguintes informações úteis: link

Especificamente:

Se as suas chaves não estão funcionando, pode ser porque o seu terminal em particular envia códigos de escape não nesta lista. Primeiro você precisa descobrir quais códigos de escape estão sendo enviados. Para vê-los, você pode usar um comando Readline chamado "quoted-insert" ou executar o comando showkey --scancodes que produz o valor de uma chave textual. A ligação padrão para inserção entre aspas é Ctrl + V.

Por exemplo, você pode fornecer as seguintes séries de entradas em seu terminal:

Ctrl+V
Home
Spacebar
Ctrl+V
End

E obtenha como saída

$ ^ [[1 ~ ^ [[4 ~

O ^ [indica um caractere de escape em seu shell, então isso significa que sua chave Home possui um código de escape de [1 ~ e sua chave End possui um código de escape de [4 ~. Como esses códigos de escape não estão listados na configuração padrão do Readline, você precisará adicioná-los:

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

Observe que Readline usa \ e para indicar um caractere de escape.

A peça relevante para mim foi colocar isso em inputrc:

"\e[1~": beginning-of-line
"\e[4~": end-of-line
    
por 08.12.2015 / 15:27