Rust图标库devicons的使用:为开发者提供丰富的编程语言和工具图标集

Rust图标库devicons的使用:为开发者提供丰富的编程语言和工具图标集

特性

  • 🦞 图标检索: 根据文件名/扩展名获取文件或目录图标
  • 🦞 图标颜色: 根据指定的主题检索与图标相关联的颜色
  • 🦞 文件类型支持: 支持广泛的文件类型和文件名约定(dockerfile, makefile等)
  • 🦞 可定制主题: 支持浅色和深色主题

安装

cargo add devicons

注意: 你需要使用NerdFont来正确显示图标。

使用示例

以下是使用devicons检索深色主题文件图标的简单示例:

use std::path::Path;
use devicons::{File, Theme, icon_for_file, FileIcon};

fn main() {
    // 从路径获取图标并指定主题
    let path = Path::new("Cargo.toml");
    let icon = icon_for_file(path, Some(Theme::Dark));

    // 从字符串获取图标并指定主题
    let icon = icon_for_file("Cargo.toml", Some(Theme::Dark));

    // 从路径获取图标并使用默认主题
    let icon = FileIcon::from(path);

    // 直接从文件名获取图标
    let icon = FileIcon::from("Cargo.toml");

    println!("File: {}", path.to_string_lossy());
    println!("Icon: {}", icon.icon);
    println!("Color: {}", icon.color);
}

完整示例

以下是一个更完整的示例,展示如何使用devicons库来显示不同文件的图标和颜色:

use std::path::Path;
use devicons::{icon_for_file, Theme};

fn main() {
    // 定义要检查的文件列表
    let files = vec![
        "Cargo.toml",    // Rust包配置文件
        "main.rs",       // Rust源文件
        "README.md",     // Markdown文档
        "Dockerfile",    // Docker配置文件
        "Makefile",      // Make构建文件
        "index.html",    // HTML文件
        "styles.css",    // CSS样式表
        "app.js",        // JavaScript文件
        "database.sql",  // SQL脚本
        "image.png",     // 图片文件
    ];
    
    // 打印表头
    println!("{:<15} {:<5} {:<7} {:<7}", "Filename", "Icon", "Light", "Dark");
    println!("{:-<15} {:-<5} {:-<7} {:-<7}", "", "", "", "");
    
    // 遍历文件并显示图标信息
    for file in files {
        let path = Path::new(file);
        
        // 获取浅色主题图标
        let light_icon = icon_for_file(path, Some(Theme::Light));
        
        // 获取深色主题图标
        let dark_icon = icon_for_file(path, Some(Theme::Dark));
        
        println!(
            "{:<15} {:<5} {:<7} {:<7}", 
            file, 
            light_icon.icon, 
            light_icon.color, 
            dark_icon.color
        );
    }
}

扩展示例

下面是一个更复杂的示例,展示如何将devicons集成到文件浏览器中:

use std::path::{Path, PathBuf};
use std::fs;
use devicons::{icon_for_file, Theme};

fn display_directory(path: &Path, depth: usize) {
    let indent = "  ".repeat(depth);
    
    if let Ok(entries) = fs::read_dir(path) {
        for entry in entries {
            if let Ok(entry) = entry {
                let path = entry.path();
                let icon = icon_for_file(&path, Some(Theme::Dark));
                
                if path.is_dir() {
                    println!("{}{} {}", indent, icon.icon, path.display());
                    display_directory(&path, depth + 1);
                } else {
                    println!("{}{} {} ({})", 
                        indent, 
                        icon.icon, 
                        path.display(), 
                        icon.color
                    );
                }
            }
        }
    }
}

fn main() {
    let path = PathBuf::from(".");  // 当前目录
    println!("文件浏览器示例:");
    display_directory(&path, 0);
}

许可证

该项目采用Apache 2.0 License许可。


1 回复

Rust图标库devicons的使用指南

devicons是一个为开发者提供的图标库,包含了丰富的编程语言、工具和技术栈的图标集合。这个库特别适合用于开发工具、文档、技术博客或任何需要显示技术相关图标的场景。

安装方法

在Cargo.toml中添加依赖:

[dependencies]
devicons = "0.2"

基本使用方法

1. 获取单个图标

use devicons::DevIcon;

fn main() {
    // 获取Rust语言的图标
    let rust_icon = DevIcon::Rust;
    
    println!("Rust图标: {}", rust_icon.symbol());
    println!("Rust图标颜色: {}", rust_icon.color());
}

2. 遍历所有可用图标

use devicons::DevIcon;

fn main() {
    for icon in DevIcon::all() {
        println!("{}: {} ({})", icon.name(), icon.symbol(), icon.color());
    }
}

实际应用示例

在CLI工具中显示图标

use devicons::{DevIcon, colored::Colorize};

fn main() {
    let files = vec![
        ("main.rs", DevIcon::Rust),
        ("index.html", DevIcon::Html),
        ("style.css", DevIcon::Css),
        ("app.js", DevIcon::Javascript),
    ];

    for (name, icon) in files {
        println!("{} {}", icon.symbol().color(icon.color()), name);
    }
}

生成技术栈徽章

use devicons::DevIcon;

fn tech_stack_badge(icons: &[DevIcon]) -> String {
    icons.iter()
        .map(|icon| format!("<span style=\"color:{};\">{}</span>", icon.color(), icon.symbol()))
        .collect::<Vec<_>>()
        .join(" ")
}

fn main() {
    let stack = vec![
        DevIcon::Rust,
        DevIcon::React,
        DevIcon::Postgresql,
        DevIcon::Docker,
    ];
    
    println!("我的技术栈: {}", tech_stack_badge(&stack));
}

支持的图标类型

devicons库包含大量图标,主要包括:

  • 编程语言:Rust、Python、Java、JavaScript等
  • 框架:React、Vue、Angular等
  • 工具:Git、Docker、VSCode等
  • 数据库:PostgreSQL、MongoDB、Redis等
  • 操作系统:Linux、Apple、Windows等

高级用法

自定义颜色

use devicons::DevIcon;

fn main() {
    let mut rust_icon = DevIcon::Rust;
    
    // 覆盖默认颜色
    rust_icon.set_color("#FF0000");
    
    println!("{}", rust_icon.symbol());
}

与tui-rs结合使用

use devicons::DevIcon;
use tui::{
    widgets::{Block, Borders, Paragraph},
    style::{Style, Color},
    text::Span,
};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 初始化tui...
    
    let rust_icon = DevIcon::Rust;
    let span = Span::styled(
        rust_icon.symbol(),
        Style::default().fg(Color::Rgb(
            rust_icon.color_rgb().0,
            rust_icon.color_rgb().1,
            rust_icon.color_rgb().2,
        )),
    );
    
    // 在tui界面中使用...
    
    Ok(())
}

完整示例demo

下面是一个完整的CLI应用程序示例,展示了如何使用devicons库来显示项目文件结构:

use devicons::{DevIcon, colored::Colorize};
use std::path::Path;

// 根据文件扩展名获取对应的图标
fn get_file_icon(filename: &str) -> Option<DevIcon> {
    let path = Path::new(filename);
    match path.extension()?.to_str()? {
        "rs" => Some(DevIcon::Rust),
        "js" => Some(DevIcon::Javascript),
        "py" => Some(DevIcon::Python),
        "java" => Some(DevIcon::Java),
        "html" => Some(DevIcon::Html),
        "css" => Some(DevIcon::Css),
        "json" => Some(DevIcon::Json),
        "md" => Some(DevIcon::Markdown),
        "toml" => Some(DevIcon::Config),
        "sh" => Some(DevIcon::Shell),
        _ => None,
    }
}

fn main() {
    // 模拟项目文件结构
    let project_files = vec![
        "src/main.rs",
        "src/lib.rs",
        "index.html",
        "styles/main.css",
        "scripts/app.js",
        "README.md",
        "Cargo.toml",
        "build.sh",
        "config.json"
    ];

    println!("项目文件结构:");
    for file in project_files {
        if let Some(icon) = get_file_icon(file) {
            // 使用彩色图标显示文件
            println!("  {} {}", icon.symbol().color(icon.color()), file);
        } else {
            // 没有对应图标的文件
            println!("  📄 {}", file);
        }
    }

    // 显示技术栈
    println!("\n项目技术栈:");
    let stack = vec![
        DevIcon::Rust,
        DevIcon::Javascript,
        DevIcon::Html,
        DevIcon::Css,
        DevIcon::Git,
    ];
    
    for tech in stack {
        print!("{} ", tech.symbol().color(tech.color()));
    }
    println!();
}

这个完整示例展示了:

  1. 根据文件扩展名自动匹配对应图标
  2. 在终端中彩色显示文件图标
  3. 显示项目技术栈
  4. 处理没有对应图标的情况

devicons库为Rust开发者提供了一种简单的方式来获取和使用各种开发相关的图标,可以大大提升应用程序或文档的视觉效果和专业性。

回到顶部