Merge branch 'develop' into dired

This commit is contained in:
Henrik Lissner 2019-09-02 00:51:52 -04:00 committed by GitHub
commit 3c4252ffe7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
295 changed files with 8141 additions and 6654 deletions

View file

@ -0,0 +1,46 @@
#+TITLE: emacs/dired
#+DATE: May 27, 2018
#+SINCE: v2.0
#+STARTUP: inlineimages
* Table of Contents :TOC_3:noexport:
- [[#description][Description]]
- [[#module-flags][Module Flags]]
- [[#plugins][Plugins]]
- [[#prerequisites][Prerequisites]]
- [[#keybindings][Keybindings]]
* Description
This module provides configuration for dired.
** Module Flags
+ =+ranger= Enables dired to be more like [[https://github.com/ranger/ranger][ranger]].
+ =+icons= Enables the display of fancy icons depending on file types in dired
buffers.
** Plugins
+ [[https:https://github.com/syohex/emacs-dired-k][dired-k]]
+ [[https://github.com/purcell/diredfl][diredfl]]
+ [[https://github.com/stsquad/dired-rsync][dired-rsync]]
+ =+ranger=
+ [[https://github.com/ralesi/ranger.el][ranger]]
+ =+icons=
+ [[https://github.com/jtbm37/all-the-icons-dired][all-the-icons-dired]]
* Prerequisites
This module has no prerequisites *except on BSDs* where =GNU ls= (~gls~) is
needed for it to work properly (Doom doctor will notify you if it is missing).
* Keybindings
| Keybind | Description |
|-----------+------------------------------|
| =SPC f d= | Find directory with dired |
| =q= | Exit dired buffer |
| =C-c C-r= | Run =dired-rsync= |
| =C-c C-e= | Rename entries with =wdired= |
Other keybindings can be found on the official [[https://www.gnu.org/software/emacs/refcards/pdf/dired-ref.pdf][Dired reference card]].

View file

@ -1,11 +1,15 @@
;;; tools/dired/config.el -*- lexical-binding: t; -*-
(def-package! dired
(use-package! dired
:commands dired-jump
:init
(setq ;; Always copy/delete recursively
dired-recursive-copies 'always
dired-recursive-deletes 'top
;; Instantly revert Dired buffers on re-visiting them, with no message.
;; (A message is shown if insta-revert is either disabled or determined
;; dynamically by setting this variable to a function.)
dired-auto-revert-buffer t
;; Auto refresh dired, but be quiet about it
dired-hide-details-hide-symlink-targets nil
;; files
@ -33,15 +37,15 @@
"C-c C-e" #'wdired-change-to-wdired-mode))
(def-package! dired-rsync
(use-package! dired-rsync
:general (dired-mode-map "C-c C-r" #'dired-rsync))
(def-package! diredfl
(use-package! diredfl
:hook (dired-mode . diredfl-mode))
(def-package! diff-hl
(use-package! diff-hl
:hook (dired-mode . diff-hl-dired-mode)
:init
(when (featurep! :tools magit)
@ -51,7 +55,7 @@
(diff-hl-margin-mode))
(def-package! ranger
(use-package! ranger
:when (featurep! +ranger)
:after dired
:init
@ -64,24 +68,24 @@
(set-popup-rule! "^\\*ranger" :ignore t)
(defun +dired*cleanup-header-line ()
(defadvice! +dired--cleanup-header-line-a ()
"Ranger fails to clean up `header-line-format' when it is closed, so..."
:before #'ranger-revert
(dolist (buffer (buffer-list))
(when (buffer-live-p buffer)
(with-current-buffer buffer
(when (equal header-line-format '(:eval (ranger-header-line)))
(setq header-line-format nil))))))
(advice-add #'ranger-revert :before #'+dired*cleanup-header-line)
(defun +dired*cleanup-mouse1-bind ()
(defadvice! +dired--cleanup-mouse1-bind-a ()
"Ranger binds an anonymous function to mouse-1 after previewing a buffer
that prevents the user from escaping the window with the mouse. This command is
never cleaned up if the buffer already existed before ranger was initialized, so
we have to clean it up ourselves."
:after #'ranger-setup-preview
(when (window-live-p ranger-preview-window)
(with-current-buffer (window-buffer ranger-preview-window)
(local-unset-key [mouse-1]))))
(advice-add #'ranger-setup-preview :after #'+dired*cleanup-mouse1-bind)
(setq ranger-cleanup-on-disable t
ranger-excluded-extensions '("mkv" "iso" "mp4")
@ -91,13 +95,16 @@ we have to clean it up ourselves."
ranger-hide-cursor nil))
(def-package! all-the-icons-dired
(use-package! all-the-icons-dired
:when (featurep! +icons)
:hook (dired-mode . all-the-icons-dired-mode))
(def-package! dired-x
(use-package! dired-x
:unless (featurep! +ranger)
:hook (dired-mode . dired-omit-mode)
:config
(setq dired-omit-verbose nil))
(setq dired-omit-verbose nil)
;; Disable the prompt about whether I want to kill the Dired buffer for a
;; deleted directory. Of course I do!
(setq dired-clean-confirm-killing-deleted-buffers nil))

View file

@ -10,10 +10,9 @@ current line.")
(after! electric
(setq-default electric-indent-chars '(?\n ?\^?))
(defun +electric-indent|char (_c)
(when (and (eolp) +electric-indent-words)
(save-excursion
(backward-word)
(looking-at-p (concat "\\<" (regexp-opt +electric-indent-words))))))
(add-to-list 'electric-indent-functions #'+electric-indent|char nil #'eq))
(add-hook! 'electric-indent-functions
(defun +electric-indent-char-fn (_c)
(when (and (eolp) +electric-indent-words)
(save-excursion
(backward-word)
(looking-at-p (concat "\\<" (regexp-opt +electric-indent-words))))))))

View file

@ -0,0 +1,41 @@
;;; emacs/vc/autoload/hydra.el -*- lexical-binding: t; -*-
;;;###if (featurep! :ui hydra)
;;;###autoload (autoload '+vc/smerge-hydra/body "emacs/vc/autoload/hydra" nil t)
(defhydra +vc/smerge-hydra (:hint nil
:pre (if (not smerge-mode) (smerge-mode 1))
;; Disable `smerge-mode' when quitting hydra if
;; no merge conflicts remain.
:post (smerge-auto-leave))
"
[smerge]
Movement Keep Diff Other
^_g_^ [_b_] base [_<_] upper/base [_C_] Combine
^_C-k_^ [_u_] upper [_=_] upper/lower [_r_] resolve
^_k_ ^ [_l_] lower [_>_] base/lower [_R_] remove
^_j_ ^ [_a_] all [_H_] hightlight
^_C-j_^ [_RET_] current [_E_] ediff
^_G_^ [_q_] quit
"
("g" (progn (goto-char (point-min)) (smerge-next)))
("G" (progn (goto-char (point-max)) (smerge-prev)))
("C-j" smerge-next)
("C-k" smerge-prev)
("j" next-line)
("k" previous-line)
("b" smerge-keep-base)
("u" smerge-keep-upper)
("l" smerge-keep-lower)
("a" smerge-keep-all)
("RET" smerge-keep-current)
("\C-m" smerge-keep-current)
("<" smerge-diff-base-upper)
("=" smerge-diff-upper-lower)
(">" smerge-diff-base-lower)
("H" smerge-refine)
("E" smerge-ediff)
("C" smerge-combine-with-next)
("r" smerge-resolve)
("R" smerge-kill-current)
("q" nil :color blue))

View file

@ -26,7 +26,7 @@ repository root."
(git-link (git-link--select-remote) beg end)))))
;;;###autoload
(defun +vc*update-header-line (revision)
(defun +vc-update-header-line-a (revision)
"Show revision details in the header-line, instead of the minibuffer.
Sometimes I forget `git-timemachine' is enabled in a buffer. Putting revision
@ -40,42 +40,3 @@ info in the `header-line-format' is a good indication."
(propertize author 'face 'git-timemachine-minibuffer-author-face)
(propertize sha-or-subject 'face 'git-timemachine-minibuffer-detail-face)
date-full date-relative))))
;;;###autoload (autoload '+vc-smerge-hydra/body "emacs/vc/autoload/vc" nil t)
(defhydra +vc-smerge-hydra (:hint nil
:pre (if (not smerge-mode) (smerge-mode 1))
;; Disable `smerge-mode' when quitting hydra if
;; no merge conflicts remain.
:post (smerge-auto-leave))
"
[smerge]
Movement Keep Diff Other
^_g_^ [_b_] base [_<_] upper/base [_C_] Combine
^_C-k_^ [_u_] upper [_=_] upper/lower [_r_] resolve
^_k_ ^ [_l_] lower [_>_] base/lower [_R_] remove
^_j_ ^ [_a_] all [_H_] hightlight
^_C-j_^ [_RET_] current [_E_] ediff
^_G_^ [_q_] quit
"
("g" (progn (goto-char (point-min)) (smerge-next)))
("G" (progn (goto-char (point-max)) (smerge-prev)))
("C-j" smerge-next)
("C-k" smerge-prev)
("j" next-line)
("k" previous-line)
("b" smerge-keep-base)
("u" smerge-keep-upper)
("l" smerge-keep-lower)
("a" smerge-keep-all)
("RET" smerge-keep-current)
("\C-m" smerge-keep-current)
("<" smerge-diff-base-upper)
("=" smerge-diff-upper-lower)
(">" smerge-diff-base-lower)
("H" smerge-refine)
("E" smerge-ediff)
("C" smerge-combine-with-next)
("r" smerge-resolve)
("R" smerge-kill-current)
("q" nil :color blue))

View file

@ -1,59 +1,13 @@
;;; emacs/vc/config.el -*- lexical-binding: t; -*-
(setq vc-make-backup-files nil)
(when IS-WINDOWS
(setenv "GIT_ASKPASS" "git-gui--askpass"))
(after! git-timemachine
;; HACK Waiting for https://gitlab.com/pidu/git-timemachine/issues/77
(defun +vc*git-timemachine-show-commit ()
(interactive)
(let ((rev (car git-timemachine-revision)))
(if (fboundp 'magit-revision-mode)
(with-temp-buffer
(save-excursion
(magit-setup-buffer #'magit-revision-mode nil
(magit-buffer-revision rev)
(magit-buffer-range (format "%s^..%s" rev rev))
(magit-buffer-diff-args nil)
(magit-buffer-diff-files nil))))
(message "You need to install magit to show commit"))))
(advice-add #'git-timemachine-show-commit :override #'+vc*git-timemachine-show-commit)
;;;###package vc
(setq vc-make-backup-files nil
vc-follow-symlinks t)
;; Sometimes I forget `git-timemachine' is enabled in a buffer, so instead of
;; showing revision details in the minibuffer, show them in
;; `header-line-format', which has better visibility.
(setq git-timemachine-show-minibuffer-details t)
(advice-add #'git-timemachine--show-minibuffer-details :override #'+vc*update-header-line)
(after! evil
;; rehash evil keybindings so they are recognized
(add-hook 'git-timemachine-mode-hook #'evil-normalize-keymaps))
(when (featurep! :tools magit)
(add-transient-hook! #'git-timemachine-blame (require 'magit-blame))))
;;;###package git-commit
(def-package! git-commit
:after-call after-find-file
:config
(global-git-commit-mode +1)
(set-yas-minor-mode! 'git-commit-mode)
(defun +vc|enforce-git-commit-conventions ()
"See https://chris.beams.io/posts/git-commit/"
(setq fill-column 72
git-commit-summary-max-length 50
git-commit-style-convention-checks '(overlong-summary-line non-empty-second-line)))
(add-hook 'git-commit-mode-hook #'+vc|enforce-git-commit-conventions)
(defun +vc|start-in-insert-state-maybe ()
"Start git-commit-mode in insert state if in a blank commit message,
otherwise in default state."
(when (and (bound-and-true-p evil-mode)
(bobp) (eolp))
(evil-insert-state)))
(add-hook 'git-commit-setup-hook #'+vc|start-in-insert-state-maybe))
(after! vc-annotate
(set-popup-rules!
@ -63,6 +17,47 @@ otherwise in default state."
'(vc-annotate-mode vc-git-log-view-mode)
'normal))
(after! git-timemachine
;; Sometimes I forget `git-timemachine' is enabled in a buffer, so instead of
;; showing revision details in the minibuffer, show them in
;; `header-line-format', which has better visibility.
(setq git-timemachine-show-minibuffer-details t)
(advice-add #'git-timemachine--show-minibuffer-details
:override #'+vc-update-header-line-a)
(after! evil
;; rehash evil keybindings so they are recognized
(add-hook 'git-timemachine-mode-hook #'evil-normalize-keymaps))
(when (featurep! :tools magit)
(add-transient-hook! #'git-timemachine-blame (require 'magit-blame)))
(map! :map git-timemachine-mode-map
:n "gtc" #'git-timemachine-show-commit))
(use-package! git-commit
:after-call after-find-file
:config
(global-git-commit-mode +1)
(set-yas-minor-mode! 'git-commit-mode)
;; Enforce git commit conventions.
;; See https://chris.beams.io/posts/git-commit/
(setq git-commit-summary-max-length 50
git-commit-style-convention-checks '(overlong-summary-line non-empty-second-line))
(setq-hook! 'git-commit-mode-hook fill-column 72)
(add-hook! 'git-commit-setup-hook
(defun +vc-start-in-insert-state-maybe ()
"Start git-commit-mode in insert state if in a blank commit message,
otherwise in default state."
(when (and (bound-and-true-p evil-mode)
(bobp) (eolp))
(evil-insert-state)))))
(after! smerge-mode
(unless EMACS26+
(with-no-warnings