Move GNU Emacs configs from ./ into .emacs.d/
[~bandali/configs] / .emacs.d / lisp / bandali-dired.el
diff --git a/.emacs.d/lisp/bandali-dired.el b/.emacs.d/lisp/bandali-dired.el
new file mode 100644 (file)
index 0000000..9ed1030
--- /dev/null
@@ -0,0 +1,93 @@
+;;; bandali-dired.el --- bandali's dired setup       -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2018-2020  Amin Bandali
+
+;; Author: Amin Bandali <bandali@gnu.org>
+;; Keywords: files
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; My dired setup and customizations.
+
+;;; Code:
+
+(with-eval-after-load 'dired
+  (csetq
+   dired-dwim-target t
+   dired-listing-switches "-alh"
+   dired-recent-directories-file (b/var "dired-recent-directories.el")
+   ls-lisp-dirs-first t
+   ls-lisp-use-insert-directory-program nil)
+
+  (declare-function dired-dwim-target-directory "dired-aux")
+  ;; easily diff 2 marked files
+  ;; https://oremacs.com/2017/03/18/dired-ediff/
+  (defun dired-ediff-files ()
+    (interactive)
+    (require 'dired-aux)
+    (defvar ediff-after-quit-hook-internal)
+    (let ((files (dired-get-marked-files))
+          (wnd (current-window-configuration)))
+      (if (<= (length files) 2)
+          (let ((file1 (car files))
+                (file2 (if (cdr files)
+                           (cadr files)
+                         (read-file-name
+                          "file: "
+                          (dired-dwim-target-directory)))))
+            (if (file-newer-than-file-p file1 file2)
+                (ediff-files file2 file1)
+              (ediff-files file1 file2))
+            (add-hook 'ediff-after-quit-hook-internal
+                      (lambda ()
+                        (setq ediff-after-quit-hook-internal nil)
+                        (set-window-configuration wnd))))
+        (error "no more than 2 files should be marked"))))
+
+  (defun b/dired-start-process (program &optional args)
+    "Open current file with a PROGRAM."
+    ;; Shell command looks like this: "program [ARGS]... FILE" (ARGS
+    ;; can be nil, so remove it).
+    (declare-function dired-get-file-for-visit "dired")
+    (apply #'b/start-process
+           program
+           (remove nil (list args (dired-get-file-for-visit)))))
+
+  ;; local key bindings
+  (define-key dired-mode-map (kbd "b") #'dired-up-directory)
+  (define-key dired-mode-map (kbd "E") #'dired-ediff-files)
+  (define-key dired-mode-map (kbd "e") #'dired-toggle-read-only)
+  (define-key dired-mode-map (kbd "\\") #'dired-hide-details-mode)
+  (define-key dired-mode-map (kbd "z")
+    (lambda ()
+      (interactive)
+      (b/dired-start-process "zathura")))
+
+  (require 'dired-x)
+  (csetq dired-guess-shell-alist-user
+         '(("\\.pdf\\'"  "evince" "zathura" "okular")
+           ("\\.doc\\'"  "libreoffice")
+           ("\\.docx\\'" "libreoffice")
+           ("\\.ppt\\'"  "libreoffice")
+           ("\\.pptx\\'" "libreoffice")
+           ("\\.xls\\'"  "libreoffice")
+           ("\\.xlsx\\'" "libreoffice")
+           ("\\.flac\\'" "mpv"))))
+;; hooks
+(add-hook 'dired-mode-hook #'dired-hide-details-mode)
+
+(provide 'bandali-dired)
+;;; bandali-dired.el ends here