다음과 같은 간단한 위젯을 만들었습니다.
function my_widget() { ... }
zle -N my_widget
bindkey '^P' my_widget
문제는 이 키 바인딩이 항상 작동하지 않는다는 것입니다. 예를 들어 스크립트가 패스 read
또는 입력을 기다리는 동안에는 vared
위젯을 호출할 수 없습니다 . 언제든지 호출할 수 있기를 원합니다(예: ^U
또는 ^W
).
모든 키맵에 키바인딩을 추가해 보았습니다( .safe
쓰기 금지되어 있으므로 제외).
ZLE 위젯이 아니더라도 어디에서나 바로가기를 사용할 수 있기를 원합니다.
내가 이루고 싶은 것을 이룰 수 있을까?
답변1
zle
/는 bindkey
현재 쉘을 구성하는 z
Shine Ditor입니다 l
.e
대화형 셸에서 또는 해당 vared
명령을 통해 명령 ed
줄을 편집하려면 zle을 호출하세요 var
. 두 경우 모두 zle은 한 줄에 국한되지 않고 모든 텍스트를 편집할 수 있습니다.
read
라인 편집기를 사용하는 대신,읽다-d
stdin(또는 다른 라인 설명자)에서 단일 라인(또는 다른 유형의 레코드)을 가져오며 -u
터미널 장치일 필요는 없으며 해당 레코드의 단어를 제공된 변수에 저장합니다.
사용자가 스크립트에 일부 텍스트를 입력하고 zle을 사용하여 편집하도록 하려면 다음을 사용해야 합니다 vared
.
var=; vared var
대신 IFS= read -r var
, stdin이 해당 터미널이 아니더라도 입력은 항상 터미널의 사용자로부터 읽혀진다는 점을 기억하십시오.
zsh 인스턴스의 행 편집기가 기본값과 다른 키 바인딩을 갖도록 스크립트를 해석하기 시작하려면 zsh 인스턴스에서 이러한 명령을 실행하고 zle
명령 bindkey
을 사용하여 이러한 위젯을 정의하고 바인딩해야 합니다.
이러한 위젯을 에 추가하여~/.zshenv
모든zsh
^W
및 의 경우 ^U
zle zsh
위젯이 있지만 해당 위젯을 모방(및 향상)합니다.작은 부품라인 편집기(and)에 대한 터미널 장치 라인 규칙(커널의 tty 장치 드라이버에 있음) erase
. kill
라인 편집기(애플리케이션이 자체 라인 편집기를 구현하지 않고 터미널에서 읽을 때 사용됨)는 매우 기본적이며 명령을 사용하여 바인딩할 수 있는 몇 가지 위젯( kill
, erase
, eol
, ...)만 있고 그 이상은 많지 않습니다. 더 구성 가능합니다.eof
stty