zsh에 다른 바인딩이 없으면 일치하는 범용 키 바인딩은 무엇입니까?

zsh에 다른 바인딩이 없으면 일치하는 범용 키 바인딩은 무엇입니까?

존재하다생선 껍질, 다른 바인딩이 없는 경우 빈 문자열(예: '' )의 SEQUENCE를 지정하여 일치하는 범용 키 바인딩을 설정할 수 있습니다.

예를 들어:

bind '' self-insert

나는 확인했다zsh에 대한 문서유사한 기능에 대해서는 다음과 같이 말합니다.

-중

선택한 키맵에 내장된 메타 키 바인딩 세트를 추가합니다. 바인딩 해제되었거나 자체 삽입에 바인딩된 키만 영향을 받습니다.

제 목적에 맞게 사용할 수 있을지 모르겠습니다.

zsh에 다른 바인딩이 없으면 일치하는 범용 키 바인딩은 무엇입니까?

답변1

에서 zsh키에 대한 매핑(터미널에서 보낸 바이트 시퀀스)을 찾을 수 없을 때 호출되는 위젯은 undefined-key기본적으로 경고음이 울리는 위젯이지만 이를 다른 것으로 재정의할 수 있습니다. 예를 들면 다음과 같습니다.

undefined-key() {
  zle -M "${(q+)KEYS} is not bound to anything"
  zle .$WIDGET
}
zle -N undefined-key

또는 커서 왼쪽에 원시 바이트를 삽입하도록 합니다.

undefined-key() LBUFFER+=$KEYS
zle -N undefined-key

또는 와 같은 키맵에서는 바이트 범위 에 바인딩되어 키에 바인딩되어 self-insert있지 않습니다 .self-insertemacsviinsR

$ bindkey | awk '$NF == "self-insert"'
" "-"~" self-insert
"\M-^@"-"\M-^?" self-insert

^?127( 바인딩된 ) 을 제외한 32(공백)부터 255(M-^?)까지의 모든 바이트 값입니다 backward-delete-char.

다음과 같은 방법으로 다른 콘텐츠에 바인딩할 수 있습니다.

my-self-insert() { zle -M "You entered <$KEYS>"; zle self-insert; }
zle -N my-self-insert
for range (' -~' '\x80-\xff') bindkey -R $range my-self-insert

아마도 더 관용적인 방법은 다음을 재정의하는 것입니다 self-insert.

self-insert() { zle -M "You entered <$KEYS>"; zle .$WIDGET; }

다중 바이트 문자의 경우 위젯은 문자의 각 바이트에 대해 한 번 호출되며 내가 아는 한 범위는 단일 바이트로만 제한될 수 있습니다.

self-insert또한 항상 다음과 같이 할 수 있지만 단일 바이트에서만 작동합니다.

my-self-insert() {
  zle -M "You entered <$KEYS>"
  repeat ${NUMERIC-1} LBUFFER+=$KEYS
}
for c ({$'\ua0'..$'\uff'}) bindkey $c my-self-insert

유니코드 문자 U+00A1부터 U+00FF까지 바인딩하고 (줄 편집 버퍼의 왼쪽 부분)에 (위젯을 호출하는 터미널이 전송되도록 하는 바이트 또는 바이트 시퀀스)를 추가하여 my-self-insert수동으로 자체 삽입을 수행합니다. .$KEYS$LBUFFER

관련 정보