aboutsummaryrefslogtreecommitdiff
path: root/script
diff options
context:
space:
mode:
authorDylan Araps <dylan.araps@gmail.com>2026-02-28 21:52:26 +0200
committerDylan Araps <dylan.araps@gmail.com>2026-02-28 21:52:26 +0200
commit67a1c24a8661fdcbc48f72f7b65521772065d305 (patch)
tree33c1fbfe2452c23773de046b1127f4920aa5a49f /script
parent4fb29c95c61256f78e4b501a3c550b4c92a92a4e (diff)
dfm: add ranger style bulk rename
Also the ability to embed scripts within dfm.
Diffstat (limited to 'script')
-rwxr-xr-xscript/bulk-rename47
-rwxr-xr-xscript/opener_ext27
-rwxr-xr-xscript/opener_mime33
3 files changed, 107 insertions, 0 deletions
diff --git a/script/bulk-rename b/script/bulk-rename
new file mode 100755
index 0000000..3bd6c85
--- /dev/null
+++ b/script/bulk-rename
@@ -0,0 +1,47 @@
+#!/bin/sh -eu
+#
+# Interactive bulk file rename using $EDITOR.
+#
+# Copyright (c) 2026 Dylan Araps
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+#
+
+case $# in 0) exit; esac
+f=${TMPDIR:=/tmp}/.dfm-brn-$$-$#
+e() { rm -f "$f" || :; exit "$1"; }
+(
+ printf '%s\n' "$@" > "$f" &&
+ "${EDITOR:=vi}" "$f" &&
+ exec 3<"$f" &&
+ for _ do
+ IFS= read -r l <&3
+ set -- "$@" "mv -f -- '$1' '${l:?line mismatch in rename file}'"
+ shift
+ done && {
+ read -r l <&3 && {
+ echo "$0: 39: line mismatch in rename file" >&2
+ return 1
+ }
+ printf '%s\n' '# This file will be executed when the editor is closed.' \
+ '# Clear the file to abort.' "$@"
+ } > "$f" &&
+ "$EDITOR" "$f" && . "$f" && e 0
+) || e 1
+
diff --git a/script/opener_ext b/script/opener_ext
new file mode 100755
index 0000000..ce1699a
--- /dev/null
+++ b/script/opener_ext
@@ -0,0 +1,27 @@
+#!/bin/sh -feu
+#
+# Example DFM_OPENER script using file extension.
+#
+
+case $1 in
+ *.mkv | *.webm | *.mp4 | *.avi)
+ exec mpv -- "$1"
+ ;;
+
+ *.opus | *.mp3 | *.wav | *.flac | *.ogg)
+ exec mus --no-shuffle -- "$1"
+ ;;
+
+ *.jpg | *.jpeg | *.gif | *.png | *.CR2)
+ exec mpv --pause -- "$1"
+ ;;
+
+ *.svg)
+ exec inkscape "$1"
+ ;;
+
+ *?*)
+ exec "${EDITOR:-vim}" "$1"
+ ;;
+esac
+
diff --git a/script/opener_mime b/script/opener_mime
new file mode 100755
index 0000000..2f7bd52
--- /dev/null
+++ b/script/opener_mime
@@ -0,0 +1,33 @@
+#!/bin/sh -feu
+#
+# Example DFM_OPENER script using mimetype.
+#
+
+mime_type=$(file -bi "$1")
+
+case $mime_type in
+ audio/*)
+ exec mpv --no-video "$1"
+ ;;
+
+ video/*)
+ exec mpv "$1"
+ ;;
+
+ image/*)
+ exec gimp "$1"
+ ;;
+
+ text/html* | application/pdf*)
+ exec firefox "$1"
+ ;;
+
+ text/*)
+ exec "${EDITOR:=vi}" "$1"
+ ;;
+
+ *?*)
+ printf 'error: unhandled mime-type %s\n' "$mime_type" >&2
+ ;;
+esac
+