diff options
| author | Mike Vink <mike@pionative.com> | 2024-02-25 11:08:54 +0100 |
|---|---|---|
| committer | Mike Vink <mike@pionative.com> | 2024-02-25 11:08:54 +0100 |
| commit | 1a45bc736bead8086eed5f3cf140102e8953e7e3 (patch) | |
| tree | f0b0f549d377b2fa7b608cdce8d0a7dea9e95f30 /mut | |
| parent | 459ed2af20335c25fe02abf25d33d9d43634f44a (diff) | |
remote
Diffstat (limited to 'mut')
| -rwxr-xr-x | mut/bin/lfub | 2 | ||||
| -rwxr-xr-x | mut/bin/vremote | 14 | ||||
| -rw-r--r-- | mut/lf/lfrc | 171 | ||||
| -rw-r--r-- | mut/lf/scope | 57 | ||||
| -rw-r--r-- | mut/neovim/fnl/conf/events.fnl | 53 | ||||
| -rw-r--r-- | mut/neovim/fnl/conf/init.fnl | 10 |
6 files changed, 291 insertions, 16 deletions
diff --git a/mut/bin/lfub b/mut/bin/lfub index 9012f50..d04a129 100755 --- a/mut/bin/lfub +++ b/mut/bin/lfub @@ -19,6 +19,6 @@ else mkfifo "$FIFO_UEBERZUG" ueberzug layer -s <"$FIFO_UEBERZUG" -p json & exec 3>"$FIFO_UEBERZUG" - trap cleanup HUP INT QUIT TERM PWR EXIT + trap cleanup HUP INT QUIT TERM EXIT lf "$@" 3>&- fi diff --git a/mut/bin/vremote b/mut/bin/vremote new file mode 100755 index 0000000..6db06eb --- /dev/null +++ b/mut/bin/vremote @@ -0,0 +1,14 @@ +#!/bin/bash +server_pipe="$XDG_CACHE_HOME/nvim/server.pipe" +if ! [ -e "$server_pipe" ]; then + nohup nvim --listen "$server_pipe" --headless >/dev/null 2>&1 & +fi + +if nvim --headless --server ~/.cache/nvim/server.pipe --remote-expr 'luaeval("vim.json.encode(vim.iter(vim.api.nvim_list_uis()):map(function(v) return v.chan end):totable())")' | jq -r '.[]' | while read -r chan; do + echo "already existing ui($chan)..." + exit 1 +done +then + nvim --server "$server_pipe" --remote "${@}" + exec nvim --server "$server_pipe" --remote-ui +fi diff --git a/mut/lf/lfrc b/mut/lf/lfrc new file mode 100644 index 0000000..cca28fd --- /dev/null +++ b/mut/lf/lfrc @@ -0,0 +1,171 @@ +# Luke's lf settings + + +# Note on Image Previews +# For those wanting image previews, like this system, there are four steps to +# set it up. These are done automatically for LARBS users, but I will state +# them here for others doing it manually. +# +# 1. ueberzug must be installed. +# 2. The scope file (~/.config/lf/scope for me), must have a command similar to +# mine to generate ueberzug images. +# 3. A `set cleaner` line as below is a cleaner script. +# 4. lf should be started through a wrapper script (~/.local/bin/lfub for me) +# that creates the environment for ueberzug. This command can be be aliased +# in your shellrc (`alias lf="lfub") or if set to a binding, should be +# called directly instead of normal lf. + +# Basic vars +set shellopts '-eu' +set ifs "\n" +set scrolloff 10 +set icons +set period 1 +set hiddenfiles ".*:*.aux:*.log:*.bbl:*.bcf:*.blg:*.run.xml" +set cleaner '~/.config/lf/cleaner' +set previewer '~/.config/lf/scope' +set autoquit true + +cmd z %{{ + result="$(zoxide query --exclude "${PWD}" -- "$0")" + lf -remote "send ${id} cd '${result}'" +}} +map z push :z<space> + +# cmds/functions +cmd open ${{ + 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) $EDITOR $fx;; + image/x-xcf) setsid -f gimp $f >/dev/null 2>&1 ;; + image/svg+xml) display -- $f ;; + image/*) rotdir $f | grep -i "\.\(png\|jpg\|jpeg\|gif\|webp\|avif\|tif\|ico\)\(_large\)*$" | + 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 +}} + +cmd mkdir $mkdir -p "$@" + +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" ] && { + case $fx in + *.tar.bz2) tar xjf $fx ;; + *.tar.gz) tar xzf $fx ;; + *.bz2) bunzip2 $fx ;; + *.rar) unrar e $fx ;; + *.gz) gunzip $fx ;; + *.tar) tar xf $fx ;; + *.tbz2) tar xjf $fx ;; + *.tgz) tar xzf $fx ;; + *.zip) unzip $fx ;; + *.Z) uncompress $fx ;; + *.7z) 7z x $fx ;; + *.tar.xz) tar xf $fx ;; + esac + } +}} + +cmd delete ${{ + clear; tput cup $(($(tput lines)/3)); tput bold + set -f + printf "%s\n\t" "$fx" + printf "delete?[y/N]" + read ans + [ $ans = "y" ] && rm -rf -- $fx +}} + +cmd moveto ${{ + 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" +}} + +# Bindings +map <c-f> $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 <c-n> push :mkdir<space>""<left> +map <c-r> reload +map <c-s> set hidden! +map <enter> shell +map x $$f +map X !$f +map o &mimeopen "$f" +map O $mimeopen --ask "$f" + +map A :rename; cmd-end # at the very end +map c push A<c-u> # 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 + +map <c-e> down +map <c-y> up +map V push :!nvim<space> + +map W $setsid -f $TERMINAL >/dev/null 2>&1 + +map Y $printf "%s" "$fx" | xclip -selection clipboard diff --git a/mut/lf/scope b/mut/lf/scope new file mode 100644 index 0000000..8265a87 --- /dev/null +++ b/mut/lf/scope @@ -0,0 +1,57 @@ +#!/bin/sh + +# File preview handler for lf. + +set -C -f +IFS="$(printf '%b_' '\n')"; IFS="${IFS%_}" + +image() { + if [ -f "$1" ] && [ -n "$DISPLAY" ] && [ -z "$WAYLAND_DISPLAY" ] && command -V ueberzug >/dev/null 2>&1; then + printf '{"action": "add", "identifier": "PREVIEW", "x": "%s", "y": "%s", "width": "%s", "height": "%s", "scaler": "contain", "path": "%s"}\n' "$4" "$5" "$(($2-1))" "$(($3-1))" "$1" > "$FIFO_UEBERZUG" + else + mediainfo "$6" + fi +} + +# Note that the cache file name is a function of file information, meaning if +# an image appears in multiple places across the machine, it will not have to +# be regenerated once seen. + +case "$(file --dereference --brief --mime-type -- "$1")" in + image/avif) 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" ] && convert "$1" "$CACHE.jpg" + image "$CACHE.jpg" "$2" "$3" "$4" "$5" "$1" ;; + image/vnd.djvu) + 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" ] && djvused "$1" -e 'select 1; save-page-with /dev/stdout' | convert -density 200 - "$CACHE.jpg" > /dev/null 2>&1 + image "$CACHE.jpg" "$2" "$3" "$4" "$5" "$1" ;; +image/svg+xml) + 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" ] && inkscape --convert-dpi-method=none -o "$CACHE.png" --export-overwrite -D --export-png-color-mode=RGBA_16 "$1" + image "$CACHE.png" "$2" "$3" "$4" "$5" "$1" + ;; + 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/x-ndjson) bat -p --theme ansi --terminal-width "$(($4-2))" -f "$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 + image "$CACHE" "$2" "$3" "$4" "$5" "$1" + ;; + */pdf) + 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" ] && 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/pgp-encrypted) gpg -d -- "$1" ;; +esac +exit 1 diff --git a/mut/neovim/fnl/conf/events.fnl b/mut/neovim/fnl/conf/events.fnl index f6a4227..4e03df8 100644 --- a/mut/neovim/fnl/conf/events.fnl +++ b/mut/neovim/fnl/conf/events.fnl @@ -3,10 +3,36 @@ (local {: attach} (require :conf.lsp)) (local event vim.api.nvim_create_autocmd) +(local command vim.api.nvim_create_user_command) (vim.api.nvim_create_augroup "my" {:clear true}) (vim.api.nvim_create_augroup "conf#events" {:clear true}) +(command :Event + (fn [cmd] + (let [del cmd.bang + [event_name & command] cmd.fargs] + (P cmd) + (local c (vim.iter command)) + (if del + (do + (local events + (vim.iter + (vim.api.nvim_get_autocmds + {:group :my + :event event_name + :buffer 0}))) + (events:map (fn [e] (vim.api.nvim_del_autocmd e.id)))) + (event + event_name + {:group :my + :buffer 0 + :callback #(vim.cmd (.. "silent " (c:join " ")))})))) + {:bang true :nargs :* :complete :file :force true}) +(let [map vim.keymap.set] + (map :n :<c-e> ":Event BufWritePost <up>") + (map :n :<M-e> ":Event! BufWritePost ")) + (event :LspAttach {:group "conf#events" @@ -44,16 +70,17 @@ {:group "conf#events" :pattern ["*"] :callback #(vim.cmd (.. "mksession! " session-file))}) -(event - :VimEnter - {:group "conf#events" - :pattern ["*"] - :callback #(if (= 1 (vim.fn.filereadable session-file)) - (do - (local start-with-arg (>= 1 (vim.fn.argc))) - (local file (vim.fn.argv 0)) - (local cwd (vim.fn.getcwd)) - (vim.schedule #(vim.cmd (.. "source " session-file))) - (if start-with-arg (vim.schedule #(do - (vim.cmd (.. "cd " cwd)) - (vim.cmd (.. "e " file)))))))}) +;; (event +;; :VimEnter +;; {:group "conf#events" +;; :pattern ["*"] +;; :callback #(if (= 1 (vim.fn.filereadable session-file)) +;; (do +;; (local start-with-arg (>= 1 (vim.fn.argc))) +;; (local file (vim.fn.argv 0)) +;; (local cwd (vim.fn.getcwd)) +;; (if start-with-arg (do +;; (vim.schedule #(vim.cmd (.. "source " session-file))) +;; (vim.schedule #(do +;; (vim.cmd (.. "cd " cwd)) +;; (vim.cmd (.. "e " file))))))))}) diff --git a/mut/neovim/fnl/conf/init.fnl b/mut/neovim/fnl/conf/init.fnl index 5a0826a..3475c52 100644 --- a/mut/neovim/fnl/conf/init.fnl +++ b/mut/neovim/fnl/conf/init.fnl @@ -27,12 +27,14 @@ toggle (do (vim.cmd "set virtualedit=all") + (vim.keymap.set :v "<leader>;" "<esc>:VBox<CR>") (vim.keymap.set "n" "J" "<C-v>j:VBox<CR>") (vim.keymap.set "n" "K" "<C-v>k:VBox<CR>") (vim.keymap.set "n" "L" "<C-v>l:VBox<CR>") (vim.keymap.set "n" "H" "<C-v>h:VBox<CR>")) (do (vim.cmd "set virtualedit=") + (vim.keymap.del :v "<leader>;") (vim.keymap.del "n" "J") (vim.keymap.del "n" "K") (vim.keymap.del "n" "L") @@ -86,7 +88,11 @@ (map :n :<leader>xb #(fzf.buffers {:keymap {:fzf {"alt-a" "toggle-all"}} :actions {:default {:fn action.buf_edit_or_qf}}})) - (map :n :<leader>x<cr> #(vim.cmd "b #"))) + (map :n :<leader>x<cr> #(vim.cmd "b #")) + (map :n :<leader><bs> + #(do + (local uis (vim.iter (vim.api.nvim_list_uis))) + (uis:map (fn [ui] (vim.fn.chanclose ui.chan)))))) (vim.api.nvim_create_user_command @@ -166,7 +172,7 @@ (local thunk #(qfjob cmd.fargs nil)) (set last_job_thunk thunk) (thunk)) - {:nargs :* :bang true :complete :shellcmd}) + {:nargs :* :bang true :complete "file"}) (vim.api.nvim_create_user_command :Sh (fn [cmd] |
