diff --git a/init.org b/init.org index 47d0f93..bd0d749 100644 --- a/init.org +++ b/init.org @@ -491,13 +491,15 @@ Honestly not very happy with this at the moment, but it's kind of hacked togethe :prefix-command 'nemo/leader-prefix-command :global-prefix nemo/leader-global :prefix nemo/leader-evil) + + ;; `leader-def` binds with prefix "SPC" into `nemo/leader-prefix-map` (general-create-definer leader-def :prefix-command 'nemo/leader-prefix-command :prefix-map 'nemo/leader-prefix-map) (general-create-definer leader-other-def :states '(emacs normal) - :prefix-map 'nemo/leader-prefix-map - :prefix-command 'nemo/leader-prefix-command + :prefix-command 'nemo/leader-prefix-command + :prefix-map 'nemo/leader-prefix-map :global-prefix nemo/leader-global :prefix nemo/leader-evil ) @@ -533,6 +535,164 @@ Honestly not very happy with this at the moment, but it's kind of hacked togethe ) ) #+end_src +** =dired= +Inspiration taken from [[https://eugene-andrienko.com/2026-07-05-my-emacs-configuration-dired.html][this post]] from hacker news. + +Todo: figure out how best to use =image-dired=. +#+begin_src emacs-lisp :tangle local-lisp/dired-hide-dotfiles.el +;;; dired-hide-dotfiles.el --- Hide dotfiles in dired buffers -*- lexical-binding: t; -*- + +(require 'dired) + +(defgroup dired-hide-dotfiles nil + :group 'dired) + +(define-minor-mode dired-hide-dotfiles-mode + :init-value nil + :group 'dired + (if dired-hide-dotfiles-mode + (progn + (add-hook 'dired-after-readin-hook #'dired-hide-dotfiles) + (dired-hide-dotfiles)) + (remove-hook 'dired-after-readin-hook #'dired-hide-dotfiles) + (revert-buffer)) + + (defun dired-hide-dotfiles () + "Hide dotfiles in dired buffer." + (let ((inhibit-message t)) + (dired-mark-files-regexp "^\\.|^.*/\\.") + (dired-do-kill-lines nil "Hid %d dotfiles.")))) + + +(provide 'dired-hide-dotfiles) +#+end_src + + +#+begin_src emacs-lisp +(defun nemo/dired-create-file-or-directory (path) + "Create a file or directory with NAME in the current dired buffer." + (interactive "sEnter name for new file/directory: ") + (if (or (file-exists-p path) (file-directory-p path)) + (message "'%s' already exists." path) + (if (string-suffix-p "/" path) + (dired-create-directory path) + (dired-create-empty-file path)))) + +(defun nemo/dired-toggle-mark () + "Toggle the mark on the current file in dired." + (interactive) + (when dired-get-filename nil t) + (let ((inhibit-read-only t)) + (save-excursion + (dired-move-to-filename) + (beginning-of-line) + (if (looking-at dired-marker-char) + (dired-unmark 1) + (dired-mark 1))))) + +(use-package dired + :straight nil + :hook (dired-mode . hl-line-mode) + :hook (dired-mode . dired-hide-details-mode) + :hook (dired-mode . auto-revert-mode) + :hook (dired-mode . dired-omit-mode) + :bind (:map dired-mode-map + ("" . dired-up-directory) + ("" . dired-subtree-toggle) + ("TAB" . dired-subtree-toggle) + ("C-TAB" . dired-subtree-remove)) + :config + (leader-def + "p" 'dired-preview-mode) + (setopt dired-compress-directory-default-suffix ".tar.zst" + dired-create-destination-dirs 'always + dired-filename-display-length 'window + dired-hide-details-hide-symlink-targets nil + dired-kill-when-opening-new-dired-buffer t + dired-listing-switches "-alh --group-directories-first" + dired-mouse-drag-files t + dired-movement-style 'bounded + dired-recursive-copies 'always + dired-recursive-deletes 'top) + + :custom + (dired-omit-files (rx (seq bol "."))) + ) + +(use-package dired-subtree + :straight t + :after dired + :hook (dired-subtree-after-insert . (lambda () + (if + (bound-and-true-p dired-omit-mode) + (dired-omit-expunge)))) + :config + (general-def '(emacs normal) 'dired-mode-map + "#" 'dired-omit-mode + "+" 'nemo/dired-create-file-or-directory) + ) + + +(use-package dired-open + :straight t + :after dired + :config + (setopt dired-open-extensions '(("png" . "sxiv") + ("jpg" . "sxiv") + ("jpeg" . "sxiv") + ("pdf" . "zathura") + ("mp4" . "mpv") + ("mkv" . "mpv") + ("webm" . "mpv") + ("epub" . "zathura") + ("mp3" . "mpv") + ("wav" . "mpv")))) + +(use-package image-dired + :straight t + :after dired + :config + (setopt image-dired-thumb-margin 5 + image-dired-thumb-size 256 + image-dired-track-movement t + image-dired-thumbnail-storage 'standard-large)) + +(defun nemo/dired-preview--file-ignored-p (orig-fun file &rest args) + "Return t if FILE should be ignored by dired-preview." + (if-let* (((stringp dired-preview-ignored-extensions-regexp)) + ((not (file-directory-p file))) + (file-nondir (file-name-nondirectory file))) + (string-match-p dired-preview-ignored-extensions-regexp file-nondir) + t)) + +(use-package dired-preview + :straight t + :after dired + :config + (setopt + dired-preview-display-action-alist #'dired-preview-display-action-alist-dwim + dired-preview-delay 0.1 + dired-preview-ignored-extensions-regexp + (concat + (default-value 'dired-preview-ignored-extensions-regexp))) + + (advice-add 'dired-preview--file-ignored-p :around + #'nemo/dired-preview--file-ignored-p) + + (cl-defmethod dired-preview--get-buffer ((file (head ignore))) + (let* ((file (s-chop-suffix "/" (cdr file))) + (buffer-name (format "%s (no preview)" (file-name-nondirectory file)))) + (or (get-buffer buffer-name) + (with-current-buffer (get-buffer-create buffer-name) + (set-visited-file-name file t) + (rename-buffer buffer-name) + (set-buffer-modified-p nil) + (setq-local dired-preview--placeholder-buffer-p t) + (setq buffer-read-only t) + (current-buffer))))) + ) +#+end_src + ** Web Search #+begin_src emacs-lisp (use-package engine-mode