;;; -*- lexical-binding: t -*- ;; ;; -------------------------------------------------------------------------- (require 'luki-lisp) ;; -------------------------------------------------------------------------- (-> 'dired) (-> 'files-x) (-> 'll-keys) (-> 'll-scroll) (-> 'simple) ;; -------------------------------------------------------------------------- (setq dired-auto-revert-buffer #'dired-directory-changed-p) (setq completion-ignored-extensions `(".elc" ".bcf" ".run.xml" ,@completion-ignored-extensions)) ;; -------------------------------------------------------------------------- ;; ls (setq dired-use-ls-dired nil) (setq dired-listing-switches "-l -F -X -q --color=auto --group-directories-first --time-style=long-iso -G -h -l -I \"*.meta\" -I \"#*#\" -I \"*.elc\" -I \"*.description\"") ;; -------------------------------------------------------------------------- (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 ((re (@f "\\(^\\|[[:blank:]]\\)%s\\([[:blank:]]\\|\\b\\)" opt))) (if (string-match-p re dired-listing-switches) (setq dired-listing-switches (replace-regexp-in-string re " " dired-listing-switches)) (setq dired-listing-switches (@f "%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 () (i) (dired-ls-toggle "-h")) (defun dired-toggle-modification-sort () (i) (dired-ls-toggle "-t")) ;; -------------------------------------------------------------------------- ;; delete (setq dired-recursive-deletes 'always) (setq dired-deletion-confirmer (L (_) t)) ; no confirm ;; -------------------------------------------------------------------------- ;; mark (defun dired-toggle-mark () (i) (if (= dired-marker-char (char-after (pos-bol))) (dired-unmark 1) (dired-mark 1))) ;; -------------------------------------------------------------------------- ;; move point (defun dired-first-file () (i) (goto-beg) (dired-next-line 1) (recenter)) (defun dired-last-file () (i) (goto-end) (dired-next-line -1) (recenter -2)) ;; -------------------------------------------------------------------------- ;; kill path (defun echo-kill () (i) ($ (1st kill-ring))) (defun dired-kill-path-dwim () (i) (kill-new (or (dired-get-filename nil 'no-error-if-not-filep) ; kill file path (dired-current-directory))) ; or dir path (echo-kill)) (defun dired-kill-file-name () (i) (kill-new (dired-get-filename 'localp)) (echo-kill)) ;; -------------------------------------------------------------------------- ;; touch (defun dired-invoke-touch (file) (interactive "s touch: ") (shell-command (@f "touch %s" (file-name-concat dired-directory file))) (revert-buffer)) (defun dired-touch-time-stamp-text-file () (i) (dired-invoke-touch (@f "%s.txt" (format-time-string "%F")))) ;; -------------------------------------------------------------------------- (defun dired-zip-files () (i) (dolist (f (dired-get-marked-files)) (start-process "zip" nil "zip" "-9" "--junk-path" (file-name-concat f ".zip") f) (revert-buffer))) ;; -------------------------------------------------------------------------- (defun replace-regexp-in-marked-files (re str) (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 re nil 'noerror) (replace-match str)) (save-buffer)))) (dired-unmark-all-marks)) ;; -------------------------------------------------------------------------- ;; scroll (defun dired-scroll-up-pane () (i) (if (scroll-up-pane) (dired-move-to-filename) (dired-first-file))) (defun dired-scroll-down-pane () (i) (if (scroll-down-pane) (dired-move-to-filename) (dired-last-file))) ;; -------------------------------------------------------------------------- (defun dired-keys () (when-let* ((kmap dired-mode-map)) ;; 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) ;; first/last file (keymap-set kmap "C-o" 'C-o-prefix) (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) ;; ls (keymap-set kmap "h" #'dired-toggle-human) (keymap-set kmap "l" #'dired-toggle-modification-sort))) (dired-keys) ;; -------------------------------------------------------------------------- (defun dired-jump-target (file) "Jump to FILE or to the target if a symlink." (interactive (let ((fls (dired-get-marked-files))) (list (if (= 1 (--- fls)) (1st fls) (thing-at-point 'filename))))) (let* ((tgt (file-truename file)) (dir (file-name-directory tgt))) (when (file-exists-p tgt) (find-file dir) (dired-jump nil tgt)))) ;; (dired-jump-target "~/mia.txt") ; from Lisp: a regular file ;; (dired-jump-target "~/l") ; a symlink ;; (dired-jump-target "~/test") ; a directory ;; (dired-jump-target "~/mm/vidz/xxx") ; no such file, so NOOP ;; ↑ ;; with point here ;; M-x dired-jump-target RET ;; -------------------------------------------------------------------------- (advice-add #'dired-do-rename :before #'dired-kill-ext) ;; (advice-remove #'dired-do-rename #'dired-kill-ext) (defun dired-kill-ext (&optional _) ; NOTE: OK (save-excursion (goto-char (pos-eol)) (when (re-search-backward "\\.[[:alnum:]]+\\b" (pos-bol) 'noerror) (when-let* ((ext (match-string-no-properties 0))) (kill-new ext) ($ ext))))) ;; (dired-kill-ext) index.php ;; (dired-kill-ext) E-Type Life .ft Nana Hedin.webm ;; -------------------------------------------------------------------------- (<- 'll-dired)