Pergunta

Estou correndo zsh como shell padrão em uma caixa de Ubuntu, e tudo funciona muito bem usando gnome-terminal (que, tanto quanto eu sei emula xterm). Quando eu iniciar sessão de um Windows caixa via ssh e massa de vidraceiro (que também emula xterm) suddendly o home / chaves finais não funcionam mais.

Eu tenho sido capaz de resolver esse adicionando estas linhas ao meu arquivo zshrc ...

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

... mas eu ainda estou querendo saber o que está errado aqui. Alguma idéia?

Foi útil?

Solução

Eu achei que é uma combinação:

Um

Os desenvolvedores zsh não acho que ZSH deve definir as ações do Home , Terminar , Del , ... chaves.

Debian e Ubuntu corrigir isso definindo as ações normais o usuário médio seria de esperar no arquivo /etc/zsh/zshrc global. Após o código relevante (é o mesmo no 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

Então, se você está se conectando a uma caixa de Debian ou Ubuntu, você não tem que fazer nada. Tudo deve funcionar automagicamente (se não, veja abaixo).

Mas ... se você se conectar a outra caixa (por exemplo, FreeBSD), pode haver nenhum usuário amigável zshrc padrão. A solução é, naturalmente, para adicionar as linhas do zshrc Debian / Ubuntu para o seu próprio .zshrc.

Dois

Putty envia xterm como tipo de terminal para o host remoto. Mas mexe-se em algum lugar e não enviar os códigos de controle corretos para Home , Terminar , ... que seria de esperar de um xterm. Ou um terminal xterm não é esperado para enviar aqueles ou o que quer ... ( Del tecla faz o trabalho em xterm no entanto, se você configurá-lo em ZSH). Também notar que o seu teclado numérico teclas de agir de forma estranha no Vim por exemplo, com o terminal xterm.

A solução é configurar o Putty para enviar outro tipo de terminal. Eu tentei xterm-color e linux. xterm-color fixou o Home / Terminar problema, mas o Numpad ainda era engraçado. Defini-lo para linux fixa ambos os problemas.

Você pode definir o tipo de terminal no Putty em Ligação -> Data. Não ser tentado a definir o seu tipo de terminal em sua .zshrc com export TERM=linux, que é simplesmente errado. O tipo de terminal deve ser especificado pelo seu aplicativo terminal. Assim que, se, por exemplo, você se conectar a partir de uma caixa de Mac com um cliente Mac SSH que pode definir o seu próprio tipo de terminal.

Observe que TERM especifica o tipo de terminal e não tem nada a ver com o host que você está se conectando. Eu posso definir o meu tipo de terminal para linux em Putty e se conectar a servidores FreeBSD sem problemas.

Assim, correção ambas essas coisas e você deve estar bem:)

Outras dicas

Na janela de configuração do PuTTY, vá para Connection -.> Data e tipo linux na cadeia de caracteres do tipo Terminal antes de ligar

Esse é um trabalho para mim

bindkey -v

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

Parece uma coisa massa de vidraceiro. Gnome-terminal envia o ^[OH códigos e ^[OF para Início e Fim respectivamente, enquanto massa envia ^[[1~ e ^[[4~. Há uma opção em massa para mudar as chaves Início / Fim de padrão modo e rxvt Modo, e que parece corrigir a tecla Home, mas não a chave End (que agora envia ^[Ow). Acho que é hora de apresentar um relatório de bug em algum lugar ...: -)

a resposta adequada que deve ser portátil através de todas distros (não necessarly todas as versões do zsh porém, ymmv aqui) é usar o utilitário auxiliar zkbd de zkbd.

Teclado Definição
O grande número de combinações possíveis de teclados, estações de trabalho, terminais, emuladores, e sistemas de janela torna impossível para zsh ter built-in de teclas para cada situação. O utilitário zkbd, encontrada em Funções / Misc, pode ajudá-lo a criar rapidamente atalhos de teclado para sua configuração.

Executar zkbd quer como uma função carregados automaticamente, ou como um shell script:

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

Quando você executa zkbd, primeiro ele pede que você digite o seu tipo de terminal; se o padrão que oferece é correto, apenas pressione enter. Em seguida, ele pede-lhe para pressionar uma série de chaves diferentes para determinar as características de seu teclado e terminal; zkbd avisa caso encontre qualquer coisa fora do comum, como um tecla Delete que envia nem ^ H ^ nem ?.

A combinação de teclas lido por zkbd são contabilizados como uma definição para uma matriz associativa chamada chave, gravados em um arquivo no .zkbd subdiretório quer sua casa ou diretório ZDOTDIR. O nome do arquivo é composto a partir do termo, fornecedor e OSTYPE parâmetros, apoiado por hífens.

Você pode ler este arquivo em seu .zshrc ou outro arquivo de inicialização com o source' or '. comandos, em seguida, referenciar o parâmetro chave em comandos bindkey, como este:

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

Note que para `autoload zkbd' ao trabalho, o arquivo zkdb deve estar em um dos diretórios nomeados em sua matriz fpath (veja zshparam (1)). Isso já deve ser o caso se você tiver uma instalação zsh padrão; se não for, copiar Funções / Misc / zkbd para um diretório apropriado.

ver man -P "less -p 'keyboard definition'" zshcontrib, ou pesquisar na meta-manpage zshall

Essas ligações simplesmente não parecem ser parte das ligações padrão configuradas no modo emacs.

execução "onde-está começando-de-linha" na minha instalação zsh padrão após a execução mostra "-e bindkey" só é obrigado a ^ a. Talvez você deve perguntar os desenvolvedores zsh porquê: -)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top