나는 질문 (1) 만 다룰 것입니다.
문제가 KEYTIMEOUT입니다. zshzle (1)에서 인용합니다.
ZLE은 터미널에서 명령을 읽을 때 일부 명령에 바인딩 된 시퀀스를 읽을 수 있으며 더 긴 바인딩 된 문자열의 접두사이기도합니다. 이 경우 ZLE는 더 많은 문자가 입력되었는지 확인하기 위해 특정 시간 동안 대기하며, 그렇지 않으면 (또는 더 이상 문자열과 일치하지 않는 경우) 바인딩을 실행합니다. 이 시간 종료는 KEYTIMEOUT 매개 변수에 의해 정의됩니다. 기본값은 0.4 초입니다. 접두사 문자열 자체가 명령에 바인딩되지 않은 경우 시간 초과가 없습니다.
0.4 초는 ESC를 친 후 겪는 지연입니다. 수정 사항은 셸 시작 파일 중 하나에서 KEYTIMEOUT을 0.01 이하로 설정하는 것입니다.
export KEYTIMEOUT=1
불행히도 이것은 두드리는 효과가 있습니다. 다른 일이 잘못되기 시작합니다…
먼저 vi 명령 모드에 문제가 있습니다. ESC를 입력하면 커서가 정지되고 다음에 입력하는 문자가 모두 삼켜집니다. vi 명령 모드에서는 ESC가 기본적으로 어떤 것에도 바인딩되어 있지 않기 때문에 ESC (커서 키!)로 시작하는 다중 문자 위젯이 있습니다. 따라서 ESC를 누르면 ZLE가 다음 문자를 기다렸다가 소비합니다.
해결 방법은 명령 모드에서 ESC를 무언가 에 바인딩하여 $ KEYTIMEOUT 센티 초 후에 무언가 가 ZLE로 전달 되도록하는 것 입니다. 이제 우리는 이러한 나쁜 영향없이 명령 모드에서 ESC로 시작하는 바인딩을 유지할 수 있습니다. 나는 ESC를 벨 문자에 묶습니다.이 문자는 자기 삽입보다 덜 방해 적입니다 (그리고 내 껍질은 침묵합니다).
bindkey -sM vicmd '^[' '^G'
2017 년 업데이트 :
ESC 바인딩을위한 더 나은 솔루션 인 undefined-key
위젯 을 찾았습니다 . 원래이 답변을 쓸 때이 위젯이 zsh에서 사용 가능한지 확실하지 않습니다.
bindkey -M vicmd '^[' undefined-key
다음 문제 : 기본적으로 vi 삽입 모드에서 ^ X로 시작하는 일부 두 개의 키 위젯이 있습니다. $ KEYTIMEOUT을 끝까지 설정하면 사용할 수 없게됩니다. 내가하는 일은 vi 삽입 모드에서 ^ X를 바인드 해제하는 것입니다 (기본적으로 자체 삽입입니다). 이를 통해 두 키 위젯이 계속 작동 할 수 있습니다.
bindkey -rM viins '^X'
자체 삽입에 대한 바인딩을 잃어 버렸지 만 물론 다른 것에 바인딩 할 수 있습니다. (나는 그것을 사용하지 않기 때문에, 나는하지 않습니다.)
마지막 문제 (지금까지 찾았습니다) : $ KEYTIMEOUT을 아래로 설정하여 "손실"할 몇 가지 기본 키 바인딩이 있습니다. 커서 키 가 아닌 vi 삽입 모드에서 ESC로 시작하는 키. 대신 ^ X로 시작하도록 개인적으로 리 바인드했습니다.
bindkey -M viins '^X,' _history-complete-newer \
'^X/' _history-complete-older \
'^X`' _bash_complete-word
2018 업데이트 :
위의 전체 섹션 ( "2017 업데이트"이후)이 반드시 필요한 것은 아닙니다. 다음을 사용하여 키보드 매핑에서 META 키를 ESC와 동일하게 설정할 수 있습니다.
bindkey -mv
따라서 ^ X를 바인드 해제 하지 말고 대신 META를 리더로 사용하여 ESC에서 시작하는 키 바인딩에 액세스 할 수 있습니다 (현대 키보드에서는 ALT 또는 OPT).
Kiddle et al.의 Bash에서 Z Shell 로 책을 열람 할 수 있다면 , 키 바인딩에서 ESC와 META의 동등성에 대해서는 78-79 페이지의 4 장 사이드 바에서 설명합니다.
i
두 번 눌러 삽입 모드로 돌아 가야하는 경우이 수정 프로그램을 사용 하는 것이 좋습니다 .