ZSH의 홈/엔드 키는 퍼티와 함께 작동하지 않습니다.
-
03-07-2019 - |
문제
Ubuntu 상자의 기본 쉘로 Zsh를 실행하고 있으며 Gnome-Terminal을 사용하여 모든 것이 잘 작동합니다 (내가 아는 한 xterm을 에뮬레이트하는 한). SSH 및 Putty (Xerm을 에뮬레이트하는)를 통해 Windows 상자에서 로그인하면 홈/엔드 키가 더 이상 작동하지 않습니다.
이 라인을 ZSHRC 파일에 추가 할 수있었습니다 ...
bindkey '\e[1~' beginning-of-line
bindkey '\e[4~' end-of-line
...하지만 여기서 무엇이 잘못되었는지 궁금합니다. 아이디어가 있습니까?
해결책
조합이라는 것을 알았습니다.
하나
ZSH 개발자는 ZSH가의 행동을 정의해야한다고 생각하지 않습니다. 집, 끝, 델, ... 키.
Debian과 Ubuntu는 평균 사용자가 전 세계에서 기대할 수있는 정상적인 조치를 정의하여 이것을 수정합니다. /etc/zsh/zshrc
파일. 관련 코드를 따릅니다 (Debian 및 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
따라서 데비안이나 우분투 상자에 연결하는 경우 아무것도 할 필요가 없습니다. 모든 것이 자동으로 작동해야합니다 (그렇지 않은 경우 아래 참조).
하지만 ... 다른 상자에 연결하는 경우 (예 : FreeBSD) 사용자 친화적 기본값이 없을 수 있습니다. zshrc
. 해결책은 물론 데비안/우분투의 라인을 추가하는 것입니다. zshrc
당신 자신에게 .zshrc
.
둘
퍼티가 보냅니다 xterm
원격 호스트의 터미널 유형으로. 그러나 어딘가에 엉망이되어 올바른 제어 코드를 보내지 않습니다. 집, 끝, ... 그 사람은 xterm
. 또는 xterm
터미널은 그 또는 무엇이든 보낼 것으로 예상되지 않습니다 ... (델 키가 작동합니다 xterm
그러나 ZSH로 구성하면). 또한 Numpad-Keys는 예를 들어 VIM에서 재미있게 행동합니다. xterm
단말기.
해결책은 퍼티를 다른 터미널 유형을 보내도록 구성하는 것입니다. 난 노력 했어 xterm-color
그리고 linux
. xterm-color
고정 집/끝 문제이지만, 나 럼프드는 여전히 재미있었습니다. 설정 linux
두 문제를 모두 수정했습니다.
연결 -> 데이터에서 퍼티에서 터미널 유형을 설정할 수 있습니다. 터미널 유형을 설정하려는 유혹을받지 마십시오. .zshrc
~와 함께 export TERM=linux
, 그것은 단지 잘못입니다. 터미널 유형은 터미널 앱으로 지정해야합니다. 예를 들어 Mac SSH 클라이언트를 사용하여 Mac Box에서 연결하면 자체 터미널 유형을 설정할 수 있습니다.
용어는 터미널 유형을 지정하고 연결하는 호스트와 관련이 없습니다. 터미널 유형을 설정할 수 있습니다 linux
퍼티에서 문제없이 FreeBSD 서버에 연결합니다.
따라서이 두 가지를 모두 고치면 괜찮을 것입니다 :)
다른 팁
퍼티 구성 대화 상자에서 연결 -> 데이터 및 유형으로 이동 리눅스 연결하기 전에 터미널 유형 문자열로.
이것은 나를 위해 일하고 있습니다
bindkey -v
bindkey '\eOH' beginning-of-line
bindkey '\eOF' end-of-line
퍼티처럼 보입니다. 그놈-말단은 코드를 보냅니다 ^[OH
그리고 ^[OF
퍼티가 보내는 동안 각각 집과 끝의 경우 ^[[1~
그리고 ^[[4~
. 퍼티에는 홈/엔드 키를 변경할 수있는 옵션이 있습니다. 기준 모드 RXVT 모드, 그리고 그것은 홈 키를 고치는 것처럼 보이지만 엔드 키는 아닙니다 (지금은 보냅니다. ^[Ow
). 어딘가에 버그 보고서를 제출할 시간 인 것 같아요 ... :-)
휴대 할 수있는 적절한 답변 모두 배포판 (ZSH의 모든 버전, ymmv는 여기서는 반드시 ZKV)는 ZKBD의 ZKBD 헬퍼 유틸리티를 사용하는 것입니다.
키보드 정의
키보드, 워크 스테이션, 터미널, 에뮬레이터 및 창 시스템의 가능한 많은 조합으로 인해 ZSH는 모든 상황에 대한 키 바인딩을 내장 할 수 없습니다. 함수/기타에있는 ZKBD 유틸리티는 구성에 대한 주요 바인딩을 신속하게 생성하는 데 도움이 될 수 있습니다.ZKBD를 자동로드 함수 또는 쉘 스크립트로 실행하십시오.
zsh -f ~/zsh-4.3.17/Functions/Misc/zkbd
ZKBD를 실행하면 먼저 터미널 유형을 입력하도록 요청합니다. 제공하는 기본값이 올바른 경우 리턴을 누릅니다. 그런 다음 키보드와 터미널의 특성을 결정하기 위해 여러 가지 키를 누르도록 요청합니다. ZKBD는 ^h Nor ^?
ZKBD가 읽은 키 스트로크는 홈 또는 ZDOTDIR 디렉토리의 하위 디렉토리 .ZKBD의 파일에 작성된 Key라는 연관 배열에 대한 정의로 기록됩니다. 파일의 이름은 하이픈으로 연결된 용어, 공급 업체 및 Ostype 매개 변수로 구성됩니다.
이 파일을 .zshrc 또는 다른 시작 파일로 읽을 수 있습니다.
source' or
. ' 명령, 다음과 같이 Bindkey 명령의 주요 매개 변수를 참조하십시오.
source ${ZDOTDIR:-$HOME}/.zkbd/$TERM-$VENDOR-$OSTYPE
[[ -n ${key[Left]} ]] && bindkey "${key[Left]}" backward-char
[[ -n ${key[Right]} ]] && bindkey "${key[Right]}" forward-char
# etc.
`autoload zkbd '가 작동하려면 ZKDB 파일은 fpath 배열에 명명 된 디렉토리 중 하나에 있어야합니다 (Zshparam (1) 참조). 표준 ZSH 설치가있는 경우 이미 그렇습니다. 그렇지 않은 경우 함수/misc/zkbd를 적절한 디렉토리로 복사하십시오.
보다 man -P "less -p 'keyboard definition'"
zshcontrib 또는 메타 맨 페이지를 검색하십시오 zshall
이러한 바인딩은 단순히 EMACS 모드에서 설정된 기본 바인딩의 일부인 것으로 보이지 않습니다.
"bindkey -e"를 실행 한 후 기본 ZSH 설치에서 "where-is the thear-line"을 실행하면 ^a에만 바운드가 표시됩니다. 아마도 ZSH 개발자에게 이유를 물어봐야 할 것입니다 :-)