Files
dotfiles/programs/lf/default.nix
Sebastian Moser 5bf6a5da5e fixed lf previewer
2025-03-04 20:25:48 +01:00

191 lines
5.1 KiB
Nix

{ pkgs, self, confDir, system, inputs, ... }@params:
{
home.file.".config/lf/icons".source = "${self}/programs/lf/icons";
programs.lf = let
myUeberzug = pkgs.ueberzugpp.overrideAttrs (prev: {
src = pkgs.fetchFromGitHub {
owner = "jstkdng";
repo = "ueberzugpp";
rev = "528fb0fd6719477308e779aa6dab6040faa698cc";
hash = "sha256-VdfpWJOMlC4Ly2lDFvJ+BnOmaM71gLEaIkfwLqzAi/8=";
};
cmakeFlags = prev.cmakeFlags or [] ++ [ "-DENABLE_SWAY=ON" ];
});
mylf = pkgs.lf.overrideAttrs (final: prev: {
patches = (prev.patches or [ ]) ++ [
./lf-filter.patch
];
checkPhase = "";
});
myCleaner = pkgs.writeShellApplication {
name = "myCleaner";
runtimeInputs = with pkgs; [ myUeberzug ];
text = ''
ueberzugpp cmd -s "$UB_SOCKET" -a remove -i PREVIEW
UB_PID=$(cat "$UB_PID_FILE")
kill "$UB_PID"
'';
};
myPreviewer = pkgs.writeShellApplication {
name = "myPreviewer";
runtimeInputs = with pkgs; [
file
gnumeric
catdoc
odt2txt
transmission_4
libcdio
p7zip
unrar
xz
bat # (text)
exiftool
ffmpegthumbnailer
myUeberzug # (images, videos, pdf, fonts)
ffmpegthumbnailer # (videos)
exiftool # (metadata/audio, and file detection for .webm files)
jq # (json and metadata)
lynx # (html/web pages)
poppler_utils # pdftoppm # (pdf)
odt2txt # (odt)
imagemagick # convert from imagemagick (fonts)
atool # (archives)
gnupg # (PGP encrypted files)
man # (troff manuals)
coreutils #busybox # other
];
text = builtins.readFile "${self}/programs/lf/previewer";
};
mylfWrapper = pkgs.writeShellApplication {
name = "lf";
runtimeInputs = with pkgs; [ mylf myUeberzug util-linux ];
text = ''
# This is a wrapper script for lf that allows it to create image previews with
# ueberzug. This works in concert with the lf configuration file and the
# lf-cleaner script.
set -e
set +o nounset
UB_PID=0
UB_SOCKET=""
case "$(uname -a)" in
*Darwin*) UEBERZUG_TMP_DIR="$TMPDIR" ;;
*) UEBERZUG_TMP_DIR="/tmp" ;;
esac
if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]; then
${mylf}/bin/lf "$@"
else
[ ! -d "$HOME/.cache/lf" ] && mkdir -p "$HOME/.cache/lf"
UB_PID_FILE="$UEBERZUG_TMP_DIR/.$(uuidgen)"
ueberzugpp layer --silent --no-stdin --use-escape-codes --pid-file "$UB_PID_FILE"
UB_PID=$(cat "$UB_PID_FILE")
UB_SOCKET="$UEBERZUG_TMP_DIR/ueberzugpp-''${UB_PID}.socket"
export UB_PID UB_SOCKET
${mylf}/bin/lf "$@"
fi
'';
};
in
{
package = mylfWrapper // { inherit myUeberzug; };
enable = true;
commands = {
dragon-out = ''%${pkgs.xdragon}/bin/xdragon -a -x "$fx"'';
editor-open = ''$$EDITOR $f'';
mkdir = ''
''${{
printf "Directory Name: "
read DIR
mkdir $DIR
}}
'';
nav = ''
%{{${pkgs.python3}/bin/python3 ${confDir}/scripts/nav/main.py --mode lf}}
'';
nav-home = ''
%{{
${pkgs.python3}/bin/python3 ${confDir}/scripts/nav/main.py --mode lf --char H
}}
'';
nav-work = ''
%{{
${pkgs.python3}/bin/python3 ${confDir}/scripts/nav/main.py --mode lf --char W
}}
'';
};
settings = {
icons = true;
drawbox = true;
};
keybindings = {
# sort by time
mt = ":set sortby time; set info time; set reverse";
# sort normally
ms = ":set sortby natural; set info; set reverse!";
F = "setfilter";
P = "%pwd";
W = "nav-work";
H = "nav-home";
n = "nav";
"." = "set hidden!";
"<enter>" = "open";
do = "dragon-out";
"gh" = "cd";
"g/" = "/";
ee = "editor-open";
V = ''$${pkgs.bat}/bin/bat --paging=always --theme=gruvbox "$f"'';
};
extraConfig = ''
%test $LF_LEVEL -eq 1 || >&2 printf "Warning: You're in a nested lf instance!"
# export pid and ppid
''${{
myPID=$(ps -j | grep lf | tail -n 1 | awk '{print $1}')
myPGID=$(ps -j | grep lf | tail -n 1 | awk '{print $2}')
lf -remote "send $id set user_pid $myPID"
lf -remote "send $id set user_pgid $myPGID"
}}
source ${self}/programs/lf/opener
set cleaner "${myCleaner}/bin/myCleaner"
set cursorpreviewfmt "\033[7m"
set previewer "${myPreviewer}/bin/myPreviewer"
set period "1"
#set promptfmt "
#\033[48;2;35;38;39;38;2;28;220;156m
#\033[38;2;35;38;39;48;2;202;31;31m
#\033[38;2;202;31;31;48;2;40;47;62m
#\033[38;2;255;255;255m %w
#\033[38;2;40;47;62;48;2;58;67;89m
#\033[38;2;255;255;255m %f
#\033[;38;2;58;67;89;49m\033[m"
set timefmt "2023-11-28 15:04:05 "
set waitmsg "\033[1;31m\033[m"
set tabstop 4
set shellopts "-eu"
set ifs "\n"
set shell "bash"
#set ruler "df:acc:progress:selection:filter:ind"
'';
};
}