Domanda

Sto eseguendo zsh come shell predefinita su una scatola Ubuntu, e tutto funziona bene usando gnome-terminal (che per quanto ne so emula xterm). Quando eseguo il login da una finestra di Windows tramite ssh e putty (che emula anche xterm), le chiavi home / end non funzionano più.

Sono stato in grado di risolvere questo aggiungendo queste righe al mio file zshrc ...

bindkey '\e[1~' beginning-of-line
bindkey '\e[4~' end-of-line

... ma mi sto ancora chiedendo cosa c'è che non va qui. Qualche idea?

È stato utile?

Soluzione

Ho trovato che è una combinazione:

Un

Gli sviluppatori di ZSH non pensano che ZSH debba definire le azioni delle chiavi Home , End , Del , ....

Debian e Ubuntu risolvono questo problema definendo le normali azioni che l'utente medio si aspetterebbe dal file globale / etc / zsh / zshrc . Seguendo il codice pertinente (è lo stesso su Debian e Ubuntu):

if [[ "$TERM" != emacs ]]; then
[[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
[[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
[[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line
[[ -z "$terminfo[kich1]" ]] || bindkey -M emacs "$terminfo[kich1]" overwrite-mode
[[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
[[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
[[ -z "$terminfo[kend]" ]] || bindkey -M vicmd "$terminfo[kend]" vi-end-of-line
[[ -z "$terminfo[kich1]" ]] || bindkey -M vicmd "$terminfo[kich1]" overwrite-mode

[[ -z "$terminfo[cuu1]" ]] || bindkey -M viins "$terminfo[cuu1]" vi-up-line-or-history
[[ -z "$terminfo[cuf1]" ]] || bindkey -M viins "$terminfo[cuf1]" vi-forward-char
[[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
[[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
[[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
[[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char

# ncurses fogyatekos
[[ "$terminfo[kcuu1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
[[ "$terminfo[kcud1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
[[ "$terminfo[kcuf1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
[[ "$terminfo[kcub1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
[[ "$terminfo[khome]" == "^[O"* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
[[ "$terminfo[kend]" == "^[O"* ]] && bindkey -M viins "${terminfo[kend]/O/[}" end-of-line
[[ "$terminfo[khome]" == "^[O"* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
[[ "$terminfo[kend]" == "^[O"* ]] && bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line
fi

Quindi, se ci si connette a un box Debian o Ubuntu, non è necessario fare nulla. Tutto dovrebbe funzionare automaticamente (in caso contrario, vedi sotto).

Ma ... se ti stai connettendo ad un altro box (ad es. FreeBSD), potrebbe non esserci un zshrc di default user friendly. La soluzione è ovviamente quella di aggiungere le linee dal zshrc Debian / Ubuntu al tuo .zshrc .

due

Putty invia xterm come tipo di terminale all'host remoto. Ma rovina da qualche parte e non invia i codici di controllo corretti per Home , End , ... che ci si aspetterebbe da un xterm . Oppure non è previsto che un terminale xterm invii questi o altro ... (la chiave Del funziona in xterm , tuttavia, se configurata in ZSH). Si noti inoltre che i tasti del tastierino numerico si comportano in modo strano in Vim, ad esempio con il terminale xterm .

La soluzione è configurare Putty per inviare un altro tipo di terminale. Ho provato xterm-color e linux . xterm-color risolto il problema Home / End , ma il Numpad era ancora divertente. L'impostazione su linux ha risolto entrambi i problemi.

Puoi impostare il tipo di terminale in Putty sotto Connessione - > Dati. Non essere tentato di impostare il tipo di terminale nel tuo .zshrc con export TERM = linux , è semplicemente sbagliato. Il tipo di terminale deve essere specificato dall'app del terminale. Quindi, se, ad esempio, ti connetti da un Mac box con un client Mac SSH, puoi impostare il suo tipo di terminale.

Nota che TERM specifica il tipo di terminale e non ha nulla a che fare con l'host a cui ti stai connettendo. Posso impostare il mio tipo di terminale su linux in Putty e connettermi ai server FreeBSD senza problemi.

Quindi, risolvi entrambe queste cose e dovresti stare bene :)

Altri suggerimenti

Nella finestra di dialogo di configurazione di PuTTY, vai su Connessione - > Dati e digitare linux nella stringa di tipo Terminale prima della connessione.

Questo funziona per me

bindkey -v

bindkey '\eOH'  beginning-of-line
bindkey '\eOF'  end-of-line

Sembra una cosa stucco. Gnome-terminal invia i codici ^ [OH e ^ [OF rispettivamente per Home e End, mentre putty invia ^ [[1 ~ e < code> ^ [[4 ~ . C'è un'opzione in putty per cambiare le chiavi Home / End dalla modalità standard alla modalità rxvt , e questo sembra correggere il tasto Home, ma non il tasto Fine (che ora invia ^ [Ow ). Immagino sia il momento di presentare una segnalazione di bug da qualche parte ... :-)

la risposta appropriata che dovrebbe essere trasportabile su tutte distribuzioni (non necessariamente tutte le versioni di zsh, ymmv qui) è di usare l'utilità helper zkbd di zkbd.

  

Definizione della tastiera
  Il gran numero di possibili combinazioni di tastiere, stazioni di lavoro, terminali, emulatori e sistemi di finestre rende impossibile per zsh disporre di combinazioni di tasti integrate per ogni situazione. L'utilità zkbd, che si trova in Funzioni / Varie, può aiutarti a creare rapidamente associazioni di tasti per la tua configurazione.

     

Esegui zkbd come funzione caricata automaticamente o come script di shell:

zsh -f ~/zsh-4.3.17/Functions/Misc/zkbd
  

Quando esegui zkbd, ti chiede prima di inserire il tipo di terminale; se il valore predefinito offerto è corretto, basta premere Invio. Ti chiede quindi di premere un numero di tasti diversi per determinare le caratteristiche della tastiera e del terminale; zkbd ti avverte          se trova qualcosa fuori dall'ordinario, come un tasto Canc che non invia né ^ H né ^ ?.

     

Le sequenze di tasti lette da zkbd sono registrate come definizione per un array associativo denominato key, scritto in un file nella sottodirectory .zkbd all'interno della directory HOME o ZDOTDIR. Il nome del file è composto da TERM, VENDOR e OSTYPE          parametri, uniti da trattini.

     

Puoi leggere questo file nel tuo .zshrc o in un altro file di avvio con source 'o .' comandi, quindi fai riferimento al parametro chiave nei comandi bindkey, in questo modo:

          source ${ZDOTDIR:-$HOME}/.zkbd/$TERM-$VENDOR-$OSTYPE
          [[ -n ${key[Left]} ]] && bindkey "${key[Left]}" backward-char
          [[ -n ${key[Right]} ]] && bindkey "${key[Right]}" forward-char
          # etc.
  

Si noti che per far funzionare `autoload zkbd ', il file zkdb deve trovarsi in una delle directory nominate nell'array fpath (vedere zshparam (1)). Questo dovrebbe già essere il caso se si dispone di un'installazione zsh standard; in caso contrario, copiare Functions / Misc / zkbd in una directory appropriata.

vedi man -P " less -p 'tastiera definition' " zshcontrib, oppure cerca nella meta-manpage zshall

Questi bind semplicemente non sembrano far parte dei bind predefiniti impostati in modalità emacs.

eseguendo " dov'è l'inizio della riga " sulla mia installazione predefinita di zsh dopo aver eseguito " bindkey -e " mostra che è legato solo a ^ a. Forse dovresti chiedere agli sviluppatori di zsh perché :-)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top