Hát kérem az imádott lf fájlkezelő lett az első versenyző, aki megérte a harmadik felvonást, nagy taps! Ilyen az, mikor a fafaragónak az égig érő fát adod oda, amit aztán farigcsálhat élete végéig...!
No, ezután a kissé elérzékenyülős bevezető után, nézzük mi változott!

- Először is óriási munkába kezdtem, az összes terminálos fájlkezelőnél, amiket használok (lf, vifm, yazi, stb,) igyekszem egységesíteni a kezelést, természetesen az lf is átesett egy ilyen kúrán, és ehhez kapcsolódóan a konfiguráció teljes strukturális átszervezésen esett át, ami szerintem sokkal átláthatóbb.
- Kitty terminálon visszakerült a teljes értékű képelőnézet (könnyen átszabható a protokolt támogató egyéb terminálokra), természetesen a chafa és a timg is megmaradt menekülő útnak.
- Bekerült egy megnyitás adott programmal opció, 'O' aztán pötyögjük a program nevét.
- Szintén új funkció, hogy lekérhetjük a kijelölt fájlok/könyvtárak lemezen foglalt méretét, és összegzést is kérhetünk erről (u/U).
- Bekerült egy könyvtárfa nézet funkció is.
- A vágólap már működik automatikusan X11 és Wayland környezetben is (természetesen a segédprogramokat telepíteni kell, ahogy a többi funkcióhoz is).
- A végleges törléskor biztonsági kérdést kapunk.
- Link létrehozása konkrét névvel.
- Korábban a .-kezdetű (rejtett) fájlok a vim-ben nyíltak meg, akkor is, ha pl. esetleg képfájl volt, ezt most már ellenőrizzük.
- Több apró hiba javításra került (pl. fzf integráció még mindig döcögött, remélhetőleg most már jó)...
Nézzük a konkrét konfigurációs állományokat!
~/.config/lf/lfrc:
# =========================
# ALAP BEÁLLÍTÁSOK
# =========================
set shell sh
set shellopts '-eu'
set hidden true
set number true
set cursorpreviewfmt "\033[7m"
set icons true
set drawbox true
set ignorecase true
set smartcase true
set incsearch true
set preview true
set info size:time
set ratios 1:2:3
set mouse true
set previewer ~/.config/lf/preview
set cleaner ~/.config/lf/cleaner
set scrolloff 3
set period 1
set incfilter true
set wrapscan true
set anchorfind true
set findlen 0
# =========================
# BILLENTYŰPARANCSOK
# =========================
#
# q, Q kilépés
# <enter> megnyitás (alapértelmezett program)
# o megnyitás (alapértelmezett program)
# O megnyitás adott programmal
# <f-3> megnyitás most programmal
# <f-4> megnyitás vim-ben
# c kijelölések törlése
# a kijelölések megfordítása
#
# y másolás (lf vágólap)
# d kukába helyezés (trash-put)
# x kivágás (lf vágólap)
# p, <f-9> beillesztés (lf vágólap)
# P felülírás / felülírás kérdés nélkül
# Y útvonal másolása rendszer vágólapra
#
# <space> kijelölés + léptetés le
# <f-5> másolás (lf vágólap)
# <f-6> kivágás (lf vágólap)
# <f-7> új könyvtár létrehozása
# <f-8>, D végleges törlés (rákérdezés)
# <delete> végleges törlés (rákérdezés)
# <f-2>, r átnevezés
# R tömeges átnevezés
# E archívum kibontása
# Z zip archívum létrehozása
# L szimbolikus link létrehozása
# T könyvtárfa (tree -L 2)
#
# gh ugrás ~ (home)
# gp ugrás ~/Pontfájlok/
# gc ugrás ~/.config/
# gd ugrás ~/Dokumentumok
# gD ugrás ~/Letöltések
# g/ ugrás /
# g- ugrás az előző könyvtárba
#
# <c-u> fél oldal fel
# <c-d> fél oldal le
# . rejtett fájlok mutatása / elrejtése
# zf szűrő (filter) — csak az egyező fájlokat mutatja
# zp előnézet ki/be
# u méretret a lemezen
# U fájlok teljes mérete
#
# sn rendezés: név szerint
# ss rendezés: méret szerint
# st rendezés: idő szerint
#
# F fzf kereső
# C lfrc újratöltése
map q quit
map Q quit
map <enter> open
map o open
map O openwith
map <f-3> $most "$f"
map <f-4> $vim "$f"
map c unselect
map a invert
map y copy
map d trash
map x cut
map p paste
map <f-9> paste
map P overwrite
map Y clip
map <space> toggle;down
map <f-5> copy
map <f-6> cut
map <f-7> push %mkdir<space>
map <f-8> delete-confirm
map D delete-confirm
map <delete> delete-confirm
map <f-2> rename
map r rename
map R bulkrename
map E extract
map Z zip
map L link
map T tree
map gh cd ~
map gp cd ~/Pontfájlok/
map gc cd ~/.config/
map gd cd ~/Dokumentumok
map gD cd ~/Letöltések
map g/ cd /
map g- cd -
map <c-u> half-up
map <c-d> half-down
map . set hidden!
map zf filter
map zp set preview!
map u du
map U dus
map sn set sortby natural
map ss set sortby size
map st set sortby time
map F fzf
map C source ~/.config/lf/lfrc
# =========================
# PARANCSOK
# =========================
# --- megnyitás ---
cmd open ${{
mime="$(file --mime-type -Lb -- "$f")"
case "$(basename "$f")" in
*.md)
if command -v apostrophe >/dev/null 2>&1; then
apostrophe "$f" >/dev/null 2>&1 &
else
"${EDITOR:-vim}" "$f"
fi
;;
*.png|*.jpg|*.jpeg|*.gif|*.webp)
if command -v imv-dir >/dev/null 2>&1; then
imv-dir "$f" >/dev/null 2>&1 &
elif command -v imv >/dev/null 2>&1; then
imv "$f" >/dev/null 2>&1 &
else
xdg-open "$f" >/dev/null 2>&1 &
fi
;;
*.mp4|*.mkv|*.webm|*.avi|*.mp3|*.flac|*.ogg)
if command -v mpv >/dev/null 2>&1; then
mpv "$f" >/dev/null 2>&1 &
else
xdg-open "$f" >/dev/null 2>&1 &
fi
;;
*.pdf)
if command -v zathura >/dev/null 2>&1; then
zathura "$f" >/dev/null 2>&1 &
else
xdg-open "$f" >/dev/null 2>&1 &
fi
;;
*.html)
xdg-open "$f" >/dev/null 2>&1 &
;;
.*)
case "$mime" in
text/*|*/xml|application/json)
"${EDITOR:-vim}" "$f"
;;
*)
xdg-open "$f" >/dev/null 2>&1 &
;;
esac
;;
*)
case "$mime" in
text/*|*/xml|application/json)
"${EDITOR:-vim}" "$f"
;;
*)
xdg-open "$f" >/dev/null 2>&1 &
;;
esac
;;
esac
}}
cmd openwith ${{
printf "Program neve: "
read prog
[ -n "$prog" ] || exit 1
nohup $prog "$f" >/dev/null 2>&1 &
}}
# --- fájlműveletek ---
cmd trash ${{
if command -v trash-put >/dev/null 2>&1; then
trash-put "$fx"
else
printf '%s\n' "A trash-put nem érhető el."
fi
}}
cmd delete-confirm ${{
printf "Végleges törlés — biztos? (i/n) "
read ans
[ "$ans" = "i" ] || exit 0
printf '%s\n' "$fx" | while IFS= read -r f; do
[ -n "$f" ] && rm -r -- "$f"
done
lf -remote "send $id reload"
}}
cmd overwrite ${{
filelist="$HOME/.local/share/lf/files"
[ -f "$filelist" ] || exit 1
mode="$(head -n 1 "$filelist" 2>/dev/null || true)"
tail -n +2 "$filelist" 2>/dev/null | while IFS= read -r file; do
[ -n "$file" ] || continue
case "$mode" in
copy) rsync -a -- "$file" ./ ;;
move) rsync -a --remove-source-files -- "$file" ./ ;;
esac
done
lf -remote "send $id load"
lf -remote "send $id echo done"
}}
# --- átnevezés ---
cmd bulkrename ${{
old="$(mktemp)"
new="$(mktemp)"
if [ -n "$fs" ]; then
printf '%s\n' "$fs" | while IFS= read -r f; do
basename "$f"
done > "$old"
else
find . -maxdepth 1 -mindepth 1 -printf '%P\n' 2>/dev/null > "$old" || ls -A1 > "$old"
fi
cp "$old" "$new"
"${EDITOR:-vim}" "$new"
[ "$(wc -l < "$old")" -ne "$(wc -l < "$new")" ] && {
rm -f "$old" "$new"
exit 1
}
paste "$old" "$new" |
while IFS="$(printf '\t')" read -r src dst; do
[ "$src" = "$dst" ] && continue
[ -e "$dst" ] && continue
mv -- "$src" "$dst"
done
rm -f "$old" "$new"
lf -remote "send $id reload"
}}
# --- archívumok ---
cmd extract ${{
case "$f" in
*.tar.bz2) tar xjf "$f" ;;
*.tar.gz) tar xzf "$f" ;;
*.tar.xz) tar xJf "$f" ;;
*.tar.zst) tar --zstd -xf "$f" ;;
*.bz2) bunzip2 "$f" ;;
*.rar) unar "$f" ;;
*.gz) gunzip "$f" ;;
*.tar) tar xf "$f" ;;
*.tbz2) tar xjf "$f" ;;
*.tgz) tar xzf "$f" ;;
*.zip) unzip "$f" ;;
*.7z) 7z x "$f" ;;
*) printf '%s\n' "Nem támogatott archívum: $f" ;;
esac
}}
cmd zip ${{
printf "Archívum neve: "
read ans
[ -n "$ans" ] || exit 1
printf '%s\n' "$fx" | zip -r "$ans.zip" -@
}}
# --- keresés ---
cmd fzf ${{
file="$(
if command -v fd >/dev/null 2>&1; then
fd --hidden --exclude .git . 2>/dev/null
elif command -v fdfind >/dev/null 2>&1; then
fdfind --hidden --exclude .git . 2>/dev/null
else
find . -path '*/.git' -prune -o -print 2>/dev/null
fi |
fzf --preview '
if [ -d {} ]; then
if command -v eza >/dev/null 2>&1; then
eza -la --group-directories-first -- {}
else
ls -la -- {}
fi
else
if command -v bat >/dev/null 2>&1; then
bat --color=always --style=numbers,changes --line-range :200 -- {}
elif command -v batcat >/dev/null 2>&1; then
batcat --color=always --style=numbers,changes --line-range :200 -- {}
else
sed -n "1,200p" -- {}
fi
fi
'
)"
if [ -n "$file" ]; then
lf -remote "send $id cd \"$(dirname "$file")\""
lf -remote "send $id select \"$(basename "$file")\""
fi
}}
# --- egyéb ---
cmd clip ${{
if command -v wl-copy >/dev/null 2>&1; then
printf '%s\n' "$fx" | wl-copy
elif command -v xclip >/dev/null 2>&1; then
printf '%s\n' "$fx" | xclip -selection clipboard
elif command -v xsel >/dev/null 2>&1; then
printf '%s\n' "$fx" | xsel --clipboard --input
else
printf '%s\n' "Nincs clipboard eszköz (wl-copy/xclip/xsel)."
fi
}}
# $ prefix: kilép az lf-ből, lefuttatja a parancsot, visszalép
# less-sel a kimenet addig látható, amíg q-val ki nem lépsz
# $fx = újsorokkal elválasztott kijelölt fájlok; végén awk számolja az összesítést
cmd du $printf '%s\n' "$fx" | while IFS= read -r file; do du -sh -- "$file"; done | less
cmd du $printf '%s\n' "$fx" | while IFS= read -r file; do du -sh -- "$file"; done; echo; echo "=== ÖSSZESEN ==="; printf '%s\n' "$fx" | while IFS= read -r file; do du -sk -- "$file"; done | awk '{s+=$1} END {if(s>=1048576) printf "%.2fG\n", s/1048576; else if(s>=1024) printf "%.2fM\n", s/1024; else printf "%dK\n", s}' | less
# könyvtárfa: ha könyvtáron állunk, azt mutatja; ha fájlon, a szülőkönyvtárat
cmd tree $tree -L 2 -- "$(if [ -d "$f" ]; then printf '%s' "$f"; else dirname "$f"; fi)" | less
# szimbolikus link: megkérdezi a nevet, az aktuális könyvtárban hozza létre
cmd link ${{
printf "Link neve: "
read name
[ -n "$name" ] || exit 1
ln -s -- "$f" "$name"
lf -remote "send $id reload"
}} ~/.config/lf/preview:
#!/bin/sh
set -eu
file="${1:-}"
w="${2:-80}"
h="${3:-24}"
x="${4:-0}"
y="${5:-0}"
[ -n "$file" ] || exit 1
[ -e "$file" ] || exit 1
mime="$(file --mime-type -Lb -- "$file" 2>/dev/null || printf '%s' application/octet-stream)"
cache="${XDG_CACHE_HOME:-$HOME/.cache}/lf-preview"
mkdir -p -- "$cache"
find "$cache" -type f -mtime +30 -delete 2>/dev/null || true
have() { command -v "$1" >/dev/null 2>&1; }
hash_of() {
if have sha256sum; then
printf '%s' "$1" | sha256sum | awk '{print $1}'
elif have md5sum; then
printf '%s' "$1" | md5sum | awk '{print $1}'
else
printf '%s' "$1" | cksum | awk '{print $1}'
fi
}
preview_image() {
if [ -n "${KITTY_WINDOW_ID:-}" ] && have kitty; then
kitty +kitten icat --silent --stdin no --transfer-mode file \
--place "${w}x${h}@${x}x${y}" -- "$1" </dev/null >/dev/tty
exit 1
elif have timg; then
timg -g "${w}x${h}" -- "$1"
elif have chafa; then
chafa --format symbols --symbols block+border --fill block --size "${w}x${h}" -- "$1"
else
file -- "$1"
fi
}
preview_text() {
if have bat; then
bat --color=always --style=numbers,changes --line-range :250 --paging=never -- "$1"
elif have batcat; then
batcat --color=always --style=numbers,changes --line-range :250 --paging=never -- "$1"
else
sed -n '1,250p' -- "$1"
fi
}
preview_meta() {
if have exiftool; then
exiftool -a -G1 -- "$1" 2>/dev/null | sed -n '1,120p'
else
file -- "$1"
fi
}
case "$mime" in
image/*)
preview_image "$file"
;;
video/*)
thumb="$cache/$(hash_of "$file").jpg"
if [ ! -f "$thumb" ] && have ffmpegthumbnailer; then
ffmpegthumbnailer -i "$file" -o "$thumb" -s 0 >/dev/null 2>&1 || true
fi
[ -f "$thumb" ] && preview_image "$thumb" || preview_meta "$file"
;;
audio/*)
preview_meta "$file"
;;
application/pdf)
if have pdftotext; then
pdftotext -l 8 -- "$file" - 2>/dev/null | {
if have bat; then
bat --language=txt --style=plain --color=always --paging=never
elif have batcat; then
batcat --language=txt --style=plain --color=always --paging=never
else
cat
fi
}
else
preview_meta "$file"
fi
;;
text/*|application/json|application/xml|*/xml|inode/x-empty)
preview_text "$file"
;;
application/zip|application/x-tar|application/gzip|application/x-bzip2|application/x-7z-compressed)
if have bsdtar; then
bsdtar -tf -- "$file" | sed -n '1,200p'
elif have tar; then
case "$mime" in
application/x-tar) tar -tf -- "$file" | sed -n '1,200p' ;;
application/gzip) tar -tzf -- "$file" | sed -n '1,200p' ;;
application/x-bzip2) tar -tjf -- "$file" | sed -n '1,200p' ;;
*) file -- "$file" ;;
esac
elif have unzip && [ "${file##*.}" = "zip" ]; then
unzip -l -- "$file" | sed -n '1,200p'
else
file -- "$file"
fi
;;
inode/directory)
if have eza; then
eza -la --group-directories-first -- "$file" | sed -n '1,200p'
else
ls -la -- "$file"
fi
;;
*)
preview_meta "$file"
;;
esac~/.config/lf/cleaner:
#!/bin/sh
if [ -n "${KITTY_WINDOW_ID:-}" ] && command -v kitty >/dev/null 2>&1; then
kitty +kitten icat --clear --stdin no --silent --transfer-mode file </dev/null >/dev/tty
elif command -v timg >/dev/null 2>&1; then
timg --clear
fiNincsenek jó híreim, még mindig akadnak ötleteim, szal lehet még foglak a témával kínozni benneteket!
Előző felvonás: https://linuxmint.hu/blog/2026/05/lf-masodik-felvonas
Berus

Hozzászólások
Ez egy nagyon jó kis program!
Beküldte balacy -
Értékelés:
Akinek egy terminálos, jól konfigurálható fájlkezelő kell és van valami ellenérzése a ranger-rel szemben, neki ez jó lehet. Én tartaléknak használom a ranger mellé, ha valami probléma merülne fel a rangerrel kapcsolatban, akkor legyen egy B terv is. Érdemes valami előrekonfiguráltat keresni, mert sok macerától megóvja az embert, ha be van állítva egypár plusz. Akár az itt közreadott konfigokat is át lehet venni, és alapnak, mintának használni.
Aki szeret bütykölni és
Beküldte berus -
Értékelés:
Aki szeret bütykölni és fontos hogy a fájlkezelője azt tudja, ami neki lényeges, annak az lf páratlan! Aki nem, az tényleg használ valakitől átvett konfigot, ahogy írod, vagy választ a konkurenciából, amiket lényegesen kevesebb melóval meg lehet úszni, ranger, yazi, elio, joshuto...