From da9e214ddd8b76d4d056cef6b3eb6cfa17d92d0c Mon Sep 17 00:00:00 2001 From: agryphus Date: Mon, 16 Oct 2023 21:34:34 -0400 Subject: [PATCH] LF config rewrite --- .config/lf/cleaner | 4 +- .config/lf/lfrc | 273 +++++++++++++------------------- .config/lf/previewer | 40 ++--- .config/nixos/configuration.nix | 65 +++++--- 4 files changed, 167 insertions(+), 215 deletions(-) diff --git a/.config/lf/cleaner b/.config/lf/cleaner index be1490c..47acd7e 100755 --- a/.config/lf/cleaner +++ b/.config/lf/cleaner @@ -1,4 +1,4 @@ -#!/bin/sh +#!/usr/bin/env sh -ueberzugpp cmd -s $UB_SOCKET -a remove -i PREVIEW +ueberzug cmd -s $UB_SOCKET -a remove -i PREVIEW diff --git a/.config/lf/lfrc b/.config/lf/lfrc index 91f0d5f..1a530e8 100644 --- a/.config/lf/lfrc +++ b/.config/lf/lfrc @@ -1,105 +1,55 @@ -#!/bin/zsh +#!/usr/bin/env fish +# Not meant to actually be executable in fish, but it looks like lf config +# uses fish syntax, so the shebang helps treesitter highlighting properly -# Basic vars -set shellopts '-eu' +## LF VARS + +set shellopts '-eu' # Treat undefined env vars as errors. Exit upon error. set ifs "\n" set scrolloff 10 -set icons -set period 1 +set icons # Use icons +set period 1 # Poll directory status every X seconds set hiddenfiles ".*:*.aux:*.log:*.bbl:*.bcf:*.blg:*.run.xml" -set cleaner '~/.config/lf/cleaner' -set previewer '~/.config/lf/previewer' +set cleaner '~/.config/lf/cleaner' # Clear preview +set previewer '~/.config/lf/previewer' # Make preview set autoquit true -# Open file in the same window -cmd open ${{ - case $(file --mime-type "$(readlink -f $f)" -b) in - image/vnd.djvu|application/pdf|application/octet-stream|application/postscript) - setsid -f devour zathura $fx >/dev/null 2>&1 ;; - text/*|application/json|inode/x-empty|application/x-subrip) - $EDITOR $fx;; - image/x-xcf) - setsid -f devour gimp $f >/dev/null 2>&1 ;; - image/svg+xml) - display -- $f ;; - image/*) - find . -maxdepth 1 -type f -exec file -i {} \; | - grep -E 'image/.*' | - awk -F: '{ print substr($0, 1, length($0) - length($NF) - 1) }' | - rotdir $f | - setsid -f devour nsxiv -aio 2>/dev/null | while read -r file; do - [ -z "$file" ] && continue - lf -remote "send select \"$file\"" - lf -remote "send toggle" - done & - ;; - audio/*|video/x-ms-asf) - mpv --audio-display=no $f ;; - video/*) - setsid -f mpv $f -quiet >/dev/null 2>&1 ;; - application/pdf|application/vnd.djvu|application/epub*) - setsid -f zathura $fx >/dev/null 2>&1 ;; - application/pgp-encrypted) - $EDITOR $fx ;; - application/vnd.openxmlformats-officedocument.wordprocessingml.document|application/vnd.oasis.opendocument.text|application/vnd.openxmlformats-officedocument.spreadsheetml.sheet|application/octet-stream|application/vnd.oasis.opendocument.spreadsheet|application/vnd.oasis.opendocument.spreadsheet-template|application/vnd.openxmlformats-officedocument.presentationml.presentation|application/vnd.oasis.opendocument.presentation-template|application/vnd.oasis.opendocument.presentation|application/vnd.ms-powerpoint|application/vnd.oasis.opendocument.graphics|application/vnd.oasis.opendocument.graphics-template|application/vnd.oasis.opendocument.formula|application/vnd.oasis.opendocument.database) - setsid -f devour libreoffice $fx >/dev/null 2>&1 ;; - *) - for f in $fx; do setsid -f devour $OPENER $f >/dev/null 2>&1; done;; - esac -}} +## MAPPINGS -# Open file in a new window -cmd open_new_window ${{ - case $(file --mime-type "$(readlink -f $f)" -b) in - application/vnd.openxmlformats-officedocument.spreadsheetml.sheet) - localc $fx ;; - image/vnd.djvu|application/pdf|application/octet-stream|application/postscript) - setsid -f zathura $fx >/dev/null 2>&1 ;; - text/*|application/json|inode/x-empty|application/x-subrip) - $TERMINAL -e $SHELL -c "$EDITOR \"$fx\"" >/dev/null 2>&1 & ;; - image/x-xcf) - setsid -f gimp $f >/dev/null 2>&1 ;; - image/svg+xml) - display -- $f ;; - image/*) - find . -maxdepth 1 -type f -exec file -i {} \; | - grep -E 'image/.*' | - awk -F: '{ print substr($0, 1, length($0) - length($NF) - 1) }' | - rotdir $f | - setsid -f nsxiv -aio 2>/dev/null | while read -r file; do - [ -z "$file" ] && continue - lf -remote "send select \"$file\"" - lf -remote "send toggle" - done & - ;; - audio/*|video/x-ms-asf) - mpv --audio-display=no $f ;; - video/*) - setsid -f mpv $f -quiet >/dev/null 2>&1 ;; - application/pdf|application/vnd.djvu|application/epub*) - setsid -f zathura $fx >/dev/null 2>&1 ;; - application/pgp-encrypted) - $EDITOR $fx ;; - application/vnd.openxmlformats-officedocument.wordprocessingml.document|application/vnd.oasis.opendocument.text|application/vnd.openxmlformats-officedocument.spreadsheetml.sheet|application/octet-stream|application/vnd.oasis.opendocument.spreadsheet|application/vnd.oasis.opendocument.spreadsheet-template|application/vnd.openxmlformats-officedocument.presentationml.presentation|application/vnd.oasis.opendocument.presentation-template|application/vnd.oasis.opendocument.presentation|application/vnd.ms-powerpoint|application/vnd.oasis.opendocument.graphics|application/vnd.oasis.opendocument.graphics-template|application/vnd.oasis.opendocument.formula|application/vnd.oasis.opendocument.database) - setsid -f libreoffice $fx >/dev/null 2>&1 ;; - *) - for f in $fx; do setsid -f $OPENER $f >/dev/null 2>&1; done;; - esac -}} +# LF control mappings +map reload +map set hidden! +map shell + +# Opening commands +map l open +map L open new_window +map o $mimeopen --ask "$f" + +# CRUD commands +map D delete +map N push :mkdir +map n push :touch +map u extract +map Y $printf "%s" "$fx" | xclip -selection clipboard + +# Renaming commands +map A :rename; cmd-end # at the very end +map a :rename; cmd-right # after extension +map c push A # new rename +map i :rename # before extension +map I :rename; cmd-home # at the very beginning + +# Fuzzy finding +map $lf -remote "send $id select \"$(fzf)\"" +map F broot_jump + +## COMMAND DEFINITIONS cmd touch %touch $1 && lf -remote "send $id load" && lf -remote "send $id select $1" cmd mkdir %mkdir $1 && lf -remote "send $id load" && lf -remote "send $id select $1" -cmd extract ${{ - clear; tput cup $(($(tput lines)/3)); tput bold - set -f - printf "%s\n\t" "$fx" - printf "extract?[y/N]" - read ans - [ $ans = "y" ] && aunpack $fx -}} - cmd delete ${{ clear; tput cup $(($(tput lines)/3)); tput bold set -f @@ -109,49 +59,13 @@ cmd delete ${{ [ $ans = "y" ] && rm -rf -- $fx }} -cmd moveto ${{ +cmd extract ${{ clear; tput cup $(($(tput lines)/3)); tput bold set -f - clear; echo "Move to where?" - dest="$(sed -e 's/\s*#.*//' -e '/^$/d' -e 's/^\S*\s*//' ${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-dirs | fzf | sed 's|~|$HOME|')" && - for x in $fx; do - eval mv -iv \"$x\" \"$dest\" - done && - notify-send "🚚 File(s) moved." "File(s) moved to $dest." -}} - -cmd copyto ${{ - clear; tput cup $(($(tput lines)/3)); tput bold - set -f - clear; echo "Copy to where?" - dest="$(sed -e 's/\s*#.*//' -e '/^$/d' -e 's/^\S*\s*//' ${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-dirs | fzf | sed 's|~|$HOME|')" && - for x in $fx; do - eval cp -ivr \"$x\" \"$dest\" - done && - notify-send "📋 File(s) copied." "File(s) copies to $dest." -}} - -cmd setbg "$1" - -cmd bulkrename ${{ - tmpfile_old="$(mktemp)" - tmpfile_new="$(mktemp)" - - [ -n "$fs" ] && fs=$(basename -a $fs) || fs=$(ls) - - echo "$fs" > "$tmpfile_old" - echo "$fs" > "$tmpfile_new" - $EDITOR "$tmpfile_new" - - [ "$(wc -l < "$tmpfile_old")" -eq "$(wc -l < "$tmpfile_new")" ] || { rm -f "$tmpfile_old" "$tmpfile_new"; exit 1; } - - paste "$tmpfile_old" "$tmpfile_new" | while IFS="$(printf '\t')" read -r src dst - do - [ "$src" = "$dst" ] || [ -e "$dst" ] || mv -- "$src" "$dst" - done - - rm -f "$tmpfile_old" "$tmpfile_new" - lf -remote "send $id unselect" + printf "%s\n\t" "$fx" + printf "extract?[y/N]" + read ans + [ $ans = "y" ] && aunpack $fx }} cmd broot_jump ${{ @@ -166,40 +80,69 @@ cmd broot_jump ${{ lf -remote "send $id $cmd \"$res\"" }} -# Bindings -map $lf -remote "send $id select \"$(fzf)\"" -map J $lf -remote "send $id cd $(sed -e 's/\s*#.*//' -e '/^$/d' -e 's/^\S*\s*//' ${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-dirs | fzf)" -map gh -map g top -map D delete -map E extract -map C copyto -map M moveto -map F broot_jump -map n push :touch -map N push :mkdir -map reload -map set hidden! -map shell -map x $$f -map X !$f -map o &mimeopen "$f" -map O $mimeopen --ask "$f" -map L open_new_window +cmd open ${{ + # Set $new_window based on arguments + test ! -z $@ && test "$@" = "new_window" && new_window=1 -map A :rename; cmd-end # at the very end -map c push A # new rename -map I :rename; cmd-home # at the very beginning -map i :rename # before extension -map a :rename; cmd-right # after extension -map B bulkrename -map b $setbg $f + case $(file --mime-type "$(readlink -f $f)" -b) in + application/json|\ + application/x-subrip|\ + application/pgp-encrypted|\ + inode/x-empty|\ + text/*) + test -v new_window \ + && ($TERMINAL -e $SHELL -c "$EDITOR \"$fx\"" >/dev/null 2>&1 &) \ + || ($EDITOR $fx) + ;; + audio/*|video/x-ms-asf) + mpv --audio-display=no $f ;; + video/*) + setsid -f mpv $f -quiet >/dev/null 2>&1 ;; + application/epub*|\ + application/octet-stream|\ + application/pdf|\ + application/postscript|\ + application/vnd.djvu|\ + image/vnd.djvu) + setsid -f $(test ! -v new_window && echo devour) zathura $fx >/dev/null 2>&1 + ;; + image/*) + find . -maxdepth 1 -type f -exec file -i {} \; | + grep -E 'image/.*' | + awk -F: '{ print substr($0, 1, length($0) - length($NF) - 1) }' | + rotdir $f | + setsid -f $(test ! -v new_window && echo devour) nsxiv -aio 2>/dev/null | + while read -r file; do + [ -z "$file" ] && continue + lf -remote "send select \"$file\"" + lf -remote "send toggle" + done & + ;; + application/octet-stream|\ + application/vnd.ms-powerpoint|\ + application/vnd.oasis.opendocument.database|\ + application/vnd.oasis.opendocument.formula|\ + application/vnd.oasis.opendocument.graphics|\ + application/vnd.oasis.opendocument.graphics-template|\ + application/vnd.oasis.opendocument.presentation|\ + application/vnd.oasis.opendocument.presentation-template|\ + application/vnd.oasis.opendocument.spreadsheet|\ + application/vnd.oasis.opendocument.spreadsheet-template|\ + application/vnd.oasis.opendocument.text|\ + application/vnd.openxmlformats-officedocument.presentationml.presentation|\ + application/vnd.openxmlformats-officedocument.spreadsheetml.sheet|\ + application/vnd.openxmlformats-officedocument.wordprocessingml.document) + setsid -f $(test ! -v new_window && echo devour) libreoffice $fx >/dev/null 2>&1 + ;; + *) + # test -v new_window \ + # && () \ + # || () + ;; + esac +}} -map down -map up -map V push :!nvim - -map W $setsid -f $TERMINAL >/dev/null 2>&1 - -map Y $printf "%s" "$fx" | xclip -selection clipboard +cmd open_new_window ${{ + new_window=1 && cmd open +}} diff --git a/.config/lf/previewer b/.config/lf/previewer index 0a339ac..416fe9f 100755 --- a/.config/lf/previewer +++ b/.config/lf/previewer @@ -1,4 +1,4 @@ -#!/bin/sh +#!/usr/bin/env sh image() { FILE_PATH="$1" @@ -13,32 +13,25 @@ image() { Y="$LF_OVERRIDE_Y" fi - ueberzugpp cmd -s "$UB_SOCKET" -a add -i PREVIEW -x "$X" -y "$Y" --max-width "$MW" --max-height "$MH" -f "$FILE_PATH" + ueberzug cmd -s "$UB_SOCKET" -a add -i PREVIEW -x "$X" -y "$Y" --max-width "$MW" --max-height "$MH" -f "$FILE_PATH" exit 1 } -batorcat() { - file="$1" - shift - if command -v bat >/dev/null 2>&1; then - bat --color=always --style=plain --pager=never "$file" "$@" - else - cat "$file" - fi -} - CACHE="$HOME/.cache/lf/thumbnail.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | awk '{print $1}'))" case "$(file --dereference --brief --mime-type -- "$1")" in image/*) image "$1" "$2" "$3" "$4" "$5" "$1" ;; - # text/html) lynx -width="$4" -display_charset=utf-8 -dump "$1" ;; - # text/troff) man ./ "$1" | col -b ;; - text/* | */xml | application/json) + application/json|\ + text/*|\ + */xml) bat -p --terminal-width "$(($4-2))" -f "$1" ;; - audio/* | application/octet-stream) mediainfo "$1" || exit 1 ;; + audio/*|\ + application/octet-stream) + mediainfo "$1" || exit 1 + ;; video/* ) CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/lf/thumb.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | cut -d' ' -f1)" [ ! -f "$CACHE" ] && ffmpegthumbnailer -i "$1" -o "$CACHE" -s 0 @@ -49,16 +42,15 @@ case "$(file --dereference --brief --mime-type -- "$1")" in [ ! -f "$CACHE.jpg" ] && pdftoppm -jpeg -f 1 -singlefile "$1" "$CACHE" image "$CACHE.jpg" "$2" "$3" "$4" "$5" "$1" ;; - # */epub+zip|*/mobi*) - # CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/lf/thumb.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | cut -d' ' -f1)" - # [ ! -f "$CACHE.jpg" ] && gnome-epub-thumbnailer "$1" "$CACHE.jpg" - # image "$CACHE.jpg" "$2" "$3" "$4" "$5" "$1" - # ;; - application/*zip) atool --list -- "$1" ;; - # *opendocument*) odt2txt "$1" ;; + application/*zip) + atool --list -- "$1" + ;; + *opendocument*) + odt2txt "$1" + ;; application/pgp-encrypted) gpg -d -- "$1" ;; *) - file -ibL "$1" | grep -q text && batorcat "$1" || file -Lb "$1" + file -ibL "$1" | grep -q text && cat "$1" || file -Lb "$1" ;; esac diff --git a/.config/nixos/configuration.nix b/.config/nixos/configuration.nix index a7f769e..1aa2cff 100644 --- a/.config/nixos/configuration.nix +++ b/.config/nixos/configuration.nix @@ -119,54 +119,71 @@ # List packages installed in system profile. To search, run: # $ nix search wget environment.systemPackages = with pkgs; [ - # General programs that I use - bat # Fancy `cat` which I use for lf + # General programs that I like and use devour # Opens new program on top of terminal dunst # Notification daemon + dwmblocks # Suckless statusbar for DWM + dwm # Suckless tiling window manager feh # Image viewer I use for background setting + firefox # My browser of choice git # Imagine not having this htop # Process monitor killall # Easy way to kill a process - lf # File explorer + libreoffice # MSOffice btfo neofetch # Aesthetic sysinfo - neovim # Editor - nsxiv # Image viewer. Would replace `feh` if it could set backgrounds. pass-nodmenu # CLI password store (without dmenu dependency) picom # X Compositor pinentry-curses # Terminal-based pinentry program pinentry-rofi # Rofi frontend for pinentry program rofi # Menu prompt program rofi-pass # Rofi frontend for password store + st # Suckless terminal sxhkd # Hotkey daemon syncthing # Syncing files between machines texlive.combined.scheme-full # LaTeX to create documents tmux # Terminal multiplexor typst # Cool, minimal LaTeX alternative - ueberzugpp # Terminal image overlayer - zathura # Pdf editor + ungoogled-chromium # If I need a special chrome feature zsh # Shell zsh-syntax-highlighting # Shell syntax highlighting - # Suckless utils - dwm - dwmblocks - st - - # Big programs - firefox - libreoffice - - # Silly programs - sl - asciiquarium - neo-cowsay - - # Dependencies for other programs (neovim packages, x, etc) - nodejs - ripgrep + # Neovim and neovim accessories + neovim # Editor + ### + nodejs # Used by Mason to pull deps + ripgrep # Used by telescope gcc unzip + + # lf and lf accessories + # There might be some repeats is here from elsewhere in this file, but I simply want to + # enumerate everything my config of lf depends on. No, I'm not using home-manager (for now) + lf # File explorer + ### + atool # Provides aunpack, to open archives. Also can list archive contents. + bat # A prettified 'cat' + broot # A slicker fzf + ffmpegthumbnailer # Get thumbnails of videos + file # Get information about a specific file + fzf # Fuzzy finder. Might fully replace with broot + mediainfo # Get info about media + mpv # Audio and video player + nsxiv # Image viewer + odt2txt # Convert open documents to text + perl536Packages.FileMimeInfo # Provides mimeopen, to ask what program to open files in + poppler_utils # Provides pdftoppm, to turn pdfs into images + ueberzugpp # Terminal image overlayer + xclip # Copy file name to clip + zathura # PDF viewer + + # X accessories xorg.xauth + xclip + + # Silly programs + sl # Choo choo + asciiquarium # Good to throw on an extra monitor + neo-cowsay # The cow says moo # Some nix specific stuff nix-index