"인라인" zsh 기능

"인라인" zsh 기능

내 .zshrc에는 vim 기록을 인쇄하고 vim에서 선택한 파일을 여는 다음 함수 정의가 있습니다.

vim_hist() {
    n=$(sed -n "s|~|$HOME|;s|^> \(.*\)|\1|p" ~/.vim/viminfo | fzf)
    [ "$n" != "" ] && [ -f "$n" ] && vim $n
}

이것은 .zshrc의 선언입니다.

zle -N VH vim_hist
bindkey '^a' VH

vim_hist쉘에 들어가면 모든 것이 잘 작동합니다. 그러나 이렇게 하면 CTRL-A경고가 표시되어 Vim: Warning: Input is not from terminal명령 실행 속도가 눈에 띄게 느려집니다. 여기서 문제가 무엇입니까?

답변1

설명서( info zsh widgets)를 참조하세요.

사용자 정의 위젯은 쉘 함수로 구현되며 일반적인 쉘 명령을 실행할 수 있습니다. 또한 zle 내장 명령을 사용하여 다른 위젯(내장 또는 사용자 정의)을 실행할 수도 있습니다. 기능의 표준 입력은 /dev/null에서 리디렉션되어 외부 명령이 터미널에서 읽어 ZLE를 실수로 차단하는 것을 방지합니다.하지만 read -k 또는 read -q를 사용하여 문자를 읽을 수 있습니다. 마지막으로 아래 설명된 특수 매개변수를 읽고 설정하여 편집 중인 ZLE 버퍼를 검사하고 편집할 수 있습니다.

여기에서 할 수 있습니다실행 취소이렇게 하면:

vim_hist() {
    n=$(sed -n "s|~|$HOME|;s|^> \(.*\)|\1|p" ~/.vim/viminfo | fzf)
    if [ "$n" != "" ] && [ -f "$n" ]; then
        vim < /dev/tty $n
        zle -I
    fi
}

(또한 zle -I힌트를 무효화하여 반환 시 다시 그려지도록 호출됩니다 vim)

관련 정보