Jetzt kann man sich mit Fug und Recht fragen, warum noch einen weiteren Ncursesrangerodermidnightodernnnklon, haben wir davon nicht schon mehr als genug?!
Meine knappe Antwort: nein.
lf (oder List Files) ist ein in Go geschriebener Dateimanager für's Terminal, der stark von ranger inspiriert ist. Die Unterschiede sind, dass lf als einzelnes Binary daher kommt und von Haus aus nur die alllergrundlegendsten Funktionen mitbringt, sich aber durch Shellbefehle beliebig erweitern lässt und mittels sehr einfach gehaltener Konfigurationsdateien bzw. Umgebungsvariablen nach den eigenen Vorlieben konfiguriert werden kann:
Nimm lf, wie es ist, blase es auf bis zum Gehtnichtmehr, mach tastaturmäßig auf Vim oder Mc oder bau' genau DAS ein, was du brauchst und kein Fitzelchen mehr...
Mein Dateimanager der Wahl ist die letzten Jahre immer mc gewesen, den habe ich mir ganz persönlich eingerichtet und durchkonfiguriert. Und trotzdem dachte ich immer ich kenne nicht mal die Hälfte der Möglichkeiten und brauche die eigentlich auch gar nichtzu kennen. Ranger war mir zu fett (der zog bei mir immer eine Menge Abhängigkeiten mit) und tatsächlich zu träge, das fiel sogar mir auf, der ich nichts von Programmiersprachen verstehe. nnn hatte ich kurz mal probiert, mit der auf Tabs basierten Navigation wurde ich aber gar nicht warm. Dann stolperte ich in einem Ytvideo über lf. Und vor ein paar Wochen darüber, dass das jetzt in den offiziellen Repos liegt, Freude ohne Ende!
Da das jetzt nur ein Zusatztürchen ist, will ich gar nicht zu ausführlich werden und halte mich (so gut es geht) mit meiner Begeisterung und der Beschreibung des Programms zurück, nur so viel:
* Die Installation geht ab Bookworm "auf offiziellem Wege". Wenn man ein älteres System fährt, dann einfach das Paket von der Debianpaketseite runterladen und via "apt install /pfad/zum/lfpaket.deb" installieren, das funktioniert tadellos - hier unter Bullseye funzt alles.
* Konfiguriert (und funktional erweitert) wird lf zuallererst mit der ~/.config/lf/lfrc. Zusätzlich können Farben und Icons (wenn erwünscht, ich mag Icons nicht im Terminal, sie lenken mich ab) mit ~/.config/lf/colors bzw. ~/.config/lf/icons konfiguriert werden.
* Des weiteren gibt es die (meiner Meinung nach elegantere) Möglichkeit, lf mittels Variablen in zB. der ~/.bashrc zu tunen.
* Die Dokumentation online sowie die Manpage sind einfach nur top und auch im Programm selbst mittels F1 (sofern es das Terminal erlaubt) einfachst zu erreichen.
Mittlerweile arbeite ich nicht mehr "spaltenbasiert" (mc) sondern "startundzielordnerorientiert". Ich muss auch keine (mehr oder weniger) komplizierten Tastenkombinationen mehr ausführen sondern "tippse nur mehr vor mich hin". Keine Handverrenkungen und auch keine unübersichtlichen Menüs mit viel zu vielen Optionen mehr. Und wenn ich eine neue Funktion brauchen sollte, baue ich sie ein oder hau' was anderes raus, sollte ich draufkommen, dass es im täglichen Gebrauch unnötig ist oder öffne (wie vom mc gewohnt) unten eine Kommandozeile und "kläre das".
Zur Illustration hier noch meine ~/.config/lf/lfrc:
Code: Alles auswählen
# █ █▀ █▀▄ ▄▀▀ █ █ ▄▀▀ ██▀ █▀▄ ~/.config/lf/lfrc
# █▄▄ █▀ █▀▄ ▀▄▄ ▀▄█ ▄██ █▄▄ █▀▄ 20221210, 20231117
# ------------ settings
set dircounts
set drawbox
set hidden
set ifs "\n"
set ignorecase
set info size
set preview
set promptfmt "\033[34;1m %d\033[0m\033[1m%f\033[0m"
set selmode dir
set shell sh
set shellopts '-eu'
# title on cd
cmd on-cd &{{
printf "\033]0;$ $PWD\007" > /dev/tty
# printf "\033]0; lf (user): $PWD\007" > /dev/tty
}}
on-cd
# ------------ commands
cmd 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"
}}
cmd details ${{
stat --printf "\n Datei: %n (%F)\n Größe: %s bytes\n Rechte: %A (%a)\n Uid/Gid: %U/%G (%u/%g)\n Erstellung: %w\n Änderung: %y\n Zugriff: %x\n\n" $f | less
}}
cmd diskusage $du -ach -d1 | sort -h | less
cmd fzf-jump ${{
res="$(fdfind -H -c never | fzf --reverse --header='gehe zu')"
if [ -f "$res" ]; then
cmd="select"
elif [ -d "$res" ]; then
cmd="cd"
fi
lf -remote "send $id $cmd \"$res\""
}}
cmd media-eject ${{
udiskie-umount --detach "$f"
}}
cmd laz-open &$@ $fx
cmd newdir ${{
printf "dirname: "
read ans
mkdir $ans
}}
cmd newfile ${{
printf "filename: "
read ans
$EDITOR $ans
}}
cmd open &{{
case $(file --mime-type -Lb $f) in
text/*) lf -remote "send $id \$$EDITOR \$fx";;
*) for f in $fx; do xdg-open $f > /dev/null 2> /dev/null & done;;
esac
}}
cmd print-file ${{
lp $f -o sides=two-sided-long-edge -o cpi=14 -o lpi=7 -o orientation-requested=3
}}
cmd sha-sum ${{
sha256sum "$f" | less
}}
cmd trash %trash-put $fx
cmd trash-empty ${{
trash-empty
}}
cmd trash-list ${{
trash-list | less
}}
cmd trash-undo ${{
trash-restore
}}
cmd unarchive ${{
case "$f" in
*.zip) unzip "$f" ;;
*.tar.gz) tar -xzvf "$f" ;;
*.tar.bz2) tar -xjvf "$f" ;;
*.tar) tar -xvf "$f" ;;
*) echo "Unsupported format" ;;
esac
}}
cmd yank-path $printf '%s' "$fx" | xclip -i -selection clipboard
# ----------- unmapping
map '?'
map "'"
map '"'
map '*'
map <delete>
map b
map c
map d
map e
map f
map G
map gb
map gg
map gh
map h
map i
map I
map j
map k
map l
map m
map n
map o
map p
map t
map u
map ua
map X
map y
map q
# ---------- navigation
map h cd ~
map gb cd ~/dox/bh/2023
map gcc cd ~/.config
map gca cd ~/.config/awesome
map gcb cd ~/.config/bconf
map gcl cd ~/.config/lf
map gcm cd ~/.config/micro
map gcr cd ~/.config/rofi
map gcs cd ~/.config/cmus
map gx cd ~/dox
map gj cd ~/dox/jobs
map gs cd ~/dox/syszeug
map gv cd ~/dox/vlgn
map gz cd ~/dox/zeuch
map gd cd ~/dwn
map gpp cd ~/pix
map gpj cd ~/pix/jobs
map gpg cd ~/pix/garten
map gpd cd ~/pix/dahoam
map gpa cd ~/pix/anuk/fotos
map gm cd /media/sebastian
map gaw cd /usr/share/awesome
map gr cd /
map gh cd ~/dox/hof
map gt cd ~/.local/share/Trash/files
map jj jump-prev
map jk jump-next
# ------------- openers
map <enter> open
map e $$EDITOR "$f"
map l laz-open lazpaint
map v $less "$f"
# ---------- operations
map xx :delete
map <delete> trash
map . set hidden!
map * invert
map ? :doc
map B bulk-rename
map C clear
map c copy
map d details
map E media-eject
map f fzf-jump
map ma set selmode all
map md set selmode dir
map ms %printenv lf_selmode
map nd :newdir
map nf :newfile
map P print-file
map p :paste
map R reload
map r rename
map s diskusage
map S sha-sum
map tte trash-empty
map tl trash-list
map tu trash-undo
map U unselect
map ua unarchive
map X cut
map q :clear; quit
map y yank-path
Code: Alles auswählen
# lf
LF_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=00;35:*.mpg=00;35:*.mpeg=00;35:*.m2v=00;35:*.mkv=00;35:*.webm=00;35:*.webp=00;35:*.ogm=00;35:*.mp4=00;35:*.3gp=00;35:*.m4v=00;35:*.mp4v=00;35:*.vob=00;35:*.qt=00;35:*.nuv=00;35:*.wmv=00;35:*.asf=00;35:*.rm=00;35:*.rmvb=00;35:*.flc=00;35:*.avi=00;35:*.fli=00;35:*.flv=00;35:*.gl=00;35:*.dl=00;35:*.xcf=00;35:*.xwd=00;35:*.yuv=00;35:*.cgm=00;35:*.emf=00;35:*.ogv=00;35:*.ogx=00;35:*.aac=02;36:*.au=02;36:*.flac=02;36:*.m4a=02;36:*.mid=02;36:*.midi=02;36:*.mka=02;36:*.mp3=00;36:*.aax=00;36:*.mpc=02;36:*.ogg=02;36:*.ra=02;36:*.wav=00;36:*.oga=02;36:*.opus=02;36:*.spx=02;36:*.xspf=02;36:*.odt=00;33:*.ods=00;33:*.ott=00;33:*.ots=00;33:*.txt=01;33:*.pdf=02;33';
export LF_COLORS
Zusammengefasst:
Wer von euch einen Dateimanager haben will, der das was IHR wollt kann (und zwar nur DAS), der ist bei lf genau richtig.
Um es mit Michael Ende zu sagen: Tu was du willst.
Und wo sind die Screenshots?!
Na hier:
Und auf der Paketseite von Debian
Das war mein Feiertagskastl, wenn ich auch nur einem (oder auch noch einem anderen) Lust gemacht habe, lf auszuprobieren, freue ich mich schon! Habt eine gute Zeit, wir lesen uns!
PS: Meillo, sorry, aber für dich ist es nichts, zu viel Konfigurieren...
EDIT: 20231125, Konfigurationsdatei an korrigiert