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


20

No bash, a tecla home/ end/ deleteestá inserindo um til ou, se precedida pela tecla de escape:[1~

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

Além disso, eu digito echo hellp, movo o cursor para hel|lpe digite esc, em seguida, excluo e bam, obtive[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. Quero que o Esc limpe a linha / buffer atual
  2. Quero que o Home mova o cursor para o início da linha antes do primeiro caractere
  3. Quero que End mova o cursor até o final da linha antes do primeiro caractere
  4. Quero excluir para excluir o próximo caractere (à direita do cursor) da linha / buffer atual

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

update: estou em uma máquina Windows executando um programa Windows, sh.exe (como você pode ver acima no GNU bash), compilado com mingw for msys:

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

janelas, sem emulador de terminal, msys.bat, se eu soubesse como relatar a definição, eu não estaria perguntando como configurá-los
opcional

Respostas:


22

Você personaliza o bash através de um .inputrcarquivo no seu /home/username, 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 na sua entradarc no lado esquerdo (o código de escape, pois pode variar entre laptop / desktop ...), no prompt digite echo 'e digite Ctrl-Vseguido pela tecla, como Home, digite type ' 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
~

em seguida, substituir cada ^[com \e add \M-para Alt , teoricamente, você usaria \C-para Ctrlmas de momento não funciona (limitação do Windows)

os comandos disponíveis (como backward-kill-line) estão listados em http://www.gnu.org/software/bash/manual/bashref.html#index-backward_002dkill_002dline-_0028C_002dx-Rubout_0029

pode ver atalhos / ligações de teclado existentes com bind -pou

$ 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


find / -name 'inputrc.default'não encontra nada na minha máquina. Minha casa e meu fim costumavam trabalhar ... :( Além disso, para sua informação pessoal: Para recarregar o arquivo .inputrc, use bind -f ~/.inputrc.
aliteralmind

Ah! Correção: usei seu .inputrc, exceto o $if mode=emacsbloco. Eu adicionei essas duas linhas, e elas funcionam novamente !! : D "\e[1~": beginning-of-line ... "\e[4~": end-of-line.
precisa saber é o seguinte

em RHL - o arquivo padrão em / etc / inputrc
Deian

infelizmente não tenho acesso de gravação a esse arquivo em uma máquina de cluster.
Herman Toothrot 10/09/16

5

Bem, como você diz que está trabalhando no Windows e não está usando um emulador de terminal adequado, como o PuTTY (com mintty , puttycyg et al ), recomendo que você consulte a documentação da linha de leitura e aprenda os atalhos para a linha de leitura. 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 acompanha o Windows, você obteria uma alternativa mais configurável. Depois de tentar usar outros programas como o Vim, as coisas só pioram.

A essência: use um emulador de terminal adequado, mesmo no Windows ou aprenda os atalhos da linha de leitura. Testei os que mais uso agora e eles trabalham msys.bat.

mingw-get install mintty && mintty

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


4

Verifique a instalação do Readline

Quando isso acontece em uma instalação mínima do Debian / Ubuntu recente, é provavelmente porque você não instalou o readline-commonpacote. Simplesmente instalar o pacote o resolverá.

Por exemplo, no Docker com a digitação 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

Observe que, após a instalação do readline-common, ele só terá efeito nos novos shells de login.


exec bashé uma maneira de substituir a instância atual do bash por uma nova, sem sair do terminal (conforme pode ser necessário ao reproduzir em um contêiner pTTY).
Kevin

@ Kevin Embora essa seja uma declaração válida, o que isso tem a ver com o contexto das perguntas e respostas aqui?
precisa saber é o seguinte

1
foi por isso que deixei como comentário, em vez de sugeri-lo como uma edição da sua resposta. Você notou a necessidade de um novo shell para usar o readline-common recém-instalado, e mostrou confirmar um contêiner como uma imagem como um meio de conseguir isso. Especialmente, como você usou o Docker como exemplo, achei meu comentário relevante.
Kevin

@ Kevin Ah, ok, entendi bem o seu ponto. Existem várias maneiras de obter um novo shell de login, o seu é um deles. :)
gertvdijk

2

Encontrei o seguinte útil também: https://wiki.archlinux.org/index.php/Home_and_End_keys_not_working

Especificamente:

Se suas chaves não estão funcionando, pode ser porque seu terminal em particular envia códigos de escape que não estã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 gera o valor de uma chave literalmente. A ligação padrão para inserção entre aspas é Ctrl + V.

Por exemplo, você pode fornecer as seguintes séries de entradas no 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, portanto, isso significa que sua tecla Home possui um código de escape de [1 ~ e sua tecla End tem 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 o Readline usa \ e para indicar um caractere de escape.

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

"\e[1~": beginning-of-line
"\e[4~": end-of-line
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.