我正在尝试使用和程序编写一个 shell 函数来快速cd
进入我的主文件夹中的任何目录。fd
fzf
这就是我到目前为止所拥有的
function fdcd() {
cd "$(fd --type d --ignore-file ~/.config/fd/ignore --hidden | fzf)"
}
这有两个问题:
1)它只列出我当前工作目录中包含的目录,而不是我的主文件夹中的每个目录;
2)idk如果这是我的shell的错误,但是在我使用此命令后,我的shell提示符不会立即更新到新目录,而是我必须先发出一个命令(即使是空白命令)才能更新,这是恼人的。
任何帮助表示赞赏。
答案1
fdcd() {
local dir
dir=$(
cd &&
fd -0 --type d --ignore-file ~/.config/fd/ignore --hidden |
fzf --read0
) && cd ~/$dir
}
至于为什么提示没有自动更新,请注意,只有在进入行编辑器后,或者当 zle 小部件明确要求重绘(reset-prompt
/ clear-screen
widgets)或在无效后返回时,才会重新计算和重新绘制提示。 display( zle -I
) 或 shell 处理一些异步事件时。
因此,如果该fdcd
函数旨在作为自定义小部件或作为自定义zle
小部件的一部分进行调用,则如果您希望目录的更改反映在提示中,则需要要求重新计算提示:
fdcd() {
local dir
dir=$(
cd &&
fd ${NUMERIC:+-d$NUMERIC} -0 --type d \
--ignore-file ~/.config/fd/ignore --hidden |
fzf --read0
) && cd ~/$dir || return
if zle; then
# allow fdcd to run inside and outside zle
zle reset-prompt
fi
}
zle -N fdcd
bindkey '\es' fdcd
这里还使用参数$NUMERIC
来限制搜索的深度,因此您可以输入Alt+ 2 Alt+S例如将搜索限制为深度 2。