nix-system/home/lf.nix
ant c3ba849207
Some checks failed
/ build-all (push) Has been cancelled
restore lfcd fish function that was removed by mistake
2025-10-30 21:11:04 +01:00

224 lines
5.8 KiB
Nix

{ 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";
"<space>" = ":toggle; down; save-select";
u = ":unselect; save-select";
v = ":invert; save-select";
"<tab>" = "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=";
};
}
];
};
}