From 60cbc75cd4fd302bcf49a5328f6c12544da58532 Mon Sep 17 00:00:00 2001 From: MitchMarq42 Date: Sat, 20 Jan 2024 08:30:34 -0900 Subject: [PATCH] add all files back. i broke this repo whoops --- eshell-dat.el | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 eshell-dat.el diff --git a/eshell-dat.el b/eshell-dat.el new file mode 100644 index 0000000..876943e --- /dev/null +++ b/eshell-dat.el @@ -0,0 +1,98 @@ +;;; eshell-dat.el --- A better `cat' for Eshell -*- lexical-binding: t -*- + +;;; Commentary: + +;; An alternative to `eshell/cat'. If you `dat' an image file it will be +;; displayed as a thumbnail in the terminal similar to Kitty's "icat" or the +;; "catimg" command. If you Dat a file it will be shown with syntax +;; highlighting, sort of like how the "bat" command can be configured. + +;; This is mostly lifted directly from +;; https://emacs.stackexchange.com/questions/3432/display-images-in-eshell-with-iimage-mode +;; and also a bit from https://github.com/manateelazycat/aweshell/blob/d246df619573ca3f46070cc0ac82d024271ed243/aweshell.el#L775 +;; . However, I have gone ahead and cleaned up function names, et cetera. + +;;; Code: + +(defvar em-dat--old-eshell/cat (symbol-function 'eshell/cat)) +(defvar em-dat--right-pad 50 + "Padding to use on the right of images displayed by `dat'.") + +(defun em-dat--max-width (window) + (- (window-width window t) em-dat--right-pad)) + +(defun em-dat--txtfile-print (filename) + "Propertize the contents of FILENAME and output to terminal." + (let ((existing-buffer (get-file-buffer filename)) + (buffer (find-file-noselect filename))) + (eshell-print + (with-current-buffer buffer + (if (fboundp 'font-lock-ensure) + (font-lock-ensure) + (with-no-warnings + (font-lock-fontify-buffer))) + (let ((contents (buffer-string))) + (remove-text-properties 0 (length contents) '(read-only nil) contents) + contents))) + (unless existing-buffer + (kill-buffer buffer)) nil)) + +(defun em-dat--imagep (filename) + "Check if FILENAME is an image." + (let ((extension (file-name-extension filename)) + (image-extensions '("png" "jpg" "bmp"))) + (member extension image-extensions))) +(defun em-dat--image-width (filename) + "Get the width of the image FILENAME, using imagemagick." + (string-to-number + (shell-command-to-string + (format "convert '%s' -ping -format \"%%w\" info:" filename)))) +(defun em-dat--rescale-image (filename) + "Rescale image FILENAME to a maximum width, or leave untouched if already +small. Returns the new file path." + (let ((file (make-temp-file "resized_emacs")) + (max-width (em-dat--max-width (get-buffer-window (current-buffer))))) + (if (> (em-dat--image-width filename) max-width) + (progn + (shell-command-to-string + (format "convert -resize %dx '%s' '%s'" max-width filename file)) + file) + filename))) +(defun em-dat--image-print (file) + "Print the single image FILE." + (eshell/printnl (propertize " " 'display (create-image file)))) + +(defun em-dat--videop (filename) + "Check if FILENAME is a video." + (let ((extension (file-name-extension filename)) + (image-extensions '("mp4" "mov" "mkv"))) + (member extension image-extensions))) +(defun em-dat--vid2img (filename) + "Given video FILENAME, return the path to a newly created thumbnail image." + (let* ((width (em-dat--max-width (get-buffer-window (current-buffer)))) + (new-fpath (make-temp-file "thumbnail_emacs"))) + (shell-command-to-string + (format "ffmpegthumbnailer -i '%s' -f -s '%s' -o '%s'" + filename + width + new-fpath)) + new-fpath)) +(defun eshell/dat (&rest args) + "Wrapper around `em-dat--txtfile-print' for multiple ARGS. + +Also, can cat images for some reason." + (setq args (eshell-stringify-list (flatten-tree args))) + (dolist (file args) + (if (string= file "-") + (apply 'em-dat--old-eshell/cat file) + (cond ((em-dat--imagep file) (em-dat--image-print + (em-dat--rescale-image file))) + ((em-dat--videop file) (em-dat--image-print + (em-dat--vid2img file))) + (t (em-dat--txtfile-print file)))))) + +(put 'eshell/dat 'eshell-no-numeric-conversions t) +(put 'eshell/dat 'eshell-filename-arguments t) + +(provide 'eshell-dat) +;;; eshell-dat.el ends here