{ pkgs, config, lib, ... }: let inherit (lib) mkIf mkEnableOption; cfg = config.console.joshuto; in { options = { console.joshuto.enable = mkEnableOption "enable joshuto file manager"; }; config = # let # test = pkgs.writeShellApplication { # name = "upgrade"; # text = '' # IFS=$'\n' # # Security measures: # # * noclobber prevents you from overwriting a file with `>` # # * noglob prevents expansion of wild cards # # * nounset causes bash to fail if an undeclared variable is used (e.g. typos) # # * pipefail causes a pipeline to fail also if a command other than the last one fails # set -o noclobber -o noglob -o nounset -o pipefail # # Enable exiftool large file support # shopt -s expand_aliases # alias exiftool='exiftool -api largefilesupport=1' # FILE_PATH="" # PREVIEW_WIDTH=10 # PREVIEW_HEIGHT=10 # while [ "$#" -gt 0 ]; do # case "$1" in # "--path") # shift # FILE_PATH="$1" # ;; # "--preview-width") # shift # PREVIEW_WIDTH="$1" # ;; # "--preview-height") # shift # PREVIEW_HEIGHT="$1" # ;; # esac # shift # done # handle_extension() { # case "\$\{FILE_EXTENSION_LOWER}" in # ## Archive # a | ace | alz | arc | arj | bz | bz2 | cab | cpio | deb | gz | jar | lha | lz | lzh | lzma | lzo | \ # rpm | rz | t7z | tar | tbz | tbz2 | tgz | tlz | txz | tZ | tzo | war | xpi | xz | Z | zip) # atool --list -- "\$\{FILE_PATH}" && exit 0 # bsdtar --list --file "\$\{FILE_PATH}" && exit 0 # exit 1 # ;; # rar) # ## Avoid password prompt by providing empty password # unrar lt -p- -- "\$\{FILE_PATH}" && exit 0 # exit 1 # ;; # 7z) # ## Avoid password prompt by providing empty password # 7z l -p -- "\$\{FILE_PATH}" && exit 0 # exit 1 # ;; # ## PDF # pdf) # ## Preview as text conversion # pdftotext -l 10 -nopgbrk -q -- "\$\{FILE_PATH}" - | # fmt -w "\$\{PREVIEW_WIDTH}" && exit 0 # mutool draw -F txt -i -- "\$\{FILE_PATH}" 1-10 | # fmt -w "\$\{PREVIEW_WIDTH}" && exit 0 # exiftool "\$\{FILE_PATH}" && exit 0 # exit 1 # ;; # ## BitTorrent # torrent) # transmission-show -- "\$\{FILE_PATH}" && exit 0 # exit 1 # ;; # ## OpenDocument # odt | sxw) # ## Preview as text conversion # odt2txt "\$\{FILE_PATH}" && exit 0 # ## Preview as markdown conversion # pandoc -s -t markdown -- "\$\{FILE_PATH}" && exit 0 # exit 1 # ;; # ods | odp) # ## Preview as text conversion (unsupported by pandoc for markdown) # odt2txt "\$\{FILE_PATH}" && exit 0 # exit 1 # ;; # ## XLSX # xlsx) # ## Preview as csv conversion # ## Uses: https://github.com/dilshod/xlsx2csv # xlsx2csv -- "\$\{FILE_PATH}" && exit 0 # exit 1 # ;; # ## HTML # htm | html | xhtml) # ## Preview as text conversion # w3m -dump "\$\{FILE_PATH}" && exit 0 # lynx -dump -- "\$\{FILE_PATH}" && exit 0 # elinks -dump "\$\{FILE_PATH}" && exit 0 # pandoc -s -t markdown -- "\$\{FILE_PATH}" && exit 0 # bat --color=always --paging=never \ # --style=plain \ # --terminal-width="\$\{PREVIEW_WIDTH}" \ # "\$\{FILE_PATH}" && exit 0 # ;; # ## JSON # json | ipynb) # jq --color-output . "\$\{FILE_PATH}" && exit 0 # python -m json.tool -- "\$\{FILE_PATH}" && exit 0 # bat --color=always --paging=never \ # --style=plain \ # --terminal-width="\$\{PREVIEW_WIDTH}" \ # "\$\{FILE_PATH}" && exit 0 # ;; # ## Direct Stream Digital/Transfer (DSDIFF) and wavpack aren't detected # ## by file(1). # dff | dsf | wv | wvc) # mediainfo "\$\{FILE_PATH}" && exit 0 # exiftool "\$\{FILE_PATH}" && exit 0 # ;; # Continue with next handler on failure # esac # } # handle_mime() { # local mimetype="\$\{1}" # case "\$\{mimetype}" in # ## RTF and DOC # text/rtf | *msword) # ## Preview as text conversion # ## note: catdoc does not always work for .doc files # ## catdoc: http://www.wagner.pp.ru/~vitus/software/catdoc/ # catdoc -- "\$\{FILE_PATH}" && exit 0 # exit 1 # ;; # ## DOCX, ePub, FB2 (using markdown) # ## You might want to remove "|epub" and/or "|fb2" below if you have # ## uncommented other methods to preview those formats # *wordprocessingml.document | */epub+zip | */x-fictionbook+xml) # ## Preview as markdown conversion # pandoc -s -t markdown -- "\$\{FILE_PATH}" | bat -l markdown \ # --color=always --paging=never \ # --style=plain \ # --terminal-width="\$\{PREVIEW_WIDTH}" && exit 0 # exit 1 # ;; # ## E-mails # message/rfc822) # ## Parsing performed by mu: https://github.com/djcb/mu # mu view -- "\$\{FILE_PATH}" && exit 0 # exit 1 # ;; # ## XLS # *ms-excel) # ## Preview as csv conversion # ## xls2csv comes with catdoc: # ## http://www.wagner.pp.ru/~vitus/software/catdoc/ # xls2csv -- "\$\{FILE_PATH}" && exit 0 # exit 1 # ;; # ## Text # text/* | */xml) # bat --color=always --paging=never \ # --style=plain \ # --terminal-width="\$\{PREVIEW_WIDTH}" \ # "\$\{FILE_PATH}" && exit 0 # cat "\$\{FILE_PATH}" && exit 0 # exit 1 # ;; # ## DjVu # image/vnd.djvu) # ## Preview as text conversion (requires djvulibre) # djvutxt "\$\{FILE_PATH}" | fmt -w "\$\{PREVIEW_WIDTH}" && exit 0 # exiftool "\$\{FILE_PATH}" && exit 0 # exit 1 # ;; # ## Image # image/*) # ## Preview as text conversion # exiftool "\$\{FILE_PATH}" && exit 0 # exit 1 # ;; # ## Video and audio # video/* | audio/*) # mediainfo "\$\{FILE_PATH}" && exit 0 # exiftool "\$\{FILE_PATH}" && exit 0 # exit 1 # ;; # esac # } # FILE_EXTENSION="\$\{FILE_PATH##*.}" # FILE_EXTENSION_LOWER="$(printf "%s" "\$\{FILE_EXTENSION}" | tr '[:upper:]' '[:lower:]')" # handle_extension # MIMETYPE="$(file --dereference --brief --mime-type -- "\$\{FILE_PATH}")" # handle_mime "\$\{MIMETYPE}" # exit 1 # ''; # }; # in mkIf cfg.enable { home.packages = [pkgs.file]; programs.joshuto = { enable = true; # file manager in rust settings = { mouse_support = true; focus_on_create = true; use_trash = true; watch_files = true; xdg_open = true; xdg_open_fork = true; case_insensitive_ext = false; # zoxide_update = true; display = { mode = "minimal"; show_icons = true; column_ratio = [1 5 2]; }; preview = { # preview_script = getExe pkgs.pistol; use_xdg_thumbs = true; xdg_thumb_size = "xxlarge"; }; }; mimetype = { class = { text_default = [ { command = "hx"; } ]; }; extension = { build."inherit" = "text_default"; c."inherit" = "text_default"; cmake."inherit" = "text_default"; conf."inherit" = "text_default"; cpp."inherit" = "text_default"; css."inherit" = "text_default"; csv."inherit" = "text_default"; cu."inherit" = "text_default"; ebuild."inherit" = "text_default"; eex."inherit" = "text_default"; env."inherit" = "text_default"; ex."inherit" = "text_default"; exs."inherit" = "text_default"; go."inherit" = "text_default"; h."inherit" = "text_default"; hpp."inherit" = "text_default"; hs."inherit" = "text_default"; html."inherit" = "text_default"; ini."inherit" = "text_default"; java."inherit" = "text_default"; js."inherit" = "text_default"; json."inherit" = "text_default"; kt."inherit" = "text_default"; log."inherit" = "text_default"; lua."inherit" = "text_default"; md."inherit" = "text_default"; micro."inherit" = "text_default"; ninja."inherit" = "text_default"; nix."inherit" = "text_default"; norg."inherit" = "text_default"; org."inherit" = "text_default"; py."inherit" = "text_default"; rkt."inherit" = "text_default"; rs."inherit" = "text_default"; scss."inherit" = "text_default"; sh."inherit" = "text_default"; srt."inherit" = "text_default"; svelte."inherit" = "text_default"; toml."inherit" = "text_default"; tsx."inherit" = "text_default"; txt."inherit" = "text_default"; vim."inherit" = "text_default"; xml."inherit" = "text_default"; yaml."inherit" = "text_default"; yml."inherit" = "text_default"; }; mimetype = { text = {"inherit" = "text_default";}; }; }; }; }; }