Merge branch 'develop' into dired
This commit is contained in:
commit
3c4252ffe7
295 changed files with 8141 additions and 6654 deletions
46
modules/emacs/dired/README.org
Normal file
46
modules/emacs/dired/README.org
Normal 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]].
|
|
@ -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))
|
||||
|
|
|
@ -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))))))))
|
||||
|
|
41
modules/emacs/vc/autoload/hydra.el
Normal file
41
modules/emacs/vc/autoload/hydra.el
Normal 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))
|
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue