;;; -*- 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 "-AGlX --group-directories-first -I \"*.meta\" -I \"#*#\" -I \"*.elc\"") (connection-local-set-profile-variables 'my-dired-profile '((dired-listing-switches . "-Al")) ) (connection-local-set-profiles '(:application tramp :machine "srv.dataswamp.org") 'my-dired-profile) (defun dired-ls-toggle (opt) (if (string-match-p opt dired-listing-switches) (setq dired-listing-switches (replace-regexp-in-string opt "" dired-listing-switches) ) (setq dired-listing-switches (format "%s %s" dired-listing-switches opt) )) (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 (define-key kmap "E" #'dired-touch-time-stamp-text-file) (define-key kmap "t" #'dired-invoke-touch) ;; kill (define-key kmap "S" #'dired-kill-file-name) (define-key kmap "s" #'dired-kill-path-dwim) ;; mark (define-key kmap "m" #'dired-toggle-mark) (define-key kmap "u" #'dired-toggle-mark) ;; file (define-key kmap "c" #'dired-do-copy) (define-key kmap "D" #'dired-flag-file-deletion) (define-key kmap "r" #'dired-do-rename) (define-key kmap "W" #'dired-view-in-w3m) ;; first/last file (define-key kmap "\C-oi" #'dired-first-file) (define-key kmap "\C-ok" #'dired-last-file) ;; prev/next line (define-key kmap [backtab] #'dired-previous-line) (define-key kmap "\t" #'dired-next-line) (define-key kmap "i" #'dired-previous-line) (define-key kmap "k" #'dired-next-line) ;; prev/next pane (define-key kmap "I" #'dired-scroll-up-pane) (define-key kmap "K" #'dired-scroll-down-pane) (define-key kmap "\M-I" #'dired-scroll-up-pane) (define-key kmap "\M-K" #'dired-scroll-down-pane) ;; directory (define-key kmap "d" #'dired-create-directory) (define-key kmap "w" #'dired-up-directory) (define-key kmap "b" #'dired-up-directory) ;; ls (define-key kmap "h" #'dired-toggle-human) (define-key kmap "l" #'dired-toggle-modification-sort) )) (dired-keys) (provide 'dired-incal)