zle 키 바인딩에서 fzf 사용

zle 키 바인딩에서 fzf 사용

내에는 다음과 같은 기능이 있습니다..zshrc

function foo() {
    filename="$(fzf)"
}
zle -N foo
bindkey '^X' foo

이제 foo입력하여 호출하면 예상대로 작동하지만 를 사용하여 키바인딩하여 호출하면 ^X버퍼 fzf가 비어 있습니다.

누구든지 이것을 재현할 수 있습니까? 이 문제를 어떻게 해결할 수 있나요?

답변1

현재 커서 위치에 올바르게 인용된 출력을 삽입 하려면 fzf다음과 같아야 합니다.

insert-quoted-fzf-output() {
  local output
  output=$(fzf</dev/tty) && LBUFFER+=${(q-)output}
}

zle -N insert-quoted-fzf-output
bindkey '^X' insert-quoted-fzf-output

$LBUFFER즉, 해당 출력을 끝 부분(커서 왼쪽에 있는 편집 버퍼 부분)에 삽입하고 따옴표로 묶어야 합니다( q-여기서는 매개변수 확장 플래그가 사용되어 인용량을 최소화합니다). fzf터미널에서 시작하세요 . 실패할 경우 위젯이 0이 아닌 종료 상태를 반환하도록 할 수 있습니다 fzf.

당신의 구체적인 질문fzf버퍼</dev/tty리디렉션 누락에 관한 것입니다 .

fzf로 실행하면 동일한 동작을 볼 수 있습니다 fzf < /dev/null.

실행하면 ( 사용 가능한 형식의 문서가 info zsh widgets있다고 가정하고 일부 시스템에서는 패키지를 설치해야 할 수도 있음 ) 다음을 볼 수 있습니다(강조).zshinfozsh-doc

18.5 사용자 정의 위젯

사용자 정의 위젯은 쉘 함수로 구현되며 일반적인 쉘 명령을 실행할 수 있습니다. 또한 다음 명령을 사용하여 다른 위젯(내장 또는 사용자 정의)을 실행할 수도 있습니다 zle. 기능의 표준 입력은 /dev/null에서 리디렉션되어 외부 명령이 터미널에서 읽어 ZLE를 실수로 차단하는 것을 방지합니다., 그러나 read -k또는 read -q문자를 읽는 데 사용할 수 있습니다.

표준 입력이 터미널이 아닌 경우 fzf이를 읽어 사용자에게 제공되는 선택 목록을 구성합니다. /dev/null특별한 장치이며 무엇이든 읽으려고 시도하면 아무것도 반환되지 않습니다. 이는 빈 버퍼를 얻는 이유를 설명합니다. 터미널을 복원하면 선택 목록에 대한 표준 입력을 읽지 않고 대신 명령( $FZF_DEFAULT_COMMAND기본적으로 일부 명령)의 출력을 읽는 모드로 다시 전환됩니다.find

find또 다른 옵션은 실제로 명령을 직접 실행하는 것입니다 . GNU 시스템을 사용하는 경우 시스템을 개선하여 신뢰성과 효율성을 높일 수도 있습니다.

output=$(
  LC_ALL=C find -L . -name . -o '(' \
    -name '.*' -o \
    -fstype sysfs -o \
    -fstype devfs -o \
    -fstype devtmpfs -o \
    -fstype proc ')' -prune -o -type f -printf '%P\0' 2> /dev/null |
    fzf --read0 --print0
) && output=${output%$'\0'}

관련 정보