;;; -*- lexical-binding: t -*- ;; ;; this file: ;; https://dataswamp.org/~incal/emacs-init/dired-incal.el (require 'files-x) (require 'scroll) (require 'simple) (require 'super) (require 'w3m-url) (setq dired-auto-revert-buffer #'dired-directory-changed-p) (setq completion-ignored-extensions `(".bcf" ".run.xml" ,@completion-ignored-extensions) ) ;; ls (setq dired-listing-switches "-A -G -h -l -X --group-directories-first --time-style=long-iso -I \"*.meta\" -I \"#*#\" -I \"*.elc\"") (connection-local-set-profile-variables 'my-dired-profile '((dired-listing-switches . "-Ahl")) ) (connection-local-set-profiles '(:application tramp :machine "srv.dataswamp.org") 'my-dired-profile) (defun dired-ls-toggle (opt) (let ((opt-re (format "\\(^\\|[[:blank:]]\\)%s\\([[:blank:]]\\|\\b\\)" opt))) (if (string-match-p opt-re dired-listing-switches) (setq dired-listing-switches (replace-regexp-in-string opt-re " " dired-listing-switches) ) (setq dired-listing-switches (format "%s %s" dired-listing-switches opt))) (setq dired-listing-switches (string-clean-whitespace dired-listing-switches)) (dired-sort-other dired-listing-switches) )) (defun dired-toggle-human () (interactive) (dired-ls-toggle "-h") ) (defun dired-toggle-modification-sort () (interactive) (dired-ls-toggle "-t") ) ;; delete (setq dired-recursive-deletes 'always) (setq dired-deletion-confirmer (lambda (_) t)) ; no confirm ;; operate file (defun dired-toggle-mark () (interactive) (if (= dired-marker-char (char-after (line-beginning-position))) (dired-unmark 1) (dired-mark 1) )) ;; move point (defun dired-first-file () (interactive) (goto-char (point-min)) (dired-next-line 1) (recenter) ) (defun dired-last-file () (interactive) (goto-char (point-max)) (dired-next-line -1) (recenter -2) ) ;; kill path (defun echo-kill () (message (car kill-ring)) ) (defun dired-kill-path-dwim () (interactive) (kill-new (or (dired-get-filename nil t) ; kill file including path, (dired-current-directory) )) ; or dir path if file u/a (echo-kill) ) (defun dired-kill-file-name () (interactive) (kill-new (dired-get-filename 'no-dir)) (message (car kill-ring)) (echo-kill) ) ;; touch (defun dired-invoke-touch (filename) "Invoke touch\\(1\\) in the dired directory, without considering the currently selected file." (interactive "s touch: ") (shell-command (format "touch %s/%s" dired-directory filename)) (revert-buffer) ) (defun dired-touch-time-stamp-text-file () (interactive) (dired-invoke-touch (format "%s.txt" (format-time-string "%F")))) ;; misc (defun dired-zip-files () (interactive) (dolist (f (dired-get-marked-files)) (start-process "zip" nil "zip" "-9" "--junk-path" (concat f ".zip") f) (revert-buffer) )) (defun replace-regexp-in-marked-files (match-regexp replace-string) (interactive "sMatch regexp: \nsReplace string: ") (save-window-excursion (let ((case-fold-search t)) (dolist (f (dired-get-marked-files)) (find-file f) (while (re-search-forward match-regexp nil t) (replace-match replace-string)) (save-buffer) ))) (dired-unmark-all-marks) ) ;; dired scroll (defun dired-scroll-up-pane () (interactive) (if (scroll-up-pane) (dired-move-to-filename) (dired-first-file) )) (defun dired-scroll-down-pane () (interactive) (if (scroll-down-pane) (dired-move-to-filename) (dired-last-file) )) ;; keys (defun dired-keys () (let ((kmap dired-mode-map)) (disable-super-global-keys kmap) ;; create file (keymap-set kmap "E" #'dired-touch-time-stamp-text-file) (keymap-set kmap "t" #'dired-invoke-touch) ;; kill (keymap-set kmap "S" #'dired-kill-file-name) (keymap-set kmap "s" #'dired-kill-path-dwim) ;; mark (keymap-set kmap "m" #'dired-toggle-mark) (keymap-set kmap "u" #'dired-toggle-mark) ;; file (keymap-set kmap "c" #'dired-do-copy) (keymap-set kmap "D" #'dired-flag-file-deletion) (keymap-set kmap "r" #'dired-do-rename) (keymap-set kmap "W" #'dired-view-in-w3m) ;; first/last file (keymap-set kmap "C-o i" #'dired-first-file) (keymap-set kmap "C-o k" #'dired-last-file) ;; prev/next line (define-key kmap [backtab] #'dired-previous-line) (keymap-set kmap "TAB" #'dired-next-line) (keymap-set kmap "i" #'dired-previous-line) (keymap-set kmap "k" #'dired-next-line) ;; prev/next pane (keymap-set kmap "I" #'dired-scroll-up-pane) (keymap-set kmap "K" #'dired-scroll-down-pane) (keymap-set kmap "M-I" #'dired-scroll-up-pane) (keymap-set kmap "M-K" #'dired-scroll-down-pane) ;; directory (keymap-set kmap "d" #'dired-create-directory) (keymap-set kmap "w" #'dired-up-directory) (keymap-set kmap "b" #'dired-up-directory) ;; ls (keymap-set kmap "h" #'dired-toggle-human) (keymap-set kmap "l" #'dired-toggle-modification-sort) )) (dired-keys) (provide 'dired-incal)