내에는 다음과 같은 기능이 있습니다..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
있다고 가정하고 일부 시스템에서는 패키지를 설치해야 할 수도 있음 ) 다음을 볼 수 있습니다(강조).zsh
info
zsh-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'}