문제

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 개발자에게 이유를 물어봐야 할 것입니다 :-)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top