bash tasto home / end / delete sta inserendo una tilde, o se preceduto dal tasto Esc, [1 ~ [3 ~


20

In bash, il tasto home/ end/ deletesta inserendo una tilde, o se preceduto dal tasto Esc:[1~

Quindi scrivo echo hellp, muovo il cursore su hel|lpe digito delete, e bam, ho capito~tilde

Inoltre, scrivo echo hellp, muovo il cursore su hel|lpe digito esc, quindi elimino, e bam, ho ottenuto[3~

$ echo hel~lp
hel~lp

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

La mia versione di bash:

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

Quello che voglio è un comportamento come cmd.exe:

  1. Voglio che Esc cancelli la riga / buffer corrente
  2. Voglio che Home sposti il ​​cursore all'inizio della riga prima del primo carattere
  3. Voglio che End sposti il ​​cursore alla fine della riga prima del primo carattere
  4. Voglio eliminare per eliminare il carattere successivo (a destra del cursore) dalla riga / buffer corrente

Cosa devo modificare per risolvere questo problema? Questo è predefinito su bash?

aggiornamento: sono su una macchina Windows che esegue un programma Windows, sh.exe (come puoi vedere sopra GNU bash), compilato con mingw per msys:

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

windows, nessun emulatore di terminale, msys.bat, se sapessi come segnalare l'impostazione, non vorrei chiedere come impostarli
opzionale

Risposte:


22

Personalizza bash tramite un .inputrcfile nel tuo /home/username, puoi copiare il valore predefinito

cp /etc/inputrc.default   ~/.inputrc

ecco il mio (i commenti iniziano con #)

# 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

per scoprire di cosa hai bisogno per digitare il tuo inputrc sul lato sinistro (il codice di escape, in quanto può variare tra laptop / desktop ...), al prompt digitare echo 'quindi Ctrl-Vseguito dal tasto, come Home, quindi digitare ' esempio

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

quindi sostituire ogni ^[con \e aggiuntivo \M-per Alt teoricamente usereste \C-per Ctrlma attualmente non funziona (finestre limitazione)

i comandi disponibili (come backward-kill-line) sono elencati in http://www.gnu.org/software/bash/manual/bashref.html#index-backward_002dkill_002dline-_0028C_002dx-Rubout_0029

puoi visualizzare le scorciatoie da tastiera / i collegamenti esistenti con bind -po

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

non scherzare con TERMCAP


find / -name 'inputrc.default'non trova nulla sulla mia macchina. La mia casa e la mia fine funzionavano ... :( Inoltre, FYI ad altri: per ricaricare il file .inputrc, utilizzare bind -f ~/.inputrc.
aliteralmind

Ah! Correzione: ho usato il tuo .inputrc, ad eccezione del $if mode=emacsblocco. Ho aggiunto queste due righe e funzionano di nuovo !! : D "\e[1~": beginning-of-line ... "\e[4~": end-of-line.
aliteralmind

su RHL - il file predefinito in / etc / inputrc
Deian,

sfortunatamente non ho accesso in scrittura a quel file su una macchina cluster.
Herman Toothrot,

5

Bene, dal momento che dici che stai lavorando su Windows e non stai usando un emulatore di terminale adeguato come PuTTY (con mintty , puttycyg et al ), ti consiglierei di consultare la documentazione di readline e imparare le scorciatoie per readline. Sarà meglio a lungo termine.

Se dovessi usare un emulatore di terminale anziché la finestra della console (non parlando dell'interprete / shell qui) fornita con Windows, otterrai un'alternativa più configurabile. Una volta che si tenta di utilizzare altri programmi come Vim, le cose peggioreranno.

L'essenza: utilizzare un emulatore di terminale adeguato, anche su Windows o imparare le scorciatoie readline. Ho testato quelli che uso di più proprio ora e funzionano con loro msys.bat.

mingw-get install mintty && mintty

Il file da modificare potrebbe essere /usr/share/terminfo(che non esiste in MinGW) - l'uso ticdi regole "Compila" (che non è nemmeno inclusa perché tutti sanno che il sostegno sarebbe gravemente paralizzato). Tuttavia, non ho visto alcun utile sviluppo per renderlo persino quasi utilizzabile su Windows. Questo è il motivo per cui dovresti usare un emulatore di terminale adeguato in primo luogo. Ma sono sicuro che un chirurgo sarà in grado di utilizzare un coltello da cucina per un intervento chirurgico, quindi perché non dovresti usare le finestre della console integrata di Windows. In bocca al lupo.


4

Verificare l'installazione di Readline

Quando ciò accade su un'installazione minima di Debian / Ubuntu recente, è probabilmente perché non hai installato il readline-commonpacchetto. La semplice installazione del pacchetto lo risolverà.

Ad esempio su Docker con la digitazione di 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

Si noti che dopo l'installazione di readline-common avrà effetto solo sulle nuove shell di login.


exec bashè un modo per sostituire l'istanza bash corrente con una nuova, senza uscire dal terminale (come potrebbe essere necessario quando si gioca in un contenitore pTTY).
Kevin,

@Kevin Anche se questa è un'affermazione valida, cosa ha a che fare con il contesto delle domande e risposte qui?
gertvdijk,

1
ecco perché l'ho lasciato come commento invece di suggerirlo come modifica alla tua risposta. Hai notato la necessità di una nuova shell per utilizzare il readline comune appena installato e hai mostrato di eseguire il commit di un contenitore come immagine come mezzo per ottenerlo. Soprattutto, dato che hai usato Docker come esempio, ho pensato che il mio commento fosse pertinente.
Kevin,

@Kevin Ah, ok, allora hai capito male il tuo punto. Esistono molti modi per ottenere una nuova shell di accesso, il tuo è uno di questi. :)
gertvdijk

2

Ho trovato utile anche il seguente: https://wiki.archlinux.org/index.php/Home_and_End_keys_not_working

In particolare:

Se le tue chiavi non funzionano, potrebbe essere perché il tuo terminale particolare invia codici di escape non in questo elenco. Per prima cosa devi scoprire quali codici di escape vengono inviati. Per vederli, è possibile utilizzare un comando Readline chiamato "quoted-insert" o eseguire il comando showkey --scancodes che restituisce il valore di una chiave alla lettera. L'associazione predefinita per l'inserimento tra virgolette è Ctrl + V.

Ad esempio, è possibile fornire le seguenti serie di ingressi nel terminale:

Ctrl+V
Home
Spacebar
Ctrl+V
End

E ottieni come output

$ ^ [[1 ~ ^ [[4 ~

^ [Indica un carattere di escape nella tua shell, quindi questo significa che la tua chiave Home ha un codice di escape di [1 ~ e la tua chiave End ha un codice di escape di [4 ~. Poiché questi codici di escape non sono elencati nella configurazione Readline predefinita, sarà necessario aggiungerli:

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

Si noti che Readline utilizza \ e per indicare un carattere di escape.

Il pezzo rilevante per me stava inserendo questo in inputrc:

"\e[1~": beginning-of-line
"\e[4~": end-of-line
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.