{ config, pkgs, ... }: { programs.lf = { enable = true; commands = { trash = ''''${{ set -f ${pkgs.trash-cli}/bin/trash $fx }}''; extract = ''''${{ set -f ${pkgs.dtrx}/bin/dtrx -n $fx }}''; compress_gzip = ''''${{ set -f ${pkgs.gnutar}/bin/tar Oc $(realpath --relative-to $PWD $f) | \ ${pkgs.pigz}/bin/pigz -cv - > $f.tar.gz }}''; compress_zip = ''''${{ set -f ${pkgs.zip}/bin/zip -r $f.zip $(realpath --relative-to $PWD $f) }}''; compress_xz = ''''${{ set -f ${pkgs.gnutar}/bin/tar Oc $(realpath --relative-to $PWD $f) | \ ${pkgs.pxz}/bin/pxz -cv - > $f.tar.xz }}''; compress_bzip2 = ''''${{ set -f ${pkgs.gnutar}/bin/tar Oc $(realpath --relative-to $PWD $f) | \ ${pkgs.pbzip2}/bin/pbzip2 -cv - > $f.tar.bz2 }}''; compress_zstd = ''''${{ set -f ${pkgs.gnutar}/bin/tar --zstd -cvf $f.tar.zst $(realpath --relative-to $PWD $f) }}''; compress_just_tar = ''''${{ set -f ${pkgs.gnutar}/bin/tar -cvf $f.tar $(realpath --relative-to $PWD $f) }}''; show_size = ''%{{ set -f ${pkgs.coreutils}/bin/du -sh $f }}''; ncdu = ''''${{ set -f ${pkgs.ncdu}/bin/ncdu $f }}''; # find = ''''${{ # set -f # read -p toggle_preview = ''%{{ if [ "$lf_preview" = "true" ]; then lf -remote "send $id :set preview false; set ratios 1:5" else lf -remote "send $id :set preview true; set ratios 1:2:3" fi }} ''; paste = ''&{{ set -- $(cat ~/.local/share/lf/files) mode="$1" shift case "$mode" in copy) rsync -ah --ignore-existing --info=progress2 --no-inc-recursive -- "$@" . | stdbuf -i0 -o0 -e0 tr '\r' '\n' | while IFS= read -r line; do lf -remote "send $id echo $line" done ;; move) mv -n -- "$@" .;; esac rm ~/.local/share/lf/files lf -remote "send clear" }}''; bulk-rename = ''''${{ old="$(mktemp)" new="$(mktemp)" if [ -n "$fs" ]; then fs="$(basename -a $fs)" else fs="$(ls -a)" 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" }}''; alt-paste = ''&{{ if [ -n "$fs" ]; then lf -remote "send $id $1; save-select" fi lf -remote "send $id paste" }}''; load-select = ''&{{ # skip if triggered via save-select from itself if [ "$1" = "$id" ]; then exit 0 fi lf -remote "send $id unselect" if [ -s ~/.local/share/lf/select ]; then files=$(tr '\n' '\0' < ~/.local/share/lf/select | xargs -0 printf ' %q') lf -remote "send $id toggle $files" fi }}''; save-select = ''&{{ printf "%s" "$fs" > ~/.local/share/lf/select lf -remote "send load-select $id" }}''; follow_link = ''%{{ lf -remote "send ''${id} select '$(readlink $f)'" }}''; open_folder_in_sxiv = ''%{{ nsxiv . }}''; }; keybindings = { D = "trash"; x = "extract"; Xg = "compress_gzip"; Xz = "compress_zip"; Xx = "compress_xz"; Xb = "compress_bzip2"; Xs = "compress_zstd"; Xt = "compress_just_tar"; as = "show_size"; an = "ncdu"; ar = "bulk-rename"; af = "follow_link"; ai = "open_folder_in_sxiv"; E = "$nvim"; p = "alt-paste copy"; P = "alt-paste cut"; "" = ":toggle; down; save-select"; u = ":unselect; save-select"; v = ":invert; save-select"; "" = "toggle_preview"; }; # previewer.source = "${pkgs.pistol}/bin/pistol"; previewer.source = pkgs.writers.writeBash "pistol" '' file=$1 w=$2 h=$3 x=$4 y=$5 if [[ "$( ${pkgs.file}/bin/file -Lb --mime-type "$file")" =~ ^image ]]; then kitty +kitten icat --silent --stdin no --transfer-mode file --place \ "''${w}x''${h}@''${x}x''${y}" "$file" < /dev/null > /dev/tty exit 1 fi ${pkgs.pistol}/bin/pistol "$file" ''; settings = { icons = true; ifs = "\\n"; cleaner = let cleaner = pkgs.writers.writeBash "cleaner" '' kitty +kitten icat --clear --stdin no --silent --transfer-mode file < /dev/null > /dev/tty ''; in "${cleaner}"; }; extraConfig = '' load-select setlocal ${config.xdg.userDirs.download} sortby time setlocal ${config.xdg.userDirs.download} reverse setlocal ${config.xdg.userDirs.download} set info size:time ''; }; programs.fish.functions.lfcd.body = '' set tmp (mktemp) # `command` is needed in case `lfcd` is aliased to `lf` command lf -last-dir-path=$tmp $argv if test -f "$tmp" set dir (cat $tmp) rm -f $tmp if test -d "$dir" if test "$dir" != (pwd) cd $dir end end end ''; programs.fish = { shellAliases = { f = "lfcd"; }; plugins = [ { name = "fish-lf-icons"; src = pkgs.fetchFromGitHub { owner = "joshmedeski"; repo = "fish-lf-icons"; rev = "d1c47b2088e0ffd95766b61d2455514274865b4f"; sha256 = "sha256-6po/PYvq4t0K8Jq5/t5hXPLn80iyl3Ymx2Whme/20kc="; }; } ]; }; }