meta: Switch from ranger to joshuto

Joshuto is *significantly* faster than ranger and is written in Rust
instead of Python. Although both ranger and joshuto have not seen a new
release in a while, the future of joshuto seems more promising.

Joshuto is additionally faster than lf and, similar to lf, does not hang
when previewing images with kitty.
This commit is contained in:
Donovan Glover 2023-05-27 15:37:07 -04:00
parent 0fbd0e12e9
commit d8914cb4d2
No known key found for this signature in database
GPG Key ID: EA7408A77AE1BE65
8 changed files with 178 additions and 30 deletions

View File

@ -7,7 +7,7 @@
./gpg
./ncmpcpp
./neovim
./ranger
./joshuto
];
environment.systemPackages = with pkgs; [

View File

@ -68,7 +68,7 @@
e = "exit";
k = "kitty @ set-colors -c -a ~/.cache/wal/kitty";
l = "ls -l";
r = "ranger";
j = "joshuto";
w = "wal -o ~/.config/wal/done.sh";
T = "tree";
};

View File

@ -0,0 +1,28 @@
{ pkgs, ... }:
{
environment.systemPackages = [
(pkgs.callPackage ./package {})
];
home-manager.sharedModules = [{
xdg.configFile."joshuto/joshuto.toml".text = ''
[display]
automatically_count_files = true
show_borders = false
show_hidden = true
line_number_style = "absolute"
collapse_preview = false
[preview]
max_preview_size = 104857600
preview_script = "~/.config/joshuto/preview.sh"
preview_shown_hook_script = "~/.config/joshuto/kitty-show.sh"
preview_removed_hook_script = "~/.config/joshuto/kitty-remove.sh"
'';
xdg.configFile."joshuto/preview.sh".source = ./preview.sh;
xdg.configFile."joshuto/kitty-show.sh".source = ./kitty-show.sh;
xdg.configFile."joshuto/kitty-remove.sh".source = ./kitty-remove.sh;
}];
}

View File

@ -0,0 +1,5 @@
#!/usr/bin/env bash
kitty +kitten icat \
--transfer-mode=file \
--clear 2>/dev/null

32
terminal/joshuto/kitty-show.sh Executable file
View File

@ -0,0 +1,32 @@
#!/usr/bin/env bash
FILE_PATH="$1" # Full path of the previewed file
PREVIEW_X_COORD="$2" # x coordinate of upper left cell of preview area
PREVIEW_Y_COORD="$3" # y coordinate of upper left cell of preview area
PREVIEW_WIDTH="$4" # Width of the preview pane (number of fitting characters)
PREVIEW_HEIGHT="$5" # Height of the preview pane (number of fitting characters)
TMP_FILE="$HOME/.cache/joshuto/thumbcache.png"
mimetype=$(file --mime-type -Lb "$FILE_PATH")
function image {
kitty +kitten icat \
--transfer-mode=file \
--clear 2>/dev/null
kitty +kitten icat \
--transfer-mode=file \
--place "${PREVIEW_WIDTH}x${PREVIEW_HEIGHT}@${PREVIEW_X_COORD}x${PREVIEW_Y_COORD}" \
"$1" 2>/dev/null
}
case "$mimetype" in
image/*)
image "${FILE_PATH}"
;;
*)
kitty +kitten icat \
--transfer-mode=file \
--clear 2>/dev/null
;;
esac

View File

@ -0,0 +1,22 @@
{ lib, rustPlatform, fetchFromGitHub }:
rustPlatform.buildRustPackage rec {
pname = "joshuto";
version = "493af3185092036cbbae81ae620b101f66cf4e9a";
src = fetchFromGitHub {
owner = "kamiyaa";
repo = pname;
rev = version;
sha256 = "sha256-jLlDMV03eFWDB1D6pFEq2MFAfoVwFTy8ZpweS9syDB0=";
};
cargoSha256 = "sha256-dffKMgXhm4VpDSEzFW5d4oGCBKY/ppj1gx29Iw3Msc8=";
meta = with lib; {
description = "Ranger-like terminal file manager written in Rust";
homepage = "https://github.com/kamiyaa/joshuto";
license = licenses.lgpl3Only;
maintainers = with maintainers; [ figsoda totoroot ];
};
}

89
terminal/joshuto/preview.sh Executable file
View File

@ -0,0 +1,89 @@
#!/usr/bin/env bash
IFS=$'\n'
set -o noclobber -o noglob -o nounset -o pipefail
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
realpath=$(realpath "$FILE_PATH")
handle_extension() {
case "${FILE_EXTENSION_LOWER}" in
rar)
unrar lt -p- -- "${FILE_PATH}" && exit 0
exit 1;;
7z)
7z l -p -- "${FILE_PATH}" && exit 0
exit 1;;
pdf)
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;;
torrent)
transmission-show -- "${FILE_PATH}" && exit 0
exit 1;;
json)
jq --color-output . "${FILE_PATH}" && exit 0
;;
esac
}
handle_mime() {
local mimetype="${1}"
case "${mimetype}" in
## 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;;
## Image
image/*)
exit 5;;
## Video and audio
video/* | audio/*)
echo "$realpath"
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

View File

@ -1,28 +0,0 @@
{ pkgs, ... }:
{
environment.systemPackages = [ pkgs.ranger ];
home-manager.sharedModules = [{
xdg.configFile."ranger/rc.conf".text = ''
set line_numbers absolute
set padding_right false
set vcs_aware true
set show_hidden true
set confirm_on_delete always
set save_console_history false
set mouse_enabled false
set tilde_in_titlebar true
alias r rename
alias d delete
map DD shell trash %s
set use_preview_script true
set preview_files true
set preview_images true
set preview_images_method kitty
'';
}];
}