首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在zle键绑定中使用fzf

在zle键绑定中使用fzf
EN

Unix & Linux用户
提问于 2020-06-27 10:02:04
回答 1查看 617关注 0票数 3

我的.zshrc中有以下函数

代码语言:javascript
复制
function foo() {
    filename="$(fzf)"
}
zle -N foo
bindkey '^X' foo

现在,如果我通过键入foo来调用它,它会像预期的那样工作,但是如果我通过^X的键绑定调用它,则fzf缓冲区是空的。

有人能复制这个吗?我怎么才能解决这个问题?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2020-06-27 14:43:04

如果重点是在当前光标位置插入fzf的输出(引用正确),则应该如下所示:

代码语言:javascript
复制
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系统,您甚至可以对其进行改进,以增加更高的可靠性和效率:

代码语言:javascript
复制
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'}
票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/595350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档