您尚未登录。

#1 2021-11-30 09:52:06

ifnk
会员
注册时间: 2021-01-25
帖子: 93

如何在 fzf 搜索的时候 定义 按下 enter 的动作

1. 实际结果:命令行 按下 ctrl+t 后 选择 某个文件
$
> png
81605/217921 (0)
> ./screen/jietu4.png
./screen/jietu2.png
./screen/jietu1.png
./screen/jietu3.png
./screen/zhoubao.png

按回车

$ ./screen/jietu4.png

2. 我想要的结果: 按下 ctrl+t 后 选择 某个文件
$
> png
81605/217921 (0)
> ./screen/jietu4.png
./screen/jietu2.png
./screen/jietu1.png
./screen/jietu3.png
./screen/zhoubao.png

按回车 (这个时候想要他执行 cd $(dirname ./screen/jietu4.png) 这个命令 cd 到文件所在的文件夹 )

$~/screen

3. 就是说 fzf 选择搜索的结果 然后 按 enter 的过程中 有没有 什么拦截的操作,可以 把 获取 的路径拦截 ,用我自定义的命令 处理一下 最后 执行

./screen/jietu4.png ----> cd $(dirname ./screen/jietu4.png) ---> ~/screen

离线

#2 2021-11-30 10:40:37

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,961
个人网站

Re: 如何在 fzf 搜索的时候 定义 按下 enter 的动作

fzf 获取的路径不是打在标准输出上了吗?你那个放在命令行上的,是你的 shell 插件做的。你不用它就好了。

离线

#3 2021-11-30 11:19:08

ifnk
会员
注册时间: 2021-01-25
帖子: 93

Re: 如何在 fzf 搜索的时候 定义 按下 enter 的动作

依云 说:

fzf 获取的路径不是打在标准输出上了吗?你那个放在命令行上的,是你的 shell 插件做的。你不用它就好了。

我用的是zsh , 就是默认 的 fzf 太弱了 ,然后 安装 fzf 的时候 他 自动 给我 在 zsh 里面 定义 了 alt+c 和 ctrl+ t 这两个好用的功能 ,一个是跳转 文件夹的 cd ,另一个是 把文件路径  显示在 命令行上的

我现在想要 的是 改造 这个 ctrl+ t 功能 ,因为你搜索出来 以后 打在 命令行上面  没有用呀, 我还得 把光标 ctal+a 移动到行首 ,然后 输入 vim (结果) 或者  cd (dirname (结果)) 这样的 很不方便

所以我想自己定义下 这个 ctrl+ t 功能 ,但是 没有找到资料 ……

离线

#4 2021-11-30 11:40:27

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,961
个人网站

Re: 如何在 fzf 搜索的时候 定义 按下 enter 的动作

所以你自己写个 widget 调用 fzf 就好了呀。不知道怎么写 zle widget 的话可以先去看 zsh guide 然后看 zsh 的手册。
或者参考一下我的 sk-tools: https://github.com/lilydjwg/dotzsh/blob … -tools.zsh

离线

#5 2021-11-30 11:47:26

ifnk
会员
注册时间: 2021-01-25
帖子: 93

Re: 如何在 fzf 搜索的时候 定义 按下 enter 的动作

依云 说:

所以你自己写个 widget 调用 fzf 就好了呀。不知道怎么写 zle widget 的话可以先去看 zsh guide 然后看 zsh 的手册。
或者参考一下我的 sk-tools: https://github.com/lilydjwg/dotzsh/blob … -tools.zsh


有个人回复我了! 答案是 这个

fzf-file-widget() {
  cd ${$(__fsel):h}
  local ret=$?
 
  # 这两行是刷新 prompt 的,可以去掉,
  zle push-line-or-edit
  zle accept-line
 
  return $ret
}
zle     -N   fzf-file-widget
bindkey '^T' fzf-file-widget

我去看看 zsh 帮助 ,谢谢你 !

离线

#6 2021-11-30 12:00:42

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,961
个人网站

Re: 如何在 fzf 搜索的时候 定义 按下 enter 的动作

这刷新提示符的用法好奇特。直接 zle reset-prompt 不好么。

离线

#7 2021-11-30 12:26:54

ifnk
会员
注册时间: 2021-01-25
帖子: 93

Re: 如何在 fzf 搜索的时候 定义 按下 enter 的动作

依云 说:

这刷新提示符的用法好奇特。直接 zle reset-prompt 不好么。

我大概明白了,
__fsel 应该是调用 fzf 的命令
  $(__fsel):h 是 把是取目录名,即最后一个 / 之前的部分,如果没有 / 则为 .

现在的问题是

为什么要返回 cd xxx 这个命令的结果呢?

离线

#8 2021-11-30 23:29:41

tanloong
会员
注册时间: 2021-08-15
帖子: 29

Re: 如何在 fzf 搜索的时候 定义 按下 enter 的动作

~/.zshrc:

function fzf_open_with {
    file="$(fzf --reverse)"
    dir="${file%/*}"
    if [ -n "$file" ]; then # in case you press <Esc> and fzf returns zero length of string
        "$1" "$file" 2>/dev/null || "$1" "$dir";
    fi
}

export EDITOR="vim"
export PDFVIEWER="zathura"
export FILE_MANAGER="lf"

alias \
    fv='fzf_open_with $EDITOR' \
    fz='fzf_open_with $PDFVIEWER' \
    fr='fzf_open_with cd; $FILE_MANAGER' \
    fcd='fzf_open_with cd'

最近编辑记录 tanloong (2021-12-01 13:20:37)

离线

#9 2021-12-01 09:44:03

ifnk
会员
注册时间: 2021-01-25
帖子: 93

Re: 如何在 fzf 搜索的时候 定义 按下 enter 的动作

tanloong 说:

~/.zshrc:

function fzf_open_with {
    file="$(fzf --reverse)"
    dir="${file%/*}"
    if [ -n "$file" ]; then
        "$1" "$file" 2>/dev/null || "$1" "$dir";
    fi
}

export EDITOR="vim"
export PDFVIEWER="zathura"
export FILE_MANAGER="lf"

alias \
    fv='fzf_open_with $EDITOR' \
    fz='fzf_open_with $PDFVIEWER' \
    fr='fzf_open_with cd; $FILE_MANAGER' \
    fcd='fzf_open_with cd'

哇,你这个也好,拿去用了, 谢谢

离线

页脚