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

2021-11-30 09:37:51 +08:00
 975779964
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
2377 次点击
所在节点    Linux
6 条回复
2i2Re2PLMaDnghL
2021-11-30 10:29:52 +08:00
cd $(dirname ^T{选择你的目标} )
^T 可以在任何地方使用
aloxaf
2021-11-30 11:20:18 +08:00
fzf 确实可以自定义动作,但你这个需求做不到——因为 fzf 只能在新开的 shell 里执行命令,影响不到上层的 shell

你这个需求只能配置 shell 了,比如 zsh 的是这样: https://fars.ee/DsX7/zsh
975779964
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
2021-11-30 12:27:21 +08:00
@aloxaf 我大概明白了,
__fsel 应该是调用 fzf 的命令
$(__fsel):h 是 把是取目录名,即最后一个 / 之前的部分,如果没有 / 则为 .

现在的问题是

为什么要返回 cd xxx 这个命令的结果呢?
aloxaf
2021-11-30 14:26:56 +08:00
> 这个 __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
2021-11-30 15:18:56 +08:00
@aloxaf 谢谢! 学习了, 原来 zsh 也有自己的 语法 https://github.com/goreliu/zshguide

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/818930

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX