使用 fzf 实现文件快速查找、打开及执行

news/2024/11/1 19:31:40/

使用 fzf 实现文件快速查找、打开及执行

本文将介绍如何安装 fzf,配置文件,以便使用 cdfcdd 函数来快速查找、打开、编辑、编译并运行文件或快速进入指定目录。cdf 是一个文件查找和执行工具,cdd 是一个目录查找工具。默认情况下,cdf 使用 Visual Studio Code (code) 打开文件,同时支持 vimgccg++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:将 cdfcdd 函数添加到 Shell 配置文件

为了在终端中直接调用 cdfcdd 函数,我们需要将这两个函数添加到 Shell 配置文件(如 .bashrc.zshrc)中。

将函数添加到配置文件
  1. 打开 Shell 配置文件:运行以下命令打开配置文件:

    # 对于 Bash 用户
    vim ~/.bashrc# 对于 Zsh 用户
    vim ~/.zshrc
    
  2. 复制并粘贴以下代码到配置文件中

    # 用于模糊查找并打开或执行指定文件,默认使用 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"
    }
    
  3. 保存并关闭配置文件:按 Esc 键,然后输入 :wq 保存并退出编辑器。

  4. 刷新配置文件:在终端中运行以下命令,使新配置立即生效。

    # 如果使用 Bash
    source ~/.bashrc# 如果使用 Zsh
    source ~/.zshrc
    

步骤 3:使用 cdfcdd 函数

cdf 函数

cdf 函数用于查找、打开和执行文件。默认情况下,它会使用 VS Code 打开文件。如果指定了不同的执行器(如 vimgccg++python),它会根据指定执行器执行相应操作。

用法

cdf <文件名搜索关键字> [执行器]
  • <文件名搜索关键字>:文件名或文件名部分。
  • [执行器]:可选参数,用于指定打开文件的编辑器或执行器,支持 codevimgccg++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 修改为适合的值。
  • 编译并执行:对于 gccg++cdf 函数会编译指定文件并将输出文件命名为 <文件名>.out。编译成功后会自动执行生成的可执行文件。
  • 执行权限:确保生成的可执行文件具有执行权限。如果权限不足,可以使用 chmod +x output_file 来授予执行权限。
  • 环境变量:确保 code(VS Code 命令行)和其他编译器(如 gccg++python)已正确添加到系统路径中。

http://www.ppmy.cn/news/1543671.html

相关文章

JIME智创:抖音创作者的AI绘画与视频生成创作神器

在短视频和社交内容创作的时代&#xff0c;创意和速度成了成功的关键。无论是视频博主、图文创作者还是品牌推广人&#xff0c;他们都面临着如何快速生成高质量图片与视频素材的挑战。JIME智创正是针对这一需求推出的AI创作工具&#xff0c;专为抖音的图文和视频创作者设计&…

go语言中defer用法详解

defer 是 Go 语言中的一个关键字&#xff0c;用于延迟执行某个函数或语句&#xff0c;直到包含它的函数返回时才执行。defer 语句在函数执行结束后&#xff08;无论是正常返回还是由于 panic 返回&#xff09;都将执行。 defer 的基本用法 延迟执行&#xff1a; 当你在一个函数…

计算机网络(Ⅴ)网络核心

电路交换 为源主机分配了独享的线路。有资源浪费是缺点。 优点是保障了性能&#xff0c;但是资源共享的能力较差&#xff08;计算机的通讯不是持续的&#xff0c;具有突发性&#xff0c;不适用于电路交换&#xff09; 频分&#xff08;FDM&#xff09;&#xff1a;交换节点与交…

2024不可不会的StableDiffusion

需要Stable Diffusion整合包可以扫描下方,免费获取 01 引言 这是我在学习StableDiffusion (稳定扩散模型 简称SD)的第一篇入门文章&#xff0c;主要用于介绍稳定扩散模型和该领域的其他研究。在本文中&#xff0c;我想简要介绍一下如何使用Diffusers 扩散库&#xff0c;来创建…

Docker 命令指南:详细概述与示例应用

Docker 命令指南&#xff1a;详细概述与示例应用 Docker 是一个强大的容器化平台&#xff0c;为容器的创建、管理和运行提供了广泛的支持。通过 Docker 的命令行工具&#xff0c;用户可以从基本的镜像管理、容器操作到复杂的网络和数据存储管理执行各种任务。本节将详细介绍 D…

大厂物联网(IoT)高频面试题及参考答案

目录 解释物联网 (IoT) 的基本概念 物联网的主要组成部分有哪些? 描述物联网的基本架构。 IoT 与传统网络有什么区别? 物联网中常用的传感器类型有哪些? 描述物联网的三个主要层次。 简述物联网中数据安全的重要性 描述物联网安全的主要威胁 解释端到端加密在 IoT 中…

两个有序链表序列的交集

两个有序链表序列的交集 一、问题描述 给定两个有序链表&#xff0c;要求找出这两个链表的交集元素&#xff0c;并以有序链表的形式返回。 二、思路 双指针法&#xff1a;使用两个指针分别指向两个链表的当前节点。比较元素&#xff1a; 如果两个指针指向的元素相等&#x…

「C/C++」C++设计模式 之 Pimpl模式

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…