对于任何感兴趣的人,这里是我的 .zshrc_fzf 配置的相关部分;tl;博士是我不使用小部件,而是直接使用文本绑定键调用函数,因为 ZLE 似乎没有将 tty 传递给在小部件中执行的函数。
此文件映射 ctrl+p 以使用 模糊查找文件fd
,切换到包含目录,然后在编辑器中打开它。如果您不在 tmux 会话中,则在打开 tmux 会话后它会执行相同的操作(除了在启动 tmux 会话之前更改到项目目录,因此它是该会话中所有未来 tmux-panes 的根)。
它与 ctrl+f 做同样的事情,但使用 ripgrep ( rg
) 来按文件内容搜索文件。
此文件中未定义:source_if_exists() { if [ -f $1 ]; then source $1; fi }
#!/usr/bin/zsh
# SOURCE: https://github.com/junegunn/fzf/wiki/examples
source_if_exists /usr/share/fzf/key-bindings.zsh
source_if_exists /usr/share/fzf/completion.zsh
FZF_PREVIEW="'head -100 {}'"
FZF_VIM_PLUGIN_PREVIEW=~/.local/share/nvim/plugged/fzf.vim/bin/preview.sh
if [[ -f $FZF_VIM_PLUGIN_PREVIEW ]]; then
FZF_PREVIEW=$FZF_VIM_PLUGIN_PREVIEW
fi
FZF_DEFAULT_OPTS="--layout=reverse --height='40%' --preview='"$FZF_PREVIEW" {}'"
export FZF_RIPGREP_OPTS="--column --line-number --no-heading --hidden --ignore-file $HOME/.gitignore_global"
export FZF_DEFAULT_COMMAND="fd . $SEARCH_DIRS --hidden --ignore-file ~/.gitignore_global"
FZF_CTRL_T_COMMAND=$FZF_DEFAULT_COMMAND
edit () {
P=$1
# file
if [[ -f $P ]]; then
if [[ $TERM != tmux* ]]; then # not in tmux session
# change to project directory, becomes root of new tmux-panes
cd $(dirname $P)
if [[ $(git rev-parse --is-inside-work-tree 2>/dev/null) == "true" ]]; then
cd $(git rev-parse --show-toplevel)
fi
tmux new-session "cd $(dirname $P) && ${EDITOR:-vim} $(basename $P); zsh"
clear
else # within existing tmux session
cd $(dirname $P) && ${EDITOR:-vim} $(basename $P)
fi
# directory
elif [[ -d $P ]]; then
cd $P
fi
}
# find path, change to directory, if path is a file, open in $EDITOR
fd_find () {
edit $(zsh -c $FZF_DEFAULT_COMMAND | fzf +m)
}
rg_find () {
CMD="rg $FZF_RIPGREP_OPTS ${1:-'.*'} $SEARCH_DIRS"
edit $(zsh -c $CMD | fzf +m | cut -d: -f1)
}
# zsh shortcuts
bindkey -s ^p 'fd_find\n'
bindkey -s ^f 'rg_find\n'