diff --git a/src/info/filetype.rs b/src/info/filetype.rs index c9b1816a0..005c28bcb 100644 --- a/src/info/filetype.rs +++ b/src/info/filetype.rs @@ -39,27 +39,23 @@ const FILENAME_TYPES: Map<&'static str, FileType> = phf_map! { "build.gradle" => FileType::Immediate, "build.sbt" => FileType::Immediate, "build.xml" => FileType::Immediate, - "Cargo.lock" => FileType::Immediate, "Cargo.toml" => FileType::Immediate, "CMakeLists.txt" => FileType::Immediate, "composer.json" => FileType::Immediate, - "configure.ac" => FileType::Immediate, - "Configure.ac" => FileType::Immediate, + "configure" => FileType::Immediate, "Containerfile" => FileType::Immediate, "Dockerfile" => FileType::Immediate, "Earthfile" => FileType::Immediate, - "flake.lock" => FileType::Immediate, "flake.nix" => FileType::Immediate, "Gemfile" => FileType::Immediate, "GNUmakefile" => FileType::Immediate, "Gruntfile.coffee" => FileType::Immediate, "Gruntfile.js" => FileType::Immediate, + "jsconfig.json" => FileType::Immediate, "Justfile" => FileType::Immediate, "justfile" => FileType::Immediate, "Makefile" => FileType::Immediate, "makefile" => FileType::Immediate, - "Makefile.in" => FileType::Immediate, - "makefile.in" => FileType::Immediate, "meson.build" => FileType::Immediate, "mix.exs" => FileType::Immediate, "package.json" => FileType::Immediate, @@ -68,6 +64,7 @@ const FILENAME_TYPES: Map<&'static str, FileType> = phf_map! { "Podfile" => FileType::Immediate, "pom.xml" => FileType::Immediate, "Procfile" => FileType::Immediate, + "pyproject.toml" => FileType::Immediate, "Rakefile" => FileType::Immediate, "RoboFile.php" => FileType::Immediate, "SConstruct" => FileType::Immediate, @@ -76,6 +73,13 @@ const FILENAME_TYPES: Map<&'static str, FileType> = phf_map! { "webpack.config.cjs" => FileType::Immediate, "webpack.config.js" => FileType::Immediate, "WORKSPACE" => FileType::Immediate, + /* Cryptology files */ + "id_dsa" => FileType::Crypto, + "id_ecdsa" => FileType::Crypto, + "id_ecdsa_sk" => FileType::Crypto, + "id_ed25519" => FileType::Crypto, + "id_ed25519_sk" => FileType::Crypto, + "id_rsa" => FileType::Crypto, }; /// Mapping from lowercase file extension to file type. If an image, video, music, or lossless @@ -93,6 +97,7 @@ const EXTENSION_TYPES: Map<&'static str, FileType> = phf_map! { "dvi" => FileType::Image, "eps" => FileType::Image, "gif" => FileType::Image, + "heic" => FileType::Image, "heif" => FileType::Image, "ico" => FileType::Image, "j2c" => FileType::Image, @@ -115,6 +120,7 @@ const EXTENSION_TYPES: Map<&'static str, FileType> = phf_map! { "pnm" => FileType::Image, "ppm" => FileType::Image, "ps" => FileType::Image, + "psd" => FileType::Image, "pxm" => FileType::Image, "raw" => FileType::Image, "stl" => FileType::Image, @@ -122,11 +128,12 @@ const EXTENSION_TYPES: Map<&'static str, FileType> = phf_map! { "tif" => FileType::Image, "tiff" => FileType::Image, "webp" => FileType::Image, + "xcf" => FileType::Image, "xpm" => FileType::Image, /* Video files */ "avi" => FileType::Video, "flv" => FileType::Video, - "heic" => FileType::Video, + "heics" => FileType::Video, "m2ts" => FileType::Video, "m2v" => FileType::Video, "m4v" => FileType::Video, @@ -137,6 +144,7 @@ const EXTENSION_TYPES: Map<&'static str, FileType> = phf_map! { "mpg" => FileType::Video, "ogm" => FileType::Video, "ogv" => FileType::Video, + "video" => FileType::Video, "vob" => FileType::Video, "webm" => FileType::Video, "wmv" => FileType::Video, @@ -155,24 +163,34 @@ const EXTENSION_TYPES: Map<&'static str, FileType> = phf_map! { "flac" => FileType::Lossless, "wav" => FileType::Lossless, /* Cryptology files */ - "asc" => FileType::Crypto, - "enc" => FileType::Crypto, - "gpg" => FileType::Crypto, - "p12" => FileType::Crypto, - "pfx" => FileType::Crypto, - "pgp" => FileType::Crypto, - "sig" => FileType::Crypto, - "signature" => FileType::Crypto, + "asc" => FileType::Crypto, // GnuPG ASCII armored file + "gpg" => FileType::Crypto, // GnuPG encrypted file + "kbx" => FileType::Crypto, // GnuPG keybox + "md5" => FileType::Crypto, // MD5 checksum + "p12" => FileType::Crypto, // PKCS#12 certificate (Netscape) + "pem" => FileType::Crypto, // Privacy enhanced mail certificate + "pfx" => FileType::Crypto, // PKCS#12 certificate (Microsoft) + "pgp" => FileType::Crypto, // PGP security key + "pub" => FileType::Crypto, // Public key + "sha1" => FileType::Crypto, // SHA-1 hash + "sha224" => FileType::Crypto, // SHA-224 hash + "sha256" => FileType::Crypto, // SHA-256 hash + "sha384" => FileType::Crypto, // SHA-384 hash + "sha512" => FileType::Crypto, // SHA-512 hash + "sig" => FileType::Crypto, // GnuPG signed file + "signature" => FileType::Crypto, // e-Filing Digital Signature File (India) /* Document files */ "djvu" => FileType::Document, "doc" => FileType::Document, "docx" => FileType::Document, "eml" => FileType::Document, "fotd" => FileType::Document, + "gdoc" => FileType::Document, "key" => FileType::Document, "keynote" => FileType::Document, "numbers" => FileType::Document, "odp" => FileType::Document, + "ods" => FileType::Document, "odt" => FileType::Document, "pages" => FileType::Document, "pdf" => FileType::Document, @@ -180,13 +198,15 @@ const EXTENSION_TYPES: Map<&'static str, FileType> = phf_map! { "pptx" => FileType::Document, "rtf" => FileType::Document, "xls" => FileType::Document, + "xlsm" => FileType::Document, "xlsx" => FileType::Document, /* Compressed/archive files */ "7z" => FileType::Compressed, - "a" => FileType::Compressed, "ar" => FileType::Compressed, + "br" => FileType::Compressed, "bz" => FileType::Compressed, "bz2" => FileType::Compressed, + "bz3" => FileType::Compressed, "cpio" => FileType::Compressed, "deb" => FileType::Compressed, "dmg" => FileType::Compressed, @@ -197,7 +217,9 @@ const EXTENSION_TYPES: Map<&'static str, FileType> = phf_map! { "lzh" => FileType::Compressed, "lzma" => FileType::Compressed, "lzo" => FileType::Compressed, - "par" => FileType::Compressed, + "phar" => FileType::Compressed, + "qcow" => FileType::Compressed, + "qcow2" => FileType::Compressed, "rar" => FileType::Compressed, "rpm" => FileType::Compressed, "tar" => FileType::Compressed, @@ -209,8 +231,10 @@ const EXTENSION_TYPES: Map<&'static str, FileType> = phf_map! { "tlz" => FileType::Compressed, "txz" => FileType::Compressed, "tz" => FileType::Compressed, - "tzo" => FileType::Compressed, "xz" => FileType::Compressed, + "vdi" => FileType::Compressed, + "vhd" => FileType::Compressed, + "vmdk" => FileType::Compressed, "z" => FileType::Compressed, "zip" => FileType::Compressed, "zst" => FileType::Compressed, @@ -218,18 +242,27 @@ const EXTENSION_TYPES: Map<&'static str, FileType> = phf_map! { "bak" => FileType::Temp, "bk" => FileType::Temp, "bkp" => FileType::Temp, + "download" => FileType::Temp, "swn" => FileType::Temp, "swo" => FileType::Temp, "swp" => FileType::Temp, "tmp" => FileType::Temp, /* Compiler output files */ - "class" => FileType::Compiled, - "elc" => FileType::Compiled, - "hi" => FileType::Compiled, - "ko" => FileType::Compiled, - "o" => FileType::Compiled, - "pyc" => FileType::Compiled, - "zwc" => FileType::Compiled, + "a" => FileType::Compiled, // Unix static library + "bundle" => FileType::Compiled, // Mac OS X application bundle + "class" => FileType::Compiled, // Java class file + "dll" => FileType::Compiled, // Windows dynamic link library + "dylib" => FileType::Compiled, // Mach-O dynamic library + "elc" => FileType::Compiled, // Emacs compiled lisp + "ko" => FileType::Compiled, // Linux kernel module + "lib" => FileType::Compiled, // Windows static library + "o" => FileType::Compiled, // Compiled object file + "obj" => FileType::Compiled, // Compiled object file + "pyc" => FileType::Compiled, // Python compiled code + "pyd" => FileType::Compiled, // Python dynamic module + "pyo" => FileType::Compiled, // Python optimized code + "so" => FileType::Compiled, // Unix shared library + "zwc" => FileType::Compiled, // zsh compiled file }; impl FileType { diff --git a/src/info/sources.rs b/src/info/sources.rs index 5550a9e48..33ab386b7 100644 --- a/src/info/sources.rs +++ b/src/info/sources.rs @@ -12,7 +12,7 @@ impl<'a> File<'a> { /// their source file `foo.coffee` exists in the same directory. /// For example, `foo.js` is perfectly valid without `foo.coffee`, so we /// don’t want to always blindly highlight `*.js` as compiled. - /// (See also `FileExtensions#is_compiled`) + /// (See also `FileType`) pub fn get_source_files(&self) -> Vec { if let Some(ext) = &self.ext { match &ext[..] { @@ -21,7 +21,6 @@ impl<'a> File<'a> { "mjs" => vec![self.path.with_extension("mts")], // JavaScript ES Modules source "cjs" => vec![self.path.with_extension("cts")], // JavaScript Commonjs Modules source "js" => vec![self.path.with_extension("coffee"), self.path.with_extension("ts")], // CoffeeScript, TypeScript - "aux" | // TeX: auxiliary file "bbl" | // BibTeX bibliography file "bcf" | // biblatex control file @@ -32,8 +31,8 @@ impl<'a> File<'a> { "lof" | // TeX list of figures "log" | // TeX log file "lot" | // TeX list of tables - "out" => vec![self.path.with_extension("tex")], // hyperref list of bookmarks - "toc" => vec![self.path.with_extension("tex")], // TeX table of contents + "out" | // hyperref list of bookmarks + "toc" | // TeX table of contents "xdv" => vec![self.path.with_extension("tex")], // XeTeX dvi _ => vec![], // No source files if none of the above diff --git a/src/output/icons.rs b/src/output/icons.rs index f7bc6d961..64a0948e8 100644 --- a/src/output/icons.rs +++ b/src/output/icons.rs @@ -11,9 +11,9 @@ impl Icons { const BINARY: char = '\u{eae8}'; //  const BOOK: char = '\u{e28b}'; //  const CALENDAR: char = '\u{eab0}'; //  + const CLOCK: char = '\u{f43a}'; //  const COMPRESSED: char = '\u{f410}'; //  const CONFIG: char = '\u{e615}'; //  - const CONFIG_FOLDER: char = '\u{e5fc}'; //  const CSS3: char = '\u{e749}'; //  const DATABASE: char = '\u{f1c0}'; //  const DIFF: char = '\u{f440}'; //  @@ -21,115 +21,275 @@ impl Icons { const DOCKER: char = '\u{e650}'; //  const DOCUMENT: char = '\u{f1c2}'; //  const EMACS: char = '\u{e632}'; //  + const FILE: char = '\u{f15b}'; //  + const FILE_OUTLINE: char = '\u{f016}'; //  + const FOLDER: char = '\u{e5ff}'; //  + const FOLDER_CONFIG: char = '\u{e5fc}'; //  + const FOLDER_GIT: char = '\u{e5fb}'; //  + const FOLDER_GITHUB: char = '\u{e5fd}'; //  + const FOLDER_HIDDEN: char = '\u{f179e}'; // 󱞞 + const FOLDER_KEY: char = '\u{f08ac}'; // 󰢬 + const FOLDER_NPM: char = '\u{e5fa}'; //  + const FOLDER_OPEN: char = '\u{f115}'; //  const FONT: char = '\u{f031}'; //  const GIST_SECRET: char = '\u{eafa}'; //  const GIT: char = '\u{f1d3}'; //  const GRADLE: char = '\u{e660}'; //  const GRUNT: char = '\u{e611}'; //  const GULP: char = '\u{e610}'; //  - const HEADER: char = '\u{f0fd}'; //  const HTML5: char = '\u{f13b}'; //  const IMAGE: char = '\u{f1c5}'; //  const INTELLIJ: char = '\u{e7b5}'; //  + const JSON: char = '\u{e60b}'; //  const KEY: char = '\u{eb11}'; //  const KEYPASS: char = '\u{f23e}'; //  - const JSON: char = '\u{e60b}'; //  const LANG_ASSEMBLY: char = '\u{e637}'; //  const LANG_C: char = '\u{e61e}'; //  const LANG_CPP: char = '\u{e61d}'; //  const LANG_CSHARP: char = '\u{f031b}'; // 󰌛 const LANG_ELIXIR: char = '\u{e62d}'; //  const LANG_FSHARP: char = '\u{e7a7}'; //  - const LANG_GO: char = '\u{e724}'; //  + const LANG_GO: char = '\u{e65e}'; //  const LANG_HASKELL: char = '\u{e777}'; //  const LANG_JAVA: char = '\u{e256}'; //  const LANG_JAVASCRIPT: char = '\u{e74e}'; //  + const LANG_KOTLIN: char = '\u{e634}'; //  const LANG_OCAML: char = '\u{e67a}'; //  - const LANG_PERL: char = '\u{e769}'; //  + const LANG_PERL: char = '\u{e67e}'; //  const LANG_PHP: char = '\u{e73d}'; //  const LANG_PYTHON: char = '\u{e606}'; //  const LANG_R: char = '\u{f25d}'; //  const LANG_RUBY: char = '\u{e21e}'; //  const LANG_RUBYRAILS: char = '\u{e73b}'; //  const LANG_RUST: char = '\u{e7a8}'; //  + const LANG_SASS: char = '\u{e603}'; //  const LANG_STYLUS: char = '\u{e600}'; //  const LANG_TEX: char = '\u{e69b}'; //  const LANG_TYPESCRIPT: char = '\u{e628}'; //  - const LOCK: char = '\u{f023}'; //  const LICENSE: char = '\u{f02d}'; //  + const LOCK: char = '\u{f023}'; //  + const MAKE: char = '\u{e673}'; //  const MARKDOWN: char = '\u{f48a}'; //  const MUSTACHE: char = '\u{e60f}'; //  const NODEJS: char = '\u{e718}'; //  const NPM: char = '\u{e71e}'; //  - const OS_APPLE: char = '\u{f179}'; //  const OS_ANDROID: char = '\u{e70e}'; //  + const OS_APPLE: char = '\u{f179}'; //  const OS_LINUX: char = '\u{f17c}'; //  const OS_WINDOWS: char = '\u{f17a}'; //  const OS_WINDOWS_CMD: char = '\u{ebc4}'; //  + const PLAYLIST: char = '\u{f0cb9}'; // 󰲹 const POWERSHELL: char = '\u{ebc7}'; //  - const REACT: char = '\u{e7ba}'; //  + const PRIVATE_KEY: char = '\u{f0306}'; // 󰌆 + const PUBLIC_KEY: char = '\u{f0dd6}'; // 󰷖 const RAZOR: char = '\u{f1fa}'; //  + const REACT: char = '\u{e7ba}'; //  const SHEET: char = '\u{f1c3}'; //  - const SHELL: char = '\u{f489}'; //  + const SHELL_CMD: char = '\u{f489}'; //  + const SHELL: char = '\u{f1183}'; // 󱆃 + const SHIELD_CHECK: char = '\u{f0565}'; // 󰕥 + const SHIELD_KEY: char = '\u{f0bc4}'; // 󰯄 + const SHIELD_LOCK: char = '\u{f099d}'; // 󰦝 + const SIGNED_FILE: char = '\u{f19c3}'; // 󱧃 const SLIDE: char = '\u{f1c4}'; //  + const SUBLIME: char = '\u{e7aa}'; //  + const SUBTITLE: char = '\u{f0a16}'; // 󰨖 + const TERRAFORM: char = '\u{f1062}'; // 󱁢 const TEXT: char = '\u{f15c}'; //  const UNITY: char = '\u{e721}'; //  + const VECTOR: char = '\u{f0559}'; // 󰕙 const VIDEO: char = '\u{f03d}'; //  const VIM: char = '\u{e7c5}'; //  + const WRENCH: char = '\u{f0ad}'; //  const XML: char = '\u{f05c0}'; // 󰗀 - const YAML: char = '\u{f481}'; //  - Find better icon + const YAML: char = '\u{e6a8}'; //  + const YARN: char = '\u{e6a7}'; //  } -/// Mapping from full filenames to file type. This mapping should also contain all the "dot" -/// files/directories that have a custom icon. +/// Mapping from full filenames to directory icon. This mapping should contain +/// all the directories that have a custom icon. +const DIRECTORY_ICONS: Map<&'static str, char> = phf_map! { + ".config" => Icons::FOLDER_CONFIG, //  + ".git" => Icons::FOLDER_GIT, //  + ".github" => Icons::FOLDER_GITHUB, //  + ".npm" => Icons::FOLDER_NPM, //  + ".ssh" => Icons::FOLDER_KEY, // 󰢬 + ".Trash" => '\u{f1f8}', //  + "cron.d" => Icons::FOLDER_CONFIG, //  + "cron.daily" => Icons::FOLDER_CONFIG, //  + "cron.hourly" => Icons::FOLDER_CONFIG, //  + "cron.monthly" => Icons::FOLDER_CONFIG, //  + "cron.weekly" => Icons::FOLDER_CONFIG, //  + "Desktop" => '\u{f108}', //  + "Downloads" => '\u{f024d}', // 󰉍 + "config" => Icons::FOLDER_CONFIG, //  + "etc" => Icons::FOLDER_CONFIG, //  + "hidden" => Icons::FOLDER_HIDDEN, // 󱞞 + "include" => Icons::FOLDER_CONFIG, //  + "Mail" => '\u{f01f0}', // 󰇰 + "Movies" => '\u{f0fce}', // 󰿎 + "Music" => '\u{f1359}', // 󱍙 + "node_modules" => Icons::FOLDER_NPM, //  + "npm_cache" => Icons::FOLDER_NPM, //  + "pam.d" => Icons::FOLDER_KEY, // 󰢬 + "Pictures" => '\u{f024f}', // 󰉏 + "ssh" => Icons::FOLDER_KEY, // 󰢬 + "sudoers.d" => Icons::FOLDER_KEY, // 󰢬 + "Videos" => '\u{f03d}', //  + "xbps.d" => Icons::FOLDER_CONFIG, //  + "xorg.conf.d" => Icons::FOLDER_CONFIG, //  +}; + +/// Mapping from full filenames to file icon. This mapping should also contain +/// all the "dot" files that have a custom icon. const FILENAME_ICONS: Map<&'static str, char> = phf_map! { ".atom" => '\u{e764}', //  - ".bashprofile" => Icons::CONFIG, //  - ".bashrc" => Icons::SHELL, //  + ".bashrc" => Icons::SHELL, // 󱆃 + ".bash_history" => Icons::SHELL, // 󱆃 + ".bash_logout" => Icons::SHELL, // 󱆃 + ".bash_profile" => Icons::SHELL, // 󱆃 + ".CFUserTextEncoding" => Icons::OS_APPLE, //  + ".clang-format" => Icons::CONFIG, //  + ".cshrc" => Icons::SHELL, // 󱆃 + ".DS_Store" => Icons::OS_APPLE, //  ".emacs" => Icons::EMACS, //  - ".git" => Icons::GIT, //  ".gitattributes" => Icons::GIT, //  ".gitconfig" => Icons::GIT, //  - ".github" => '\u{f408}', //  ".gitignore" => Icons::GIT, //  ".gitignore_global" => Icons::GIT, //  + ".gitlab-ci.yml" => '\u{f296}', //  ".gitmodules" => Icons::GIT, //  + ".htaccess" => Icons::CONFIG, //  + ".htpasswd" => Icons::CONFIG, //  ".idea" => Icons::INTELLIJ, //  + ".ideavimrc" => Icons::VIM, //  + ".inputrc" => Icons::CONFIG, //  + ".kshrc" => Icons::SHELL, // 󱆃 + ".login" => Icons::SHELL, // 󱆃 + ".logout" => Icons::SHELL, // 󱆃 + ".node_repl_history" => Icons::NODEJS, //  + ".npmignore" => Icons::NPM, //  + ".npmrc" => Icons::NPM, //  + ".profile" => Icons::SHELL, // 󱆃 + ".python_history" => Icons::LANG_PYTHON, //  + ".rustfmt.toml" => Icons::LANG_RUST, //  ".rvm" => Icons::LANG_RUBY, //  - ".Trash" => '\u{f1f8}', //  + ".rvmrc" => Icons::LANG_RUBY, //  + ".tcshrc" => Icons::SHELL, // 󱆃 + ".viminfo" => Icons::VIM, //  ".vimrc" => Icons::VIM, //  - ".vscode" => '\u{f0a1e}', // 󰨞 - ".zshrc" => Icons::SHELL, //  - "bin" => Icons::CONFIG_FOLDER, //  + ".Xauthority" => Icons::CONFIG, //  + ".xinitrc" => Icons::CONFIG, //  + ".Xresources" => Icons::CONFIG, //  + ".yarnrc" => Icons::YARN, //  + ".zlogin" => Icons::SHELL, // 󱆃 + ".zlogout" => Icons::SHELL, // 󱆃 + ".zprofile" => Icons::SHELL, // 󱆃 + ".zshenv" => Icons::SHELL, // 󱆃 + ".zshrc" => Icons::SHELL, // 󱆃 + ".zsh_history" => Icons::SHELL, // 󱆃 + ".zsh_sessions" => Icons::SHELL, // 󱆃 + "._DS_Store" => Icons::OS_APPLE, //  + "a.out" => Icons::SHELL_CMD, //  + "authorized_keys" => '\u{f08c0}', // 󰣀 + "bashrc" => Icons::SHELL, // 󱆃 + "bspwmrc" => Icons::CONFIG, //  + "build.gradle.kts" => Icons::GRADLE, //  "Cargo.lock" => Icons::LANG_RUST, //  - "config" => Icons::CONFIG_FOLDER, //  + "Cargo.toml" => Icons::LANG_RUST, //  + "CMakeLists.txt" => Icons::MAKE, //  + "composer.json" => Icons::LANG_PHP, //  + "composer.lock" => Icons::LANG_PHP, //  + "config" => Icons::CONFIG, //  + "config.status" => Icons::CONFIG, //  + "configure" => Icons::WRENCH, //  + "configure.ac" => Icons::CONFIG, //  + "configure.in" => Icons::CONFIG, //  + "constraints.txt" => Icons::LANG_PYTHON, //  + "crontab" => Icons::CONFIG, //  + "crypttab" => Icons::CONFIG, //  + "csh.cshrc" => Icons::SHELL, // 󱆃 + "csh.login" => Icons::SHELL, // 󱆃 + "csh.logout" => Icons::SHELL, // 󱆃 "docker-compose.yml" => Icons::DOCKER, //  "Dockerfile" => Icons::DOCKER, //  - "ds_store" => Icons::OS_APPLE, //  "Earthfile" => '\u{f0ac}', //  - "gitignore_global" => Icons::GIT, //  - "gitlab-ci.yml" => '\u{f296}', //  - "go.mod" => Icons::LANG_GO, //  - "go.sum" => Icons::LANG_GO, //  + "environment" => Icons::CONFIG, //  + "GNUmakefile" => Icons::MAKE, //  + "go.mod" => Icons::LANG_GO, //  + "go.sum" => Icons::LANG_GO, //  + "go.work" => Icons::LANG_GO, //  "gradle" => Icons::GRADLE, //  + "gradle.properties" => Icons::GRADLE, //  + "gradlew" => Icons::GRADLE, //  + "gradlew.bat" => Icons::GRADLE, //  + "group" => Icons::LOCK, //  "gruntfile.coffee" => Icons::GRUNT, //  "gruntfile.js" => Icons::GRUNT, //  "gruntfile.ls" => Icons::GRUNT, //  + "gshadow" => Icons::LOCK, //  "gulpfile.coffee" => Icons::GULP, //  "gulpfile.js" => Icons::GULP, //  "gulpfile.ls" => Icons::GULP, //  - "hidden" => Icons::LOCK, //  - "include" => Icons::CONFIG_FOLDER, //  - "lib" => '\u{f121}', //  + "heroku.yml" => '\u{e77b}', //  + "hostname" => Icons::CONFIG, //  + "id_dsa" => Icons::PRIVATE_KEY, // 󰌆 + "id_ecdsa" => Icons::PRIVATE_KEY, // 󰌆 + "id_ecdsa_sk" => Icons::PRIVATE_KEY, // 󰌆 + "id_ed25519" => Icons::PRIVATE_KEY, // 󰌆 + "id_ed25519_sk" => Icons::PRIVATE_KEY, // 󰌆 + "id_rsa" => Icons::PRIVATE_KEY, // 󰌆 + "inputrc" => Icons::CONFIG, //  + "Jenkinsfile" => '\u{e66e}', //  + "jsconfig.json" => Icons::LANG_JAVASCRIPT,//  + "Justfile" => Icons::WRENCH, //  + "known_hosts" => '\u{f08c0}', // 󰣀 + "LICENCE" => Icons::LICENSE, //  + "LICENCE.md" => Icons::LICENSE, //  + "LICENCE.txt" => Icons::LICENSE, //  "LICENSE" => Icons::LICENSE, //  + "LICENSE.md" => Icons::LICENSE, //  + "LICENSE.txt" => Icons::LICENSE, //  "localized" => Icons::OS_APPLE, //  - "Makefile" => Icons::SHELL, //  - "node_modules" => Icons::NODEJS, //  - "npmignore" => Icons::NPM, //  + "localtime" => Icons::CLOCK, //  + "Makefile" => Icons::MAKE, //  + "makefile" => Icons::MAKE, //  + "Makefile.ac" => Icons::MAKE, //  + "Makefile.am" => Icons::MAKE, //  + "Makefile.in" => Icons::MAKE, //  + "MANIFEST" => Icons::LANG_PYTHON, //  + "MANIFEST.in" => Icons::LANG_PYTHON, //  + "npm-shrinkwrap.json" => Icons::NPM, //  + "npmrc" => Icons::NPM, //  + "package-lock.json" => Icons::NPM, //  + "package.json" => Icons::NPM, //  + "passwd" => Icons::LOCK, //  "PKGBUILD" => '\u{f303}', //  + "php.ini" => Icons::LANG_PHP, //  + "pom.xml" => '\u{e674}', //  + "Procfile" => '\u{e77b}', //  + "profile" => Icons::SHELL, // 󱆃 + "pyproject.toml" => Icons::LANG_PYTHON, //  + "Rakefile" => Icons::LANG_RUBY, //  + "release.toml" => Icons::LANG_RUST, //  + "requirements.txt" => Icons::LANG_PYTHON, //  + "robots.txt" => '\u{f06a9}', // 󰚩 "rubydoc" => Icons::LANG_RUBYRAILS, //  + "rvmrc" => Icons::LANG_RUBY, //  + "settings.gradle.kts" => Icons::GRADLE, //  + "shadow" => Icons::LOCK, //  + "shells" => Icons::CONFIG, //  + "sudoers" => Icons::LOCK, //  + "timezone" => Icons::CLOCK, //  + "tsconfig.json" => Icons::LANG_TYPESCRIPT,//  "Vagrantfile" => '\u{2371}', // ⍱ - "yarn.lock" => '\u{e6a7}', //  + "webpack.config.js" => '\u{f072b}', // 󰜫 + "yarn.lock" => Icons::YARN, //  + "zlogin" => Icons::SHELL, // 󱆃 + "zlogout" => Icons::SHELL, // 󱆃 + "zprofile" => Icons::SHELL, // 󱆃 + "zshenv" => Icons::SHELL, // 󱆃 + "zshrc" => Icons::SHELL, // 󱆃 }; /// Mapping from lowercase file extension to icons. If an image, video, or audio extension is add @@ -147,23 +307,25 @@ const EXTENSION_ICONS: Map<&'static str, char> = phf_map! { "apple" => Icons::OS_APPLE, //  "ar" => Icons::COMPRESSED, //  "arw" => Icons::IMAGE, //  + "asc" => Icons::SHIELD_LOCK, // 󰦝 "asm" => Icons::LANG_ASSEMBLY, //  + "asp" => '\u{f121}', //  "avi" => Icons::VIDEO, //  "avif" => Icons::IMAGE, //  "avro" => Icons::JSON, //  - "awk" => Icons::SHELL, //  - "bash" => Icons::SHELL, //  - "bashrc" => Icons::SHELL, //  - "bash_history" => Icons::SHELL, //  - "bash_profile" => Icons::SHELL, //  + "awk" => Icons::SHELL_CMD, //  + "bash" => Icons::SHELL_CMD, //  "bat" => Icons::OS_WINDOWS_CMD, //  - "bats" => Icons::SHELL, //  + "bats" => Icons::SHELL_CMD, //  "bib" => Icons::LANG_TEX, //  "bin" => Icons::BINARY, //  "bmp" => Icons::IMAGE, //  + "br" => Icons::COMPRESSED, //  "bst" => Icons::LANG_TEX, //  + "bundle" => Icons::OS_APPLE, //  "bz" => Icons::COMPRESSED, //  "bz2" => Icons::COMPRESSED, //  + "bz3" => Icons::COMPRESSED, //  "c" => Icons::LANG_C, //  "c++" => Icons::LANG_CPP, //  "cab" => Icons::OS_WINDOWS, //  @@ -177,8 +339,10 @@ const EXTENSION_ICONS: Map<&'static str, char> = phf_map! { "clj" => '\u{e768}', //  "cljs" => '\u{e76a}', //  "cls" => Icons::LANG_TEX, //  + "cmake" => Icons::MAKE, //  "cmd" => Icons::OS_WINDOWS, //  "coffee" => '\u{f0f4}', //  + "com" => Icons::OS_WINDOWS_CMD, //  "conf" => Icons::CONFIG, //  "config" => Icons::CONFIG, //  "cp" => Icons::LANG_CPP, //  @@ -187,7 +351,7 @@ const EXTENSION_ICONS: Map<&'static str, char> = phf_map! { "cr2" => Icons::IMAGE, //  "crt" => Icons::GIST_SECRET, //  "cs" => Icons::LANG_CSHARP, // 󰌛 - "csh" => Icons::SHELL, //  + "csh" => Icons::SHELL_CMD, //  "cshtml" => Icons::RAZOR, //  "csproj" => Icons::LANG_CSHARP, // 󰌛 "css" => Icons::CSS3, //  @@ -195,6 +359,7 @@ const EXTENSION_ICONS: Map<&'static str, char> = phf_map! { "csx" => Icons::LANG_CSHARP, // 󰌛 "cts" => Icons::LANG_TYPESCRIPT, //  "cu" => '\u{e64b}', //  + "cue" => Icons::PLAYLIST, // 󰲹 "cxx" => Icons::LANG_CPP, //  "d" => '\u{e7af}', //  "dart" => '\u{e798}', //  @@ -208,27 +373,30 @@ const EXTENSION_ICONS: Map<&'static str, char> = phf_map! { "dmg" => Icons::DISK_IMAGE, //  "doc" => Icons::DOCUMENT, //  "docx" => Icons::DOCUMENT, //  + "dot" => '\u{f1049}', // 󱁉 + "download" => '\u{f01da}', // 󰇚 "drawio" => '\u{ebba}', //  - "ds_store" => Icons::OS_APPLE, //  "dump" => Icons::DATABASE, //  "dvi" => Icons::IMAGE, //  + "dylib" => Icons::OS_APPLE, //  "ebook" => Icons::BOOK, //  "ebuild" => '\u{f30d}', //  "editorconfig" => Icons::CONFIG, //  "ejs" => '\u{e618}', //  "el" => Icons::EMACS, //  + "elc" => Icons::EMACS, //  "elm" => '\u{e62c}', //  "eml" => '\u{f003}', //  "env" => '\u{f462}', //  "eot" => Icons::FONT, //  - "eps" => Icons::IMAGE, //  + "eps" => Icons::VECTOR, // 󰕙 "epub" => Icons::BOOK, //  "erb" => Icons::LANG_RUBYRAILS, //  "erl" => '\u{e7b1}', //  "ex" => Icons::LANG_ELIXIR, //  - "exe" => Icons::OS_WINDOWS, //  + "exe" => Icons::OS_WINDOWS_CMD, //  "exs" => Icons::LANG_ELIXIR, //  - "fish" => Icons::SHELL, //  + "fish" => Icons::SHELL_CMD, //  "flac" => Icons::AUDIO, //  "flv" => Icons::VIDEO, //  "font" => Icons::FONT, //  @@ -242,35 +410,34 @@ const EXTENSION_ICONS: Map<&'static str, char> = phf_map! { "gform" => '\u{f298}', //  "gif" => Icons::IMAGE, //  "git" => Icons::GIT, //  - "gitattributes" => Icons::GIT, //  - "gitignore" => Icons::GIT, //  - "gitmodules" => Icons::GIT, //  - "go" => Icons::LANG_GO, //  - "gpg" => '\u{e60a}', //  + "go" => Icons::LANG_GO, //  + "gpg" => Icons::SHIELD_LOCK, // 󰦝 "gradle" => Icons::GRADLE, //  "groovy" => '\u{e775}', //  "gsheet" => Icons::SHEET, //  "gslides" => Icons::SLIDE, //  "guardfile" => Icons::LANG_RUBY, //  + "gv" => '\u{f1049}', // 󱁉 "gz" => Icons::COMPRESSED, //  - "h" => Icons::HEADER, //  + "h" => Icons::LANG_C, //  "hbs" => Icons::MUSTACHE, //  - "heic" => Icons::VIDEO, //  + "heic" => Icons::IMAGE, //  + "heics" => Icons::VIDEO, //  "heif" => Icons::IMAGE, //  - "hpp" => Icons::HEADER, //  + "hpp" => Icons::LANG_CPP, //  "hs" => Icons::LANG_HASKELL, //  "htm" => Icons::HTML5, //  "html" => Icons::HTML5, //  - "hxx" => Icons::HEADER, //  + "hxx" => Icons::LANG_CPP, //  "ical" => Icons::CALENDAR, //  "icalendar" => Icons::CALENDAR, //  "ico" => Icons::IMAGE, //  "ics" => Icons::CALENDAR, //  "ifb" => Icons::CALENDAR, //  - "image" => Icons::IMAGE, //  + "image" => Icons::DISK_IMAGE, //  "img" => Icons::DISK_IMAGE, //  "iml" => Icons::INTELLIJ, //  - "ini" => Icons::OS_WINDOWS, //  + "ini" => Icons::CONFIG, //  "ipynb" => '\u{e678}', //  "iso" => Icons::DISK_IMAGE, //  "j2c" => Icons::IMAGE, //  @@ -293,15 +460,20 @@ const EXTENSION_ICONS: Map<&'static str, char> = phf_map! { "json" => Icons::JSON, //  "jsx" => Icons::REACT, //  "jxl" => Icons::IMAGE, //  + "kbx" => Icons::SHIELD_KEY, // 󰯄 "kdb" => Icons::KEYPASS, //  "kdbx" => Icons::KEYPASS, //  "key" => Icons::KEY, //  "ko" => Icons::OS_LINUX, //  - "ksh" => Icons::SHELL, //  + "ksh" => Icons::SHELL_CMD, //  + "kt" => Icons::LANG_KOTLIN, //  + "kts" => Icons::LANG_KOTLIN, //  "latex" => Icons::LANG_TEX, //  + "ldb" => Icons::DATABASE, //  "less" => '\u{e758}', //  "lhs" => Icons::LANG_HASKELL, //  "license" => Icons::LICENSE, //  + "lisp" => '\u{f0172}', // 󰅲 "localized" => Icons::OS_APPLE, //  "lock" => Icons::LOCK, //  "log" => '\u{f18d}', //  @@ -314,13 +486,17 @@ const EXTENSION_ICONS: Map<&'static str, char> = phf_map! { "m" => Icons::LANG_C, //  "m2ts" => Icons::VIDEO, //  "m2v" => Icons::VIDEO, //  + "m3u" => Icons::PLAYLIST, // 󰲹 + "m3u8" => Icons::PLAYLIST, // 󰲹 "m4a" => Icons::AUDIO, //  "m4v" => Icons::VIDEO, //  "magnet" => '\u{f076}', //  "markdown" => Icons::MARKDOWN, //  "md" => Icons::MARKDOWN, //  + "md5" => Icons::SHIELD_CHECK, // 󰕥 + "mdb" => Icons::DATABASE, //  "mjs" => Icons::LANG_JAVASCRIPT, //  - "mk" => Icons::SHELL, //  + "mk" => Icons::MAKE, //  "mka" => Icons::AUDIO, //  "mkd" => Icons::MARKDOWN, //  "mkv" => Icons::VIDEO, //  @@ -342,8 +518,7 @@ const EXTENSION_ICONS: Map<&'static str, char> = phf_map! { "nef" => Icons::IMAGE, //  "ninja" => '\u{f0774}', // 󰝴 "nix" => '\u{f313}', //  - "node" => '\u{f0399}', // 󰎙 - "npmignore" => Icons::NPM, //  + "node" => Icons::NODEJS, //  "o" => Icons::BINARY, //  "odp" => Icons::SLIDE, //  "ods" => Icons::SHEET, //  @@ -356,36 +531,45 @@ const EXTENSION_ICONS: Map<&'static str, char> = phf_map! { "org" => '\u{e633}', //  "otf" => Icons::FONT, //  "out" => '\u{eb2c}', //  + "p12" => Icons::KEY, //  "par" => Icons::COMPRESSED, //  "part" => '\u{f43a}', //  "patch" => Icons::DIFF, //  "pbm" => Icons::IMAGE, //  "pdf" => '\u{f1c1}', //  "pem" => Icons::KEY, //  + "pfx" => Icons::KEY, //  "pgm" => Icons::IMAGE, //  + "phar" => Icons::LANG_PHP, //  "php" => Icons::LANG_PHP, //  - "pl" => Icons::LANG_PERL, //  - "plx" => Icons::LANG_PERL, //  - "pm" => Icons::LANG_PERL, //  + "pkg" => '\u{eb29}', //  + "pl" => Icons::LANG_PERL, //  + "plist" => Icons::OS_APPLE, //  + "plx" => Icons::LANG_PERL, //  + "pm" => Icons::LANG_PERL, //  "png" => Icons::IMAGE, //  "pnm" => Icons::IMAGE, //  - "pod" => Icons::LANG_PERL, //  + "pod" => Icons::LANG_PERL, //  + "pp" => '\u{e631}', //  "ppm" => Icons::IMAGE, //  "ppt" => Icons::SLIDE, //  "pptx" => Icons::SLIDE, //  - "procfile" => Icons::LANG_RUBY, //  - Can not find a reference to procfile being Ruby "properties" => Icons::JSON, //  - "ps" => Icons::IMAGE, //  + "ps" => Icons::VECTOR, // 󰕙 "ps1" => Icons::POWERSHELL, //  "psd" => '\u{e7b8}', //  "psd1" => Icons::POWERSHELL, //  "psm1" => Icons::POWERSHELL, //  + "pub" => Icons::PUBLIC_KEY, // 󰷖 "pxm" => Icons::IMAGE, //  "py" => Icons::LANG_PYTHON, //  "pyc" => Icons::LANG_PYTHON, //  + "pyd" => Icons::LANG_PYTHON, //  + "pyi" => Icons::LANG_PYTHON, //  + "pyo" => Icons::LANG_PYTHON, //  + "qcow" => Icons::DISK_IMAGE, //  "qcow2" => Icons::DISK_IMAGE, //  "r" => Icons::LANG_R, //  - "rakefile" => Icons::LANG_RUBY, //  "rar" => Icons::COMPRESSED, //  "raw" => Icons::IMAGE, //  "razor" => Icons::RAZOR, //  @@ -409,31 +593,53 @@ const EXTENSION_ICONS: Map<&'static str, char> = phf_map! { "ru" => Icons::LANG_RUBY, //  "rubydoc" => Icons::LANG_RUBYRAILS, //  "s" => Icons::LANG_ASSEMBLY, //  - "sass" => '\u{e603}', //  + "sass" => Icons::LANG_SASS, //  "scala" => '\u{e737}', //  - "scss" => Icons::CSS3, //  + "scss" => Icons::LANG_SASS, //  "service" => '\u{eba2}', //  - "sh" => Icons::SHELL, //  - "shell" => Icons::SHELL, //  + "sh" => Icons::SHELL_CMD, //  + "sha1" => Icons::SHIELD_CHECK, // 󰕥 + "sha224" => Icons::SHIELD_CHECK, // 󰕥 + "sha256" => Icons::SHIELD_CHECK, // 󰕥 + "sha384" => Icons::SHIELD_CHECK, // 󰕥 + "sha512" => Icons::SHIELD_CHECK, // 󰕥 + "shell" => Icons::SHELL_CMD, //  + "sig" => Icons::SIGNED_FILE, // 󱧃 + "signature" => Icons::SIGNED_FILE, // 󱧃 "slim" => Icons::LANG_RUBYRAILS, //  "sln" => '\u{e70c}', //  "so" => Icons::OS_LINUX, //  "sql" => Icons::DATABASE, //  "sqlite3" => '\u{e7c4}', //  + "srt" => Icons::SUBTITLE, // 󰨖 "stl" => Icons::IMAGE, //  "sty" => Icons::LANG_TEX, //  "styl" => Icons::LANG_STYLUS, //  "stylus" => Icons::LANG_STYLUS, //  + "sub" => Icons::SUBTITLE, // 󰨖 + "sublime-build" => Icons::SUBLIME, //  + "sublime-keymap" => Icons::SUBLIME, //  + "sublime-menu" => Icons::SUBLIME, //  + "sublime-options"=> Icons::SUBLIME, //  + "sublime-package"=> Icons::SUBLIME, //  + "sublime-project"=> Icons::SUBLIME, //  + "sublime-session"=> Icons::SUBLIME, //  + "sublime-settings"=>Icons::SUBLIME, //  + "sublime-snippet"=> Icons::SUBLIME, //  + "sublime-theme" => Icons::SUBLIME, //  "svelte" => '\u{e697}', //  - "svg" => Icons::IMAGE, //  + "svg" => Icons::VECTOR, // 󰕙 "swift" => '\u{e755}', //  - "t" => Icons::LANG_PERL, //  + "t" => Icons::LANG_PERL, //  "tar" => Icons::COMPRESSED, //  "taz" => Icons::COMPRESSED, //  "tbz" => Icons::COMPRESSED, //  "tbz2" => Icons::COMPRESSED, //  - "tc" => Icons::COMPRESSED, //  + "tc" => Icons::DISK_IMAGE, //  "tex" => Icons::LANG_TEX, //  + "tf" => Icons::TERRAFORM, // 󱁢 + "tfstate" => Icons::TERRAFORM, // 󱁢 + "tfvars" => Icons::TERRAFORM, // 󱁢 "tgz" => Icons::COMPRESSED, //  "tif" => Icons::IMAGE, //  "tiff" => Icons::IMAGE, //  @@ -443,6 +649,7 @@ const EXTENSION_ICONS: Map<&'static str, char> = phf_map! { "ts" => Icons::LANG_TYPESCRIPT, //  "tsv" => Icons::SHEET, //  "tsx" => Icons::REACT, //  + "ttc" => Icons::FONT, //  "ttf" => Icons::FONT, //  "twig" => '\u{e61c}', //  "txt" => Icons::TEXT, //  @@ -462,11 +669,13 @@ const EXTENSION_ICONS: Map<&'static str, char> = phf_map! { "wav" => Icons::AUDIO, //  "webm" => Icons::VIDEO, //  "webp" => Icons::IMAGE, //  + "whl" => Icons::LANG_PYTHON, //  "windows" => Icons::OS_WINDOWS, //  "wma" => Icons::AUDIO, //  "wmv" => Icons::VIDEO, //  "woff" => Icons::FONT, //  "woff2" => Icons::FONT, //  + "xcf" => Icons::IMAGE, //  "xhtml" => Icons::HTML5, //  "xls" => Icons::SHEET, //  "xlsm" => Icons::SHEET, //  @@ -475,14 +684,13 @@ const EXTENSION_ICONS: Map<&'static str, char> = phf_map! { "xpm" => Icons::IMAGE, //  "xul" => Icons::XML, // 󰗀 "xz" => Icons::COMPRESSED, //  - "yaml" => Icons::YAML, //  - "yml" => Icons::YAML, //  + "yaml" => Icons::YAML, //  + "yml" => Icons::YAML, //  "z" => Icons::COMPRESSED, //  "zig" => '\u{21af}', // ↯ "zip" => Icons::COMPRESSED, //  - "zsh" => Icons::SHELL, //  - "zsh-theme" => Icons::SHELL, //  - "zshrc" => Icons::SHELL, //  + "zsh" => Icons::SHELL_CMD, //  + "zsh-theme" => Icons::SHELL, // 󱆃 "zst" => Icons::COMPRESSED, //  }; @@ -503,17 +711,19 @@ pub fn iconify_style(style: Style) -> Style { /// Lookup the icon for a file based on the file's name, if the entry is a /// directory, or by the lowercase file extension. pub fn icon_for_file(file: &File<'_>) -> char { - if let Some(icon) = FILENAME_ICONS.get(file.name.as_str()) { + if file.points_to_directory() { + *DIRECTORY_ICONS.get(file.name.as_str()).unwrap_or_else(|| { + if file.is_empty_dir() { + &Icons::FOLDER_OPEN //  + } else { + &Icons::FOLDER //  + } + }) + } else if let Some(icon) = FILENAME_ICONS.get(file.name.as_str()) { *icon - } else if file.points_to_directory() { - if file.is_empty_dir() { - '\u{f115}' //  - } else { - '\u{f07b}' //  - } } else if let Some(ext) = file.ext.as_ref() { - *EXTENSION_ICONS.get(ext.as_str()).unwrap_or(&'\u{f15b}') //  + *EXTENSION_ICONS.get(ext.as_str()).unwrap_or(&Icons::FILE) //  } else { - '\u{f016}' //  + Icons::FILE_OUTLINE //  } }