使用 fzf
实现文件快速查找、打开及执行
本文将介绍如何安装 fzf
,配置文件,以便使用 cdf
和 cdd
函数来快速查找、打开、编辑、编译并运行文件或快速进入指定目录。cdf
是一个文件查找和执行工具,cdd
是一个目录查找工具。默认情况下,cdf
使用 Visual Studio Code (code
) 打开文件,同时支持 vim
、gcc
、g++
、python
等多种执行选项。
步骤 1:安装 fzf
fzf
是一个命令行模糊查找工具,我们需要安装它以支持模糊搜索。可以通过以下命令来安装:
-
使用 Homebrew (macOS/Linux)
brew install fzf
-
Ubuntu/Debian
sudo apt update sudo apt install fzf
-
安装脚本(适用于大多数系统)
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf ~/.fzf/install
按提示完成安装。
-
更多安装选项:参考
fzf
的官方文档 fzf GitHub。
步骤 2:将 cdf
和 cdd
函数添加到 Shell 配置文件
为了在终端中直接调用 cdf
和 cdd
函数,我们需要将这两个函数添加到 Shell 配置文件(如 .bashrc
或 .zshrc
)中。
将函数添加到配置文件
-
打开 Shell 配置文件:运行以下命令打开配置文件:
# 对于 Bash 用户 vim ~/.bashrc# 对于 Zsh 用户 vim ~/.zshrc
-
复制并粘贴以下代码到配置文件中:
# 用于模糊查找并打开或执行指定文件,默认使用 VS Code 打开 function cdf() {local search_name="${1:-}" # 第一个参数为搜索名称(文件名或路径)local editor="${2:-code}" # 第二个参数为编辑器或执行器,默认为 code (VS Code)# 捕获 Ctrl+C 的信号trap 'return' INT# 查找当前目录及其下 2 层子目录的所有文件,返回文件名,并交由 fzf 进行正则表达式过滤local file=$(find . -maxdepth 2 -type f -exec basename {} \; 2>/dev/null | fzf --query="$search_name" --extended --select-1 --exit-0)# 检查 fzf 的退出状态码,非零时直接退出函数if [[ $? -ne 0 ]]; thentrap - INT # 取消 trap,恢复默认行为returnfi# 如果 file 为空(用户未选择),也退出if [[ -z "$file" ]]; thentrap - INTreturnfi# 重新查找文件的完整路径local full_path=$(find . -maxdepth 2 -type f -name "$file" 2>/dev/null | head -n 1)trap - INT # 取消 trap,恢复默认行为# 根据第二个参数决定是打开编辑器、编译或执行代码if [[ "$editor" == "code" ]]; then# 默认使用 VS Code 打开文件code "$full_path"else# 使用指定的编辑器或编译器case "$editor" invim)vim "$full_path" # 使用 vim 打开文件;;gcc)local output_file="${file%.*}.out" # 将输出文件命名为 '文件名.out'gcc "$full_path" -o "$output_file" && echo "Compiled to $output_file"if [[ -x "$output_file" ]]; thenecho "Executing $output_file..."./"$output_file"fi;;g++)local output_file="${file%.*}.out" # 将输出文件命名为 '文件名.out'g++ "$full_path" -o "$output_file" && echo "Compiled to $output_file"if [[ -x "$output_file" ]]; thenecho "Executing $output_file..."./"$output_file"fi;;python)python "$full_path" # 运行 Python 文件;;*)echo "不支持的编辑器或执行器:$editor";;esacfi }# 用于模糊查找并进入包含指定名称的文件夹 function cdd() {local search_name="${1:-}" # 使用输入的关键字(如果没有提供,则为空)# 查找所有目录,递归遍历,并交由 fzf 进行正则表达式过滤local dir=$(find ~ -type d 2>/dev/null | fzf --query="$search_name" --extended --select-1 --exit-0)# 检查 fzf 的退出状态码,非零时直接退出函数if [[ $? -ne 0 ]]; thenreturnfi# 如果 dir 为空(用户未选择),也退出if [[ -z "$dir" ]]; thenreturnficd "$dir" }
-
保存并关闭配置文件:按
Esc
键,然后输入:wq
保存并退出编辑器。 -
刷新配置文件:在终端中运行以下命令,使新配置立即生效。
# 如果使用 Bash source ~/.bashrc# 如果使用 Zsh source ~/.zshrc
步骤 3:使用 cdf
和 cdd
函数
cdf
函数
cdf
函数用于查找、打开和执行文件。默认情况下,它会使用 VS Code 打开文件。如果指定了不同的执行器(如 vim
、gcc
、g++
、python
),它会根据指定执行器执行相应操作。
用法:
cdf <文件名搜索关键字> [执行器]
<文件名搜索关键字>
:文件名或文件名部分。[执行器]
:可选参数,用于指定打开文件的编辑器或执行器,支持code
、vim
、gcc
、g++
、python
等。
示例:
# 默认使用 VS Code 打开文件
cdf "example.c"# 使用 vim 打开文件
cdf "example.c" vim# 使用 gcc 编译并运行文件
cdf "example.c" gcc# 使用 g++ 编译并运行文件
cdf "example.cpp" g++# 运行 Python 文件
cdf "script.py" python
cdd
函数
cdd
函数用于在 ~
目录及其子目录中查找并进入包含指定名称的文件夹。
用法:
cdd <文件夹名称>
<文件夹名称>
:要查找的文件夹名称或部分名称。
示例:
# 查找并进入名称包含 "Documents" 的文件夹
cdd "Documents"# 查找并进入名称包含 "projects" 的文件夹
cdd "projects"
注意事项
- 查找深度:
cdf
函数默认只递归查找当前目录下 2 层子目录(通过-maxdepth 2
实现)。如果需要更深的层级,可以将-maxdepth 2
修改为适合的值。 - 编译并执行:对于
gcc
和g++
,cdf
函数会编译指定文件并将输出文件命名为<文件名>.out
。编译成功后会自动执行生成的可执行文件。 - 执行权限:确保生成的可执行文件具有执行权限。如果权限不足,可以使用
chmod +x output_file
来授予执行权限。 - 环境变量:确保
code
(VS Code 命令行)和其他编译器(如gcc
、g++
、python
)已正确添加到系统路径中。