我的.zshrc中有以下函数
function foo() {
filename="$(fzf)"
}
zle -N foo
bindkey '^X' foo现在,如果我通过键入foo来调用它,它会像预期的那样工作,但是如果我通过^X的键绑定调用它,则fzf缓冲区是空的。
有人能复制这个吗?我怎么才能解决这个问题?
发布于 2020-06-27 14:43:04
如果重点是在当前光标位置插入fzf的输出(引用正确),则应该如下所示:
insert-quoted-fzf-output() {
local output
output=$(fzf也就是说,您需要在$LBUFFER的末尾(游标左边的编辑缓冲区的一部分)插入引用的输出(这里使用q-参数扩展标志来最小化引用量),并且需要fzf从终端获取输入。如果fzf失败,您可能希望小部件返回一个非零的退出状态。
这里关于空fzf缓冲区的具体问题是缺少的重定向。
如果您运行fzf作为fzf < /dev/null,您会注意到它的相同行为。
如果您运行info zsh widgets (假设您拥有以info格式提供的zsh文档;在某些系统上,您可能需要安装一个zsh-doc包),您将看到(强调我的):
18.5用户定义的小部件用户定义的小部件作为shell函数实现,可以执行任何普通的shell命令.它们还可以使用zle内置命令运行其他小部件(无论是内置的还是用户定义的)。函数的The标准输入被从/dev/null重定向,以防止外部命令无意中通过从终端读取来阻塞ZLE,但是read -k或read -q可以用于读取字符。
当它的stdin不是终端时,fzf读取它来构造要提供给用户的选项列表。/dev/null是一种特殊的设备,任何读取任何内容的尝试都不会返回任何内容,这就解释了为什么得到一个空缓冲区。在那里还原一个终端使它切换回模式,在那里,它读取$FZF_DEFAULT_COMMAND命令的输出(默认情况下是一些find命令),而不是读取选择列表的stdin。
另一种选择是自己实际运行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'}https://unix.stackexchange.com/questions/595350
复制相似问题