From f3685dcbf50c40ae5e860eabd4bccd2be53c8081 Mon Sep 17 00:00:00 2001 From: Tristan Date: Fri, 5 Jan 2024 22:02:50 +0000 Subject: [PATCH] move lf configuration and use upstream --- custom/lf-sixel/default.nix | 49 ------------- home/default.nix | 118 +------------------------------- home/programs/lf/bulk-rename.sh | 22 ++++++ home/programs/lf/default.nix | 49 +++++++++++++ home/programs/lf/preview.sh | 83 ++++++++++++++++++++++ 5 files changed, 156 insertions(+), 165 deletions(-) delete mode 100644 custom/lf-sixel/default.nix create mode 100644 home/programs/lf/bulk-rename.sh create mode 100644 home/programs/lf/default.nix create mode 100755 home/programs/lf/preview.sh diff --git a/custom/lf-sixel/default.nix b/custom/lf-sixel/default.nix deleted file mode 100644 index 09229bf..0000000 --- a/custom/lf-sixel/default.nix +++ /dev/null @@ -1,49 +0,0 @@ -{ - lib, - stdenv, - buildGoModule, - fetchFromGitHub, - installShellFiles, -}: -buildGoModule rec { - pname = "lf"; - version = "28-1"; - - src = fetchFromGitHub { - owner = "horriblename"; - repo = "lf"; - rev = "r${version}"; - hash = "sha256-FBjvZueSh9+grdDrD8DTOlJb6GaCQuJhrsOXRwlpDSQ="; - }; - - vendorHash = "sha256-oIIyQbw42+B6T6Qn6nIV62Xr+8ms3tatfFI8ocYNr0A="; - - nativeBuildInputs = [installShellFiles]; - - ldflags = ["-s" "-w" "-X main.gVersion=r${version}"]; - - # Force the use of the pure-go implementation of the os/user library. - # Relevant issue: https://github.com/gokcehan/lf/issues/191 - tags = lib.optionals (!stdenv.isDarwin) ["osusergo"]; - - postInstall = '' - install -D --mode=444 lf.desktop $out/share/applications/lf.desktop - installManPage lf.1 - installShellCompletion etc/lf.{bash,zsh,fish} - ''; - - meta = with lib; { - description = "A terminal file manager written in Go and heavily inspired by ranger"; - longDescription = '' - lf (as in "list files") is a terminal file manager written in Go. It is - heavily inspired by ranger with some missing and extra features. Some of - the missing features are deliberately omitted since it is better if they - are handled by external tools. - ''; - homepage = "https://godoc.org/github.com/gokcehan/lf"; - changelog = "https://github.com/gokcehan/lf/releases/tag/r${version}"; - license = licenses.mit; - platforms = platforms.unix; - maintainers = with maintainers; [dotlambda]; - }; -} diff --git a/home/default.nix b/home/default.nix index 2fe148d..313ddc8 100644 --- a/home/default.nix +++ b/home/default.nix @@ -25,7 +25,7 @@ let glow = "${pkgs.glow}/bin/glow"; ffmpegthumbnailer = "${pkgs.ffmpegthumbnailer}/bin/ffmpegthumbnailer"; }; - lf-sixel = pkgs.callPackage ../custom/lf-sixel/. {}; + # lf-sixel = pkgs.callPackage ../custom/lf-sixel/. {}; in { imports = [ ./modules/terminal.nix @@ -40,6 +40,7 @@ in { ./programs/scripts.nix ./programs/neovim/. ./programs/git.nix + ./programs/lf/. ]; programs.home-manager.enable = true; @@ -98,121 +99,6 @@ in { }; }; - programs.lf.enable = true; - programs.lf.package = lf-sixel; - programs.lf.keybindings = { - D = "trash"; - R = "drag"; - "" = ":rename"; - "" = "open-with"; - }; - programs.lf.commands = { - drag = "%${pkgs.ripdrag}/bin/ripdrag -x \"$fx\""; - trash = "%${pkgs.trash-cli}/bin/trash-put \"$fx\""; - open = "$set -f; ${pkgs.ranger}/bin/rifle -p 0 \"$fx\""; - open-with = '' ''${{ - set -f - ${pkgs.ranger}/bin/rifle -l "$fx" - read -p "Open with: " method - ${pkgs.ranger}/bin/rifle -p "$method" "$fx" - }}''; - bulk-rename = '' ''${{ - old="$(mktemp)" - new="$(mktemp)" - if [ -n "$fs" ]; then - fs="$(basename -a $fs)" - else - fs="$(ls)" - fi - printf '%s\n' "$fs" >"$old" - printf '%s\n' "$fs" >"$new" - $EDITOR "$new" - [ "$(wc -l < "$new")" -ne "$(wc -l < "$old")" ] && exit - paste "$old" "$new" | while IFS= read -r names; do - src="$(printf '%s' "$names" | cut -f1)" - dst="$(printf '%s' "$names" | cut -f2)" - if [ "$src" = "$dst" ] || [ -e "$dst" ]; then - continue - fi - mv -- "$src" "$dst" - done - rm -- "$old" "$new" - lf -remote "send $id unselect" - }}''; - }; - programs.lf.previewer.source = pkgs.writeShellScript "preview" '' - image () { - echo "$1" - ${my-deps.chafa} "$1" -f sixel -s "$(($2/2))x$3" | sed 's/#/\n#/g' - ${my-deps.exiftool} "$1" - } - - batted () { - cat "$@" - } - - mkdir -p "$HOME/.cache/lf" - CACHE="$HOME/.cache/lf/thumbnail.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | awk '{print $1}'))" - - case "$(printf "%s\n" "$(readlink -f "$1")" | awk '{print tolower($0)}')" in - *.tgz|*.tar.gz) tar tzf "$1" ;; - *.tar.bz2|*.tbz2) tar tjf "$1" ;; - *.tar.txz|*.txz) xz --list "$1" ;; - *.tar) tar tf "$1" ;; - *.zip|*.jar|*.war|*.ear|*.oxt) unzip -l "$1" ;; - *.rar) unrar l "$1" ;; - *.md) ${my-deps.glow} -s dark "$1" ;; - *.7z) 7z l "$1" ;; - *.[1-8]) man "$1" | col -b ;; - *.o) nm "$1";; - *.torrent) transmission-show "$1" ;; - *.iso) iso-info --no-header -l "$1" ;; - *.odt|*.ods|*.odp|*.sxw) odt2txt "$1" ;; - *.doc) catdoc "$1" ;; - *.docx) docx2txt "$1" - ;; - *.xml|*.html) w3m -dump "$1";; - *.xls|*.xlsx) - ssconvert --export-type=Gnumeric_stf:stf_csv "$1" "fd://1" | batted --language=csv - ;; - *.wav|*.mp3|*.flac|*.m4a|*.wma|*.ape|*.ac3|*.og[agx]|*.spx|*.opus|*.as[fx]|*.mka) - ${my-deps.exiftool} "$1" - ;; - *.pdf) - [ ! -f "$CACHE.jpg" ] && \ - pdftoppm -jpeg -f 1 -singlefile "$1" "$CACHE" - image "$CACHE.jpg" "$2" "$3" "$4" "$5" - ;; - *.epub) - [ ! -f "$CACHE" ] && \ - epub-thumbnailer "$1" "$CACHE" 1024 - image "$CACHE" "$2" "$3" "$4" "$5" - ;; - *.cbz|*.cbr|*.cbt) - [ ! -f "$CACHE" ] && \ - comicthumb "$1" "$CACHE" 1024 - image "$CACHE" "$2" "$3" "$4" "$5" - ;; - *.avi|*.mp4|*.wmv|*.dat|*.3gp|*.ogv|*.mkv|*.mpg|*.mpeg|*.vob|*.fl[icv]|*.m2v|*.mov|*.webm|*.ts|*.mts|*.m4v|*.r[am]|*.qt|*.divx) - [ ! -f "$CACHE.jpg" ] && \ - ${my-deps.ffmpegthumbnailer} -i "$1" -o "$CACHE.jpg" -s 0 -q 5 - image "$CACHE.jpg" "$2" "$3" "$4" "$5" - ;; - *.bmp|*.jpg|*.jpeg|*.png|*.xpm|*.webp|*.jfif) - image "$1" "$2" "$3" "$4" "$5" - ;; - *.svg) - [ ! -f "$CACHE.jpg" ] && \ - convert "$1" "$CACHE.jpg" - image "$CACHE.jpg" "$2" "$3" "$4" "$5" - ;; - *.ino) - batted --language=cpp "$1" - ;; - *) - batted "$1" - ;; - esac - ''; home.file.".icons/default".source = "${pkgs.vanilla-dmz}/share/icons/Vanilla-DMZ"; programs.helix = { diff --git a/home/programs/lf/bulk-rename.sh b/home/programs/lf/bulk-rename.sh new file mode 100644 index 0000000..2a2d839 --- /dev/null +++ b/home/programs/lf/bulk-rename.sh @@ -0,0 +1,22 @@ + +old="$(mktemp)" +new="$(mktemp)" +if [ -n "$fs" ]; then + fs="$(basename -a $fs)" +else + fs="$(ls)" +fi +printf '%s\n' "$fs" >"$old" +printf '%s\n' "$fs" >"$new" +$EDITOR "$new" +[ "$(wc -l < "$new")" -ne "$(wc -l < "$old")" ] && exit +paste "$old" "$new" | while IFS= read -r names; do + src="$(printf '%s' "$names" | cut -f1)" + dst="$(printf '%s' "$names" | cut -f2)" + if [ "$src" = "$dst" ] || [ -e "$dst" ]; then + continue + fi + mv -- "$src" "$dst" +done +rm -- "$old" "$new" +lf -remote "send $id unselect" diff --git a/home/programs/lf/default.nix b/home/programs/lf/default.nix new file mode 100644 index 0000000..6b4ff9f --- /dev/null +++ b/home/programs/lf/default.nix @@ -0,0 +1,49 @@ +{pkgs, ...}: let + readScript = path: '' ''${{ + ${builtins.readFile path} + }}''; +in { + home.packages = with pkgs; [ + # previewer + chafa + exiftool + bat + + ffmpegthumbnailer + trash-cli + imagemagick + gnumeric + poppler_utils + odt2txt + python311Packages.docx2txt + catdoc + libcdio + p7zip + file + gnome-epub-thumbnailer + ]; + + programs.lf.enable = true; + programs.lf.keybindings = { + D = "trash"; + R = "drag"; + "" = ":rename"; + "" = "open-with"; + }; + programs.lf.extraConfig = '' + set sixel true + ''; + programs.lf.commands = { + drag = "%${pkgs.ripdrag}/bin/ripdrag -x \"$fx\""; + trash = "%trash-put \"$fx\""; + open = "$set -f; ${pkgs.ranger}/bin/rifle -p 0 \"$fx\""; + open-with = '' ''${{ + set -f + ${pkgs.ranger}/bin/rifle -l "$fx" + read -p "Open with: " method + ${pkgs.ranger}/bin/rifle -p "$method" "$fx" + }}''; + bulk-rename = readScript ./bulk-rename.sh; + }; + programs.lf.previewer.source = ./preview.sh; +} diff --git a/home/programs/lf/preview.sh b/home/programs/lf/preview.sh new file mode 100755 index 0000000..8c003b8 --- /dev/null +++ b/home/programs/lf/preview.sh @@ -0,0 +1,83 @@ +#!/bin/sh + +HASH=$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | md5sum $1 | cut -f 1 -d " ") + +CACHEDIR=/tmp/lf/thumbnail/ +mkdir -p $CACHEDIR +CACHE=$CACHEDIR/$HASH + +image () { + [ ! -f "$CACHE" ] && \ + chafa -f sixel -s "$2x$3" --animate off --polite on "$1" > "$CACHE" + cat "$CACHE" +} + +case "$(file -Lb --mime-type -- "$1")" in + image/*) + image $@ + exit 1 + ;; + text/*) + bat "$1" + ;; + application/pdf) + [ ! -f "$CACHE.jpeg" ] && \ + pdftoppm -jpeg -f 1 -singlefile "$1" "$CACHE.jpeg" + image "$CACHE.jpeg" "$2" "$3" "$4" "$5" + ;; + *) + exiftool "$1" + ;; +esac + +exit + +case "$(printf "%s\n" "$(readlink -f "$1")" | awk '{print tolower($0)}')" in + *.tgz|*.tar.gz) tar tzf "$1" ;; + *.tar.bz2|*.tbz2) tar tjf "$1" ;; + *.tar.txz|*.txz) xz --list "$1" ;; + *.tar) tar tf "$1" ;; + *.zip|*.jar|*.war|*.ear|*.oxt) unzip -l "$1" ;; + *.md) glow -s dark "$1" ;; + *.7z) 7z l "$1" ;; + *.[1-8]) man "$1" | col -b ;; + *.o) nm "$1";; + *.torrent) transmission-show "$1" ;; + *.iso) iso-info --no-header -l "$1" ;; + *.odt|*.ods|*.odp|*.sxw) odt2txt "$1" ;; + *.doc) catdoc "$1" ;; + *.docx) docx2txt "$1" - ;; + *.xml|*.html) w3m -dump "$1";; + *.xls|*.xlsx) + ssconvert --export-type=Gnumeric_stf:stf_csv "$1" "fd://1" + ;; + *.wav|*.mp3|*.flac|*.m4a|*.wma|*.ape|*.ac3|*.og[agx]|*.spx|*.opus|*.as[fx]|*.mka) + exiftool "$1" + ;; + *.pdf) + [ ! -f "$CACHE.jpg" ] && \ + pdftoppm -jpeg -f 1 -singlefile "$1" "$CACHE" + image "$CACHE.jpg" "$2" "$3" "$4" "$5" + ;; + *.epub) + [ ! -f "$CACHE" ] && \ + epub-thumbnailer "$1" "$CACHE" 1024 + image "$CACHE" "$2" "$3" "$4" "$5" + ;; + *.avi|*.mp4|*.wmv|*.dat|*.3gp|*.ogv|*.mkv|*.mpg|*.mpeg|*.vob|*.fl[icv]|*.m2v|*.mov|*.webm|*.ts|*.mts|*.m4v|*.r[am]|*.qt|*.divx) + [ ! -f "$CACHE.jpg" ] && \ + ffmpegthumbnailer -i "$1" -o "$CACHE.jpg" -s 0 -q 5 + image "$CACHE.jpg" "$2" "$3" "$4" "$5" + ;; + *.bmp|*.jpg|*.jpeg|*.png|*.xpm|*.webp|*.jfif) + image "$1" "$2" "$3" "$4" "$5" + ;; + *.svg) + [ ! -f "$CACHE.jpg" ] && \ + convert "$1" "$CACHE.jpg" + image "$CACHE.jpg" "$2" "$3" "$4" "$5" + ;; + *) + cat "$1" + ;; + esac