epilande/go-devicons

๐ŸŽจ Go library for mapping Nerd Font icons

โ˜… 9Forks 2GoGitHub โ†—Compare
cligogolangiconsnerd-fontstui

README

go-devicons

A Go library for mapping files/folders to Nerd Font icons and colors.

Gopher with icons

โ“ Why?

When building command-line tools or file explorers in Go, displaying appropriate icons can enhance the user experience, providing quick visual cues about file types. go-devicons simplifies this by providing a straightforward way to map Nerd Font icon and corresponding color for files and directories, leveraging the comprehensive icon mappings from nvim-web-devicons project.

This library is useful for enhancing terminal applications, file explorers, or any Go program that needs to display visually distinct file representations. See codegrab for an example usage.

๐Ÿ“ฆ Installation

To use go-devicons in your Go project, install it using go get:

go get github.com/epilande/go-devicons

๐ŸŽฎ Usage

The library provides two main functions to get the icon style:

  1. IconForPath(path string) icons.Style: Takes a file system path, determines the file type (regular, directory, symlink) using os.Lstat, and returns the best matching style.
  2. IconForInfo(info os.FileInfo) icons.Style: Takes an existing os.FileInfo object (useful if you've already read directory contents), and returns the best matching style based on the info.

Both functions return an icons.Style struct:

// Style holds the suggested icon and hex color for a file/directory.
type Style struct {
	Icon  string
	Color string
}

Basic Example

Here's a simple example demonstrating how to get and print the icon for files in the current directory:

package main

import (
	"fmt"
	"log"
	"os"

	"github.com/epilande/go-devicons"
)

func main() {
	targetDir := "."
	entries, err := os.ReadDir(targetDir)
	if err != nil {
		log.Fatalf("Error reading directory '%s': %v\n", targetDir, err)
	}

	fmt.Printf("Listing contents of '%s':\n", targetDir)

	for _, entry := range entries {
		info, err := entry.Info()
		if err != nil {
			fmt.Printf("? %s (Error getting info: %v)\n", entry.Name(), err)
			continue
		}

		// Get the icon style using FileInfo
		fileStyle := devicons.IconForInfo(info)

		// Get the icon style using Path (alternative)
		// path := filepath.Join(targetDir, entry.Name())
		// fileStyle := devicons.IconForPath(path)

		// Print the icon and name (basic, no color)
		fmt.Printf("%s %s %s\n", fileStyle.Icon, entry.Name(), fileStyle.Color)
	}
}

Tip

The Color field in the Style struct is a hex string (e.g., #RRGGBB). You can use libraries like lipgloss or your own terminal coloring methods to apply it.

Demo

example demo

๐Ÿ”Œ API Reference

Function / Type Description
IconForPath(path string) Style Returns the Style for a given file system path. It calls os.Lstat internally to determine if the path is a file, directory, or symlink.
IconForInfo(info os.FileInfo) Style Returns the Style based on an existing os.FileInfo. More efficient if you already have FileInfo (e.g., from os.ReadDir).
Style struct Contains Icon (string representing the Nerd Font character) and Color (string, hex format #RRGGBB).

๐ŸŒŸ Acknowledgements

The icon mappings used in this library are automatically generated from the Lua source files of nvim-web-devicons. Full credit goes to the maintainers and contributors of that project for curating the extensive icon set.

Contributors

epilande

Issues