V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
975779964
V2EX  ›  Linux

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

  •  
  •   975779964 · 2021-11-30 09:37:51 +08:00 · 2574 次点击
    这是一个创建于 1097 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 ./screen/jietu4.png

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

    ./screen/jietu4.png ----> cd $(dirname ./screen/jietu4.png) ---> ~/screen
    6 条回复    2021-11-30 15:18:56 +08:00
    2i2Re2PLMaDnghL
        1
    2i2Re2PLMaDnghL  
       2021-11-30 10:29:52 +08:00
    cd $(dirname ^T{选择你的目标} )
    ^T 可以在任何地方使用
    aloxaf
        2
    aloxaf  
       2021-11-30 11:20:18 +08:00   ❤️ 1
    fzf 确实可以自定义动作,但你这个需求做不到——因为 fzf 只能在新开的 shell 里执行命令,影响不到上层的 shell

    你这个需求只能配置 shell 了,比如 zsh 的是这样: https://fars.ee/DsX7/zsh
    975779964
        3
    975779964  
    OP
       2021-11-30 11:43:53 +08:00
    @aloxaf 哇,遇到 fzf-tab 的作者了! 是我想要的结果 , zsh 里面定义 快捷键也可以 ! 谢谢 ,但是 我 shell 太差, 有点不明白
    fzf-file-widget() {
    cd ${$(__fsel):h} # 这个 __fsel 是啥? (__fsel):h 又是什么意思
    local ret=$? # 在函数中定义局部变量 将上个 cd xxx 的结果返回 (但是 cd xxx 结果应该返回 0 呀 return 0 做什么呢? )

    # 这两行是刷新 prompt 的,可以去掉, (zle 好像是 定义 zsh 快捷键之类 的)
    zle push-line-or-edit
    zle accept-line

    return $ret
    }
    zle -N fzf-file-widget
    bindkey '^T' fzf-file-widget

    能不能帮我解释下…… 或者 有没有对应 资料 的网站 我去 学习下
    975779964
        4
    975779964  
    OP
       2021-11-30 12:27:21 +08:00
    @aloxaf 我大概明白了,
    __fsel 应该是调用 fzf 的命令
    $(__fsel):h 是 把是取目录名,即最后一个 / 之前的部分,如果没有 / 则为 .

    现在的问题是

    为什么要返回 cd xxx 这个命令的结果呢?
    aloxaf
        5
    aloxaf  
       2021-11-30 14:26:56 +08:00   ❤️ 1
    > 这个 __fsel 是啥?
    __fsel 是 fzf 的 zsh 配置里定义的函数,我只是猜测你应该用了官方配置
    https://github.com/junegunn/fzf/blob/master/shell/key-bindings.zsh#L42

    > 为什么要返回 cd xxx 这个命令的结果呢?
    因为我是拿 fzf-file-widget 改的(
    原本的目的是返回 __fsel 的状态码,我这里偷懒没做处理,我推荐你处理一下——否则当使用 C-c 中断 fzf 时,就会回到 HOME 目录
    975779964
        6
    975779964  
    OP
       2021-11-30 15:18:56 +08:00
    @aloxaf 谢谢! 学习了, 原来 zsh 也有自己的 语法 https://github.com/goreliu/zshguide
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2719 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 09:15 · PVG 17:15 · LAX 01:15 · JFK 04:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.