dotfiles/.config/emacs/lisp/init-edit.el

130 lines
4.1 KiB
EmacsLisp

;;; init-edit.el -*- lexical-binding: t -*-
(require 'init-const)
(require 'init-funcs)
(use-package autorevert
:ensure nil
:diminish
:hook (after-init . global-auto-revert-mode))
(use-package avy
:hook (after-init . avy-setup-default)
:config
(setq avy-style 'pre
avy-all-windows t
avy-all-windows-alt nil
avy-background t))
;; Show number of matches in mode-line while searching
(use-package anzu
:diminish
;;:bind (([remap query-replace] . anzu-query-replace)
;; ([remap query-replace-regexp] . anzu-query-replace-regexp)
;; :map isearch-mode-map
;; ([remap isearch-query-replace] . anzu-isearch-query-replace)
;; ([remap isearch-query-replace-regexp] . anzu-isearch-query-replace-regexp))
:hook (after-init . global-anzu-mode))
(use-package ialign)
(use-package undo-tree
:diminish
:hook (after-init . global-undo-tree-mode)
:custom
(undo-tree-history-directory-alist
`(("." . ,(expand-file-name (file-name-as-directory "undo-tree-hist")
user-emacs-directory))))
:config
(setq undo-tree-visualizer-diff t
undo-tree-visualizer-timestamps t
undo-tree-auto-save-history t
undo-tree-enable-undo-in-region t
undo-limit (* 800 1024)
undo-strong-limit (* 12 1024 1024)
undo-outer-limit (* 128 1024 1024)))
(use-package hideshow
:ensure nil
:diminish hs-minor-mode
:pretty-hydra
((:title (pretty-hydra-title "HideShow" 'octicon "nf-oct-fold")
:color amaranth :quit-key ("q" "C-g"))
("Fold"
(("t" hs-toggle-all "toggle all")
("a" hs-show-all "show all")
("i" hs-hide-all "hide all")
("g" hs-toggle-hiding "toggle hiding")
("c" hs-cycle "cycle block")
("s" hs-show-block "show block")
("h" hs-hide-block "hide block")
("l" hs-hide-level "hide level"))
"Move"
(("C-a" mwim-beginning-of-code-or-line "")
("C-e" mwim-end-of-code-or-line "")
("C-b" backward-char "")
("C-n" next-line "")
("C-p" previous-line "")
("C-f" forward-char "")
("C-v" pager-page-down "")
("M-v" pager-page-up "")
("M-<" beginning-of-buffer "")
("M->" end-of-buffer ""))))
:bind ("C-~" . hideshow-hydra/body)
:hook (prog-mode . hs-minor-mode)
:config
;; More functions
;; @see https://karthinks.com/software/simple-folding-with-hideshow/
(defun hs-cycle (&optional level)
(interactive "p")
(let (message-log-max
(inhibit-message t))
(if (= level 1)
(pcase last-command
('hs-cycle
(hs-hide-level 1)
(setq this-command 'hs-cycle-children))
('hs-cycle-children
(save-excursion (hs-show-block))
(setq this-command 'hs-cycle-subtree))
('hs-cycle-subtree
(hs-hide-block))
(_
(if (not (hs-already-hidden-p))
(hs-hide-block)
(hs-hide-level 1)
(setq this-command 'hs-cycle-children))))
(hs-hide-level level)
(setq this-command 'hs-hide-level))))
(defun hs-toggle-all ()
"Toggle hide/show all."
(interactive)
(pcase last-command
('hs-toggle-all
(save-excursion (hs-show-all))
(setq this-command 'hs-global-show))
(_ (hs-hide-all))))
;; Display line counts
(defun hs-display-code-line-counts (ov)
"Display line counts when hiding codes."
(when (eq 'code (overlay-get ov 'hs))
(overlay-put ov 'display
(concat
" "
(propertize
(if (char-displayable-p ?⏷) "" "...")
'face 'shadow)
(propertize
(format " (%d lines)"
(count-lines (overlay-start ov)
(overlay-end ov)))
'face '(:inherit shadow :height 0.8))
" "))))
(setq hs-set-up-overlay #'hs-display-code-line-counts))
;; Hanlde minified code
(use-package so-long
:hook (after-init . global-so-long-mode))
(provide 'init-edit)
;;; init-edit.el ends here.