From 20c63a3122c176453045d013d21e1961413a599b Mon Sep 17 00:00:00 2001 From: JaeYoo-Im Date: Sat, 20 May 2023 01:57:20 +0900 Subject: [PATCH] 230520-1 --- .config/emacs/custom-default.el | 1 - .config/emacs/init.el | 5 + .config/emacs/lisp/init-bookmark.el | 88 +++++++++++++ .config/emacs/lisp/init-evil.el | 40 +++--- .config/emacs/lisp/init-general.el | 4 + .config/emacs/lisp/init-highlight.el | 186 ++++++++++++++++++++++++++- .config/emacs/lisp/init-ibuffer.el | 25 ++++ .config/emacs/lisp/init-persp.el | 108 ++++++++++++++++ .config/emacs/lisp/init-treemacs.el | 53 ++++++++ .config/emacs/lisp/init-ui.el | 4 +- .config/emacs/lisp/init-vertico.el | 63 ++++++++- .config/emacs/lisp/init-window.el | 33 +++++ 12 files changed, 583 insertions(+), 27 deletions(-) create mode 100644 .config/emacs/lisp/init-bookmark.el create mode 100644 .config/emacs/lisp/init-ibuffer.el create mode 100644 .config/emacs/lisp/init-persp.el create mode 100644 .config/emacs/lisp/init-treemacs.el create mode 100644 .config/emacs/lisp/init-window.el diff --git a/.config/emacs/custom-default.el b/.config/emacs/custom-default.el index 8d41842..55240f0 100644 --- a/.config/emacs/custom-default.el +++ b/.config/emacs/custom-default.el @@ -36,7 +36,6 @@ (set-fontset-font t '(#x1100 . #xffdc) (font-spec :family font)))))) (custom-setup-fonts) (add-hook 'window-setup-hook #'custom-setup-fonts) -(add-hook 'server-after-make-frame-hook #'centaur-setup-fonts) ;; select theme (setq custom-theme-sel 'doom-one) diff --git a/.config/emacs/init.el b/.config/emacs/init.el index 376dae0..954e36e 100644 --- a/.config/emacs/init.el +++ b/.config/emacs/init.el @@ -65,8 +65,13 @@ Otherwise the startup will be very slow. " (require 'init-yasnippet) +(require 'init-bookmark) (require 'init-dashboard) (require 'init-dired) (require 'init-highlight) +(require 'init-ibuffer) +(require 'init-persp) +(require 'init-window) +(require 'init-treemacs) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; init.el ends here diff --git a/.config/emacs/lisp/init-bookmark.el b/.config/emacs/lisp/init-bookmark.el new file mode 100644 index 0000000..8c9d83b --- /dev/null +++ b/.config/emacs/lisp/init-bookmark.el @@ -0,0 +1,88 @@ +;;; init-bookmark.el -*- lexical-binding: t -*- +;; Bookmark +(use-package bookmark + :ensure nil + :config + (with-no-warnings + ;; Display icons for bookmarks + (defun my-bookmark-bmenu--revert () + "Re-populate `tabulated-list-entries'." + (let (entries) + (dolist (full-record (bookmark-maybe-sort-alist)) + (let* ((name (bookmark-name-from-full-record full-record)) + (annotation (bookmark-get-annotation full-record)) + (location (bookmark-location full-record)) + (file (file-name-nondirectory location)) + (type (let ((fmt "%-8.8s")) + (cond ((null location) + (propertize (format fmt "NOFILE") 'face 'warning)) + ((file-remote-p location) + (propertize (format fmt "REMOTE") 'face 'mode-line-buffer-id)) + ((not (file-exists-p location)) + (propertize (format fmt "NOTFOUND") 'face 'error)) + ((file-directory-p location) + (propertize (format fmt "DIRED") 'face 'warning)) + (t (propertize (format fmt "FILE") 'face 'success))))) + (icon (if (icons-displayable-p) + (cond + ((file-remote-p location) + (nerd-icons-codicon "nf-cod-radio_tower")) + ((file-directory-p location) + (nerd-icons-icon-for-dir location)) + ((not (string-empty-p file)) + (nerd-icons-icon-for-file file))) + ""))) + (push (list + full-record + `[,(if (and annotation (not (string-equal annotation ""))) + "*" "") + ,icon + ,(if (display-mouse-p) + (propertize name + 'font-lock-face 'bookmark-menu-bookmark + 'mouse-face 'highlight + 'follow-link t + 'help-echo "mouse-2: go to this bookmark in other window") + name) + ,type + ,@(if bookmark-bmenu-toggle-filenames + (list (propertize location 'face 'completions-annotations)))]) + entries))) + (tabulated-list-init-header) + (setq tabulated-list-entries entries)) + (tabulated-list-print t)) + (advice-add #'bookmark-bmenu--revert :override #'my-bookmark-bmenu--revert) + + (defun my-bookmark-bmenu-list () + "Display a list of existing bookmarks. +The list is displayed in a buffer named `*Bookmark List*'. +The leftmost column displays a D if the bookmark is flagged for +deletion, or > if it is flagged for displaying." + (interactive) + (bookmark-maybe-load-default-file) + (let ((buf (get-buffer-create bookmark-bmenu-buffer))) + (if (called-interactively-p 'interactive) + (pop-to-buffer buf) + (set-buffer buf))) + (bookmark-bmenu-mode) + (bookmark-bmenu--revert)) + (advice-add #'bookmark-bmenu-list :override #'my-bookmark-bmenu-list) + + (define-derived-mode bookmark-bmenu-mode tabulated-list-mode "Bookmark Menu" + (setq truncate-lines t) + (setq buffer-read-only t) + (setq tabulated-list-format + `[("" 1) ;; Space to add "*" for bookmark with annotation + ("" ,(if (icons-displayable-p) 2 0)) ;; Icons + ("Bookmark" ,bookmark-bmenu-file-column bookmark-bmenu--name-predicate) + ("Type" 9) + ,@(if bookmark-bmenu-toggle-filenames + '(("File" 0 bookmark-bmenu--file-predicate)))]) + (setq tabulated-list-padding bookmark-bmenu-marks-width) + (setq tabulated-list-sort-key '("Bookmark" . nil)) + (add-hook 'tabulated-list-revert-hook #'bookmark-bmenu--revert nil t)' + (setq revert-buffer-function #'bookmark-bmenu--revert) + (tabulated-list-init-header)))) +(provide 'init-bookmark) + +;;; init.el ends here diff --git a/.config/emacs/lisp/init-evil.el b/.config/emacs/lisp/init-evil.el index 714f327..e834631 100644 --- a/.config/emacs/lisp/init-evil.el +++ b/.config/emacs/lisp/init-evil.el @@ -24,29 +24,29 @@ (evil-set-initial-state 'dashboard-mode 'normal) ;; eshell no evil (dolist (mode '(eshell-mode)) - (add-to-list 'evil-emacs-state-modes mode)) + (add-to-list 'evil-emacs-state-modes mode))) - (use-package evil-collection - :defer nil - :config - (evil-collection-init)) +(use-package evil-collection + :defer nil + :config + (evil-collection-init)) - (use-package evil-nerd-commenter - :defer nil - :config - ;; evil nerd commenter - (define-key evil-normal-state-map (kbd "g c") 'evilnc-comment-or-uncomment-lines) - (define-key evil-visual-state-map (kbd "g c") 'evilnc-comment-or-uncomment-lines)) +(use-package evil-nerd-commenter + :defer nil + :config + ;; evil nerd commenter + (define-key evil-normal-state-map (kbd "g c") 'evilnc-comment-or-uncomment-lines) + (define-key evil-visual-state-map (kbd "g c") 'evilnc-comment-or-uncomment-lines)) - (use-package evil-numbers - :defer nil - :config - ;; evil numbers - ;; unfortunately C-x is emacs common key binding. - (define-key evil-normal-state-map (kbd "g =") 'evil-numbers/inc-at-pt) - (define-key evil-normal-state-map (kbd "g -") 'evil-numbers/dec-at-pt) - (define-key evil-visual-state-map (kbd "g =") 'evil-numbers/inc-at-pt) - (define-key evil-visual-state-map (kbd "g -") 'evil-numbers/dec-at-pt))) +(use-package evil-numbers + :defer nil + :config + ;; evil numbers + ;; unfortunately C-x is emacs common key binding. + (define-key evil-normal-state-map (kbd "g =") 'evil-numbers/inc-at-pt) + (define-key evil-normal-state-map (kbd "g -") 'evil-numbers/dec-at-pt) + (define-key evil-visual-state-map (kbd "g =") 'evil-numbers/inc-at-pt) + (define-key evil-visual-state-map (kbd "g -") 'evil-numbers/dec-at-pt)) (provide 'init-evil) ;;; init-evil.el ends here. diff --git a/.config/emacs/lisp/init-general.el b/.config/emacs/lisp/init-general.el index 1f69db1..f8b4f79 100644 --- a/.config/emacs/lisp/init-general.el +++ b/.config/emacs/lisp/init-general.el @@ -28,6 +28,9 @@ :prefix "SPC" :global-prefix "C-SPC")) (ju/leader-key-def + ;; workspace + "TAB" '(persp-key-map :which-key "persp-mode") + ;; file "." 'find-file ;; Buffer "b" '(:ignore t :which-key "buffer handling") @@ -38,6 +41,7 @@ "b p" '(previous-buffer :which-key "Previous buffer") "b B" '(ibuffer-list-buffers :which-key "IBuffer List Buffers") "b K" '(kill-buffer :which-key "IBuffer Kill Buffers") + "b s" '(consult-buffer :which-key "switch buffer") ;; Eshell "e" '(:ignore t :which-key "eshell") "e h" '(counsel-esh-history :which-key "Kill history") diff --git a/.config/emacs/lisp/init-highlight.el b/.config/emacs/lisp/init-highlight.el index 770b7c6..e0ac17c 100644 --- a/.config/emacs/lisp/init-highlight.el +++ b/.config/emacs/lisp/init-highlight.el @@ -6,7 +6,191 @@ :ensure nil :hook ((after-init . global-hl-line-mode) ((dashboard-mode eshell-mode shell-mode term-mode vterm-mode) . - (lambda () (setq-local global-hl-line-mode nil))))) + (lambda () (setq-local global-hl-line-mode nil)))) + :config + (set-face-background 'hl-line "gray8")) + +(use-package symbol-overlay + :diminish + :custom-face + ;;(symbol-overlay-default-face ((t (:inherit region :background unspecified :foreground unspecified)))) + (symbol-overlay-default-face ((t (:inherit nerd-icons-purple :background unspecified :foreground unspecified :inverse-video t)))) + (symbol-overlay-face-1 ((t (:inherit nerd-icons-blue :background unspecified :foreground unspecified :inverse-video t)))) + (symbol-overlay-face-2 ((t (:inherit nerd-icons-pink :background unspecified :foreground unspecified :inverse-video t)))) + (symbol-overlay-face-3 ((t (:inherit nerd-icons-yellow :background unspecified :foreground unspecified :inverse-video t)))) + (symbol-overlay-face-4 ((t (:inherit nerd-icons-orange :background unspecified :foreground unspecified :inverse-video t)))) + (symbol-overlay-face-5 ((t (:inherit nerd-icons-red :background unspecified :foreground unspecified :inverse-video t)))) + (symbol-overlay-face-6 ((t (:inherit nerd-icons-purple :background unspecified :foreground unspecified :inverse-video t)))) + (symbol-overlay-face-7 ((t (:inherit nerd-icons-green :background unspecified :foreground unspecified :inverse-video t)))) + (symbol-overlay-face-8 ((t (:inherit nerd-icons-cyan :background unspecified :foreground unspecified :inverse-video t)))) + :bind (("M-i" . symbol-overlay-put) + ("M-I" . symbol-overlay-remove-all) + ("M-n" . symbol-overlay-jump-next) + ("M-p" . symbol-overlay-jump-prev)) + :hook ((prog-mode yaml-mode) . symbol-overlay-mode) + :init (setq symbol-overlay-idle-time 0.5) + :config + (with-no-warnings + ;; Disable symbol highlighting while selecting + (defun turn-off-symbol-overlay (&rest _) + "Turn off symbol highlighting." + (interactive) + (symbol-overlay-mode -1)) + (advice-add #'set-mark :after #'turn-off-symbol-overlay) + + (defun turn-on-symbol-overlay (&rest _) + "Turn on symbol highlighting." + (interactive) + (when (derived-mode-p 'prog-mode 'yaml-mode) + (symbol-overlay-mode 1))) + (advice-add #'deactivate-mark :after #'turn-on-symbol-overlay))) + +;; Colorize color names in buffers +(use-package rainbow-mode + :diminish + :defines helpful-mode-map + :bind (:map help-mode-map + ("w" . rainbow-mode)) + :hook ((html-mode php-mode helpful-mode) . rainbow-mode) + :init (with-eval-after-load 'helpful + (bind-key "w" #'rainbow-mode helpful-mode-map)) + :config + (with-no-warnings + ;; HACK: Use overlay instead of text properties to override `hl-line' faces. + ;; @see https://emacs.stackexchange.com/questions/36420 + (defun my-rainbow-colorize-match (color &optional match) + (let* ((match (or match 0)) + (ov (make-overlay (match-beginning match) (match-end match)))) + (overlay-put ov 'ovrainbow t) + (overlay-put ov 'face `((:foreground ,(if (> 0.5 (rainbow-x-color-luminance color)) + "white" "black")) + (:background ,color))))) + (advice-add #'rainbow-colorize-match :override #'my-rainbow-colorize-match) + + (defun my-rainbow-clear-overlays () + "Clear all rainbow overlays." + (remove-overlays (point-min) (point-max) 'ovrainbow t)) + (advice-add #'rainbow-turn-off :after #'my-rainbow-clear-overlays))) + +;; Highlight brackets according to their depth +(use-package rainbow-delimiters + :hook (prog-mode . rainbow-delimiters-mode)) + +;; keywords from doom-emacs +(use-package hl-todo + :custom-face + (hl-todo ((t (:inherit default :height 0.9 :width condensed :weight bold :underline nil :inverse-video t)))) + :hook (after-init . global-hl-todo-mode) + :init + (setq hl-todo-require-punctuation t + hl-todo-highlight-punctuation ":") + :config + ;; TODO: For things that need to be done, just not today. + (dolist (keyword '("TODO")) + (add-to-list 'hl-todo-keyword-faces `(,keyword . "#ffcb6b"))) + ;; FIXME: For problems that will become bigger problems later if not fixed ASAP. + ;; BUG: For a known bug that needs a workaround + (dolist (keyword '("FIXME" "BUG")) + (add-to-list 'hl-todo-keyword-faces `(,keyword . "#ff5370"))) + ;; HACK: For tidbits that are unconventional and not intended + ;; uses of the constituent parts, and may break in a future update. + ;; XXX: For warning about a problematic or misguiding code + (dolist (keyword '("HACK" "XXX")) + (add-to-list 'hl-todo-keyword-faces `(,keyword . "#f78b69"))) + ;; REVIEW: For things that were done hastily and/or hasn't been thoroughly + ;; tested. It may not even be necessary! + (dolist (keyword '("REVIEW")) + (add-to-list 'hl-todo-keyword-faces `(,keyword . "#89ddff"))) + ;; NOTE: For especially important gotchas with a given implementation, + ;; directed at another user other than the author. + (dolist (keyword '("NOTE")) + (add-to-list 'hl-todo-keyword-faces `(,keyword . "#c2e88b"))) + ;; DEPRECATED: For things that just gotta go and will soon be gone. + (dolist (keyword '("DEPRECATED")) + (add-to-list 'hl-todo-keyword-faces `(,keyword . "#8d9eaf")))) + +;;(use-package diff-hl +;; :config +;; (diff-hl-margin-mode)) + +(use-package diff-hl + :hook ((after-init . global-diff-hl-mode) + (magit-post-refresh . diff-hl-magit-post-refresh) + (dired-mode . diff-hl-dired-mode-unless-remote)) + ;;(dired-mode . diff-hl-dired-mode)) + :config + ;; Highlight on-the-fly + (diff-hl-flydiff-mode 1) + + ;; Set fringe style + (setq-default fringes-outside-margins nil) + + (with-no-warnings + (defun my-diff-hl-fringe-bmp-function (_type _pos) + "Fringe bitmap function for use as `diff-hl-fringe-bmp-function'." + (define-fringe-bitmap 'my-diff-hl-bmp + (vector (if sys/linuxp #b11111100 #b11100000)) + 1 8 + '(center t))) + (setq diff-hl-fringe-bmp-function #'my-diff-hl-fringe-bmp-function) + + (unless (display-graphic-p) + ;; Fall back to the display margin since the fringe is unavailable in tty + (diff-hl-margin-mode 1) + ;; Avoid restoring `diff-hl-margin-mode' + (with-eval-after-load 'desktop + (add-to-list 'desktop-minor-mode-table + '(diff-hl-margin-mode nil)))) + + ;; Integration with magit + (with-eval-after-load 'magit + (add-hook 'magit-pre-refresh-hook #'diff-hl-magit-pre-refresh) + (add-hook 'magit-post-refresh-hook #'diff-hl-magit-post-refresh)))) +;; Pulse current line +(use-package pulse + :ensure nil + :custom-face + (pulse-highlight-start-face ((t (:inherit region :background unspecified)))) + (pulse-highlight-face ((t (:inherit region :background unspecified :extend t)))) + :hook (((dumb-jump-after-jump imenu-after-jump) . my-recenter-and-pulse) + ((bookmark-after-jump magit-diff-visit-file next-error) . my-recenter-and-pulse-line)) + :init + (with-no-warnings + (defun my-pulse-momentary-line (&rest _) + "Pulse the current line." + (pulse-momentary-highlight-one-line (point))) + + (defun my-pulse-momentary (&rest _) + "Pulse the region or the current line." + (if (fboundp 'xref-pulse-momentarily) + (xref-pulse-momentarily) + (my-pulse-momentary-line))) + + (defun my-recenter-and-pulse(&rest _) + "Recenter and pulse the region or the current line." + (recenter) + (my-pulse-momentary)) + + (defun my-recenter-and-pulse-line (&rest _) + "Recenter and pulse the current line." + (recenter) + (my-pulse-momentary-line)) + + (dolist (cmd '(recenter-top-bottom + other-window switch-to-buffer + aw-select toggle-window-split + windmove-do-window-select + pager-page-down pager-page-up + treemacs-select-window + symbol-overlay-basic-jump)) + (advice-add cmd :after #'my-pulse-momentary-line)) + + (dolist (cmd '(pop-to-mark-command + pop-global-mark + goto-last-change)) + (advice-add cmd :after #'my-recenter-and-pulse)))) + + (provide 'init-highlight) ;;; init-highlight.el ends here diff --git a/.config/emacs/lisp/init-ibuffer.el b/.config/emacs/lisp/init-ibuffer.el new file mode 100644 index 0000000..8e3c520 --- /dev/null +++ b/.config/emacs/lisp/init-ibuffer.el @@ -0,0 +1,25 @@ +;;; init-ibuffer.el -*- lexical-binding: t -*- +(require 'init-const) +(require 'init-funcs) + +(use-package ibuffer + :ensure nil + :init (setq ibuffer-filter-group-name-face '(:inherit (font-lock-string-face bold))) + :config + ;; Display icons for buffers + (use-package nerd-icons-ibuffer + :hook (ibuffer-mode . nerd-icons-ibuffer-mode) + :init (setq nerd-icons-ibuffer-icon t))) +;; Group ibuffer's list by project +(use-package ibuffer-project + :hook (ibuffer . (lambda () + (setq ibuffer-filter-groups (ibuffer-project-generate-filter-groups)) + (unless (eq ibuffer-sorting-mode 'project-file-relative) + (ibuffer-do-sort-by-project-file-relative)))) + :init (setq ibuffer-project-use-cache t) + :config + (add-to-list 'ibuffer-project-root-functions '(file-remote-p . "Remote")) + (add-to-list 'ibuffer-project-root-functions '("\\*.+\\*" . "Default"))) + +(provide 'init-ibuffer) +;;; init-ibuffer.el ends here diff --git a/.config/emacs/lisp/init-persp.el b/.config/emacs/lisp/init-persp.el new file mode 100644 index 0000000..3e8ae33 --- /dev/null +++ b/.config/emacs/lisp/init-persp.el @@ -0,0 +1,108 @@ +;;; init-persp.el -*- lexical-binding: t -*- +(require 'init-const) +(require 'init-funcs) + +;; Windows/buffers sets shared among frames + save/load. +(use-package persp-mode + :diminish + :autoload (get-current-persp persp-contain-buffer-p) + :hook (after-init . persp-mode) + :init (setq persp-keymap-prefix (kbd "C-x p") + persp-nil-name "default" + persp-set-last-persp-for-new-frames nil + persp-kill-foreign-buffer-behaviour 'kill + persp-auto-resume-time 0) + :config + + (with-no-warnings + ;; Don't save if the state is not loaded + (defvar persp-state-loaded nil + "Whether the state is loaded.") + + (defun my-persp-after-load-state (&rest _) + (setq persp-state-loaded t)) + (advice-add #'persp-load-state-from-file :after #'my-persp-after-load-state) + (add-hook 'emacs-startup-hook + (lambda () + (add-hook 'find-file-hook #'my-persp-after-load-state))) + + (defun my-persp-asave-on-exit (fn &optional interactive-query opt) + (if persp-state-loaded + (funcall fn interactive-query opt) + t)) + (advice-add #'persp-asave-on-exit :around #'my-persp-asave-on-exit)) + + ;; Don't save dead or temporary buffers + (add-hook 'persp-filter-save-buffers-functions + (lambda (b) + "Ignore dead and unneeded buffers." + (or (not (buffer-live-p b)) + (string-prefix-p " *" (buffer-name b))))) + (add-hook 'persp-filter-save-buffers-functions + (lambda (b) + "Ignore temporary buffers." + (let ((bname (file-name-nondirectory (buffer-name b)))) + (or (string-prefix-p ".newsrc" bname) + (string-prefix-p "magit" bname) + (string-prefix-p "COMMIT_EDITMSG" bname) + (string-prefix-p "Pfuture-Callback" bname) + (string-prefix-p "treemacs-persist" bname) + (string-match-p "\\.elc\\|\\.tar\\|\\.gz\\|\\.zip\\'" bname) + (string-match-p "\\.bin\\|\\.so\\|\\.dll\\|\\.exe\\'" bname))))) + + ;; Don't save persp configs in `recentf' + (with-eval-after-load 'recentf + (push persp-save-dir recentf-exclude)) + + ;; Eshell integration + (persp-def-buffer-save/load + :mode 'eshell-mode :tag-symbol 'def-eshell-buffer + :save-vars '(major-mode default-directory)) + + ;; Shell integration + (persp-def-buffer-save/load + :mode 'shell-mode :tag-symbol 'def-shell-buffer + :mode-restore-function (lambda (_) (shell)) + :save-vars '(major-mode default-directory))) + +;; Project integration + + (use-package persp-mode-project-bridge + :autoload (persp-mode-project-bridge-find-perspectives-for-all-buffers + persp-mode-project-bridge-kill-perspectives) + :hook + (persp-mode-project-bridge-mode . (lambda () + (if persp-mode-project-bridge-mode + (persp-mode-project-bridge-find-perspectives-for-all-buffers) + (persp-mode-project-bridge-kill-perspectives)))) + (persp-mode . persp-mode-project-bridge-mode) + :init (when (icons-displayable-p) + (setq persp-mode-project-bridge-persp-name-prefix "")) + :config + (with-no-warnings + ;; HACK: Allow saving to files + (defun my-persp-mode-project-bridge-add-new-persp (name) + (let ((persp (persp-get-by-name name *persp-hash* :nil))) + (if (eq :nil persp) + (prog1 + (setq persp (persp-add-new name)) + (when persp + (set-persp-parameter 'persp-mode-project-bridge t persp) + (persp-add-buffer (cl-remove-if-not #'get-file-buffer (project-files (project-current))) + persp nil nil))) + persp))) + (advice-add #'persp-mode-project-bridge-add-new-persp + :override #'my-persp-mode-project-bridge-add-new-persp) + + ;; HACK: Switch to buffer after switching perspective + (defun my-persp-mode-project-bridge-hook-switch (fn &rest _args) + "Switch to a perspective when hook is activated." + (let ((buf (current-buffer))) + (funcall fn) + (when (buffer-live-p buf) + (switch-to-buffer buf)))) + (advice-add #'persp-mode-project-bridge-hook-switch + :around #'my-persp-mode-project-bridge-hook-switch))) + +(provide 'init-persp) +;;; init-persp.el ends here diff --git a/.config/emacs/lisp/init-treemacs.el b/.config/emacs/lisp/init-treemacs.el new file mode 100644 index 0000000..ac04e7c --- /dev/null +++ b/.config/emacs/lisp/init-treemacs.el @@ -0,0 +1,53 @@ +;;; init-treemacs.el -*- lexical-binding: t -*- +(require 'init-const) +(require 'init-funcs) +;; A tree layout file explorer +(use-package treemacs + :commands (treemacs-follow-mode + treemacs-filewatch-mode + treemacs-git-mode) + :custom-face + (cfrs-border-color ((t (:inherit posframe-border)))) + :bind (([f8] . treemacs) + :map treemacs-mode-map + ([mouse-1] . treemacs-single-click-expand-action)) + :config + (setq treemacs-collapse-dirs (if treemacs-python-executable 3 0) + treemacs-missing-project-action 'remove + treemacs-sorting 'alphabetic-asc + treemacs-follow-after-init t + treemacs-width 30 + treemacs-no-png-images nil) + + (treemacs-follow-mode t) + (treemacs-filewatch-mode t) + (pcase (cons (not (null (executable-find "git"))) + (not (null (executable-find "python3")))) + (`(t . t) + (treemacs-git-mode 'deferred)) + (`(t . _) + (treemacs-git-mode 'simple))) + + (use-package treemacs-nerd-icons + :demand + :custom-face + (treemacs-nerd-icons-root-face ((t (:inherit nerd-icons-green :height 1.3)))) + (treemacs-nerd-icons-file-face ((t (:inherit nerd-icons-dsilver)))) + :config (treemacs-load-theme "nerd-icons")) + + (use-package treemacs-magit + :after magit + :autoload treemacs-magit--schedule-update + :hook ((magit-post-commit + git-commit-post-finish + magit-post-stage + magit-post-unstage) + . treemacs-magit--schedule-update)) + + (use-package treemacs-persp + :after persp-mode + :demand t + :functions treemacs-set-scope-type + :config (treemacs-set-scope-type 'Perspectives))) +(provide 'init-treemacs) +;;; init-treemacs.el ends here diff --git a/.config/emacs/lisp/init-ui.el b/.config/emacs/lisp/init-ui.el index 0f25f17..1328391 100644 --- a/.config/emacs/lisp/init-ui.el +++ b/.config/emacs/lisp/init-ui.el @@ -71,8 +71,8 @@ ;; Display dividers between windows (setq window-divider-default-places t - window-divider-default-bottom-width 1 - window-divider-default-right-width 1) + window-divider-default-bottom-width 5 + window-divider-default-right-width 5) (add-hook 'window-setup-hook #'window-divider-mode) (use-package time diff --git a/.config/emacs/lisp/init-vertico.el b/.config/emacs/lisp/init-vertico.el index 893ba1a..5148cc9 100644 --- a/.config/emacs/lisp/init-vertico.el +++ b/.config/emacs/lisp/init-vertico.el @@ -9,6 +9,18 @@ :hook (after-init . vertico-mode) :custom (vertico-cycle t)) +(use-package nerd-icons-completion + :hook (vertico-mode . nerd-icons-completion-mode)) + +(when (display-graphic-p) + (use-package vertico-posframe + :after vertico + :hook (vertico-mode . vertico-posframe-mode) + :config + (setq vertico-posframe-border-width 5))) + ;; (setq vertico-posframe-parameters + ;; '((left-fringe . 20) + ;; (right-fringe . 20))))) ;; simple, but effective sorting and filtering for emacs. (use-package vertico-prescient @@ -33,7 +45,13 @@ (completion-in-region-function #'consult-completion-in-region) :config (global-set-key (kbd "C-s") 'consult-line) - (global-set-key (kbd "C-M-j") 'consult-buffer)) + ;; HACK: https://github.com/Bad-ptr/persp-mode.el/issues/125 + (with-eval-after-load "persp-mode-autoloads" + (defun my/consult-switch-to-buffer () + "`consult-buffer' with buffers provided by persp." + (interactive) + (with-persp-buffer-list () (consult-buffer))) + (global-set-key (kbd "C-M-j") #'my/consult-switch-to-buffer))) (use-package orderless :defer t @@ -85,7 +103,47 @@ :custom (kind-icon-default-face 'corfu-default) ; to compute blended backgrounds correctly :config - (add-to-list 'corfu-margin-formatters #'kind-icon-margin-formatter))) + (add-to-list 'corfu-margin-formatters #'kind-icon-margin-formatter) + (when (icons-displayable-p) + (setq kind-icon-use-icons nil) + (setq kind-icon-mapping + `( + (array ,(nerd-icons-codicon "nf-cod-symbol_array") :face font-lock-type-face) + (boolean ,(nerd-icons-codicon "nf-cod-symbol_boolean") :face font-lock-builtin-face) + (class ,(nerd-icons-codicon "nf-cod-symbol_class") :face font-lock-type-face) + (color ,(nerd-icons-codicon "nf-cod-symbol_color") :face success) + (command ,(nerd-icons-codicon "nf-cod-terminal") :face default) + (constant ,(nerd-icons-codicon "nf-cod-symbol_constant") :face font-lock-constant-face) + (constructor ,(nerd-icons-codicon "nf-cod-triangle_right") :face font-lock-function-name-face) + (enummember ,(nerd-icons-codicon "nf-cod-symbol_enum_member") :face font-lock-builtin-face) + (enum-member ,(nerd-icons-codicon "nf-cod-symbol_enum_member") :face font-lock-builtin-face) + (enum ,(nerd-icons-codicon "nf-cod-symbol_enum") :face font-lock-builtin-face) + (event ,(nerd-icons-codicon "nf-cod-symbol_event") :face font-lock-warning-face) + (field ,(nerd-icons-codicon "nf-cod-symbol_field") :face font-lock-variable-name-face) + (file ,(nerd-icons-codicon "nf-cod-symbol_file") :face font-lock-string-face) + (folder ,(nerd-icons-codicon "nf-cod-folder") :face font-lock-doc-face) + (interface ,(nerd-icons-codicon "nf-cod-symbol_interface") :face font-lock-type-face) + (keyword ,(nerd-icons-codicon "nf-cod-symbol_keyword") :face font-lock-keyword-face) + (macro ,(nerd-icons-codicon "nf-cod-symbol_misc") :face font-lock-keyword-face) + (magic ,(nerd-icons-codicon "nf-cod-wand") :face font-lock-builtin-face) + (method ,(nerd-icons-codicon "nf-cod-symbol_method") :face font-lock-function-name-face) + (function ,(nerd-icons-codicon "nf-cod-symbol_method") :face font-lock-function-name-face) + (module ,(nerd-icons-codicon "nf-cod-file_submodule") :face font-lock-preprocessor-face) + (numeric ,(nerd-icons-codicon "nf-cod-symbol_numeric") :face font-lock-builtin-face) + (operator ,(nerd-icons-codicon "nf-cod-symbol_operator") :face font-lock-comment-delimiter-face) + (param ,(nerd-icons-codicon "nf-cod-symbol_parameter") :face default) + (property ,(nerd-icons-codicon "nf-cod-symbol_property") :face font-lock-variable-name-face) + (reference ,(nerd-icons-codicon "nf-cod-references") :face font-lock-variable-name-face) + (snippet ,(nerd-icons-codicon "nf-cod-symbol_snippet") :face font-lock-string-face) + (string ,(nerd-icons-codicon "nf-cod-symbol_string") :face font-lock-string-face) + (struct ,(nerd-icons-codicon "nf-cod-symbol_structure") :face font-lock-variable-name-face) + (text ,(nerd-icons-codicon "nf-cod-text_size") :face font-lock-doc-face) + (typeparameter ,(nerd-icons-codicon "nf-cod-list_unordered") :face font-lock-type-face) + (type-parameter ,(nerd-icons-codicon "nf-cod-list_unordered") :face font-lock-type-face) + (unit ,(nerd-icons-codicon "nf-cod-symbol_ruler") :face font-lock-constant-face) + (value ,(nerd-icons-codicon "nf-cod-symbol_field") :face font-lock-builtin-face) + (variable ,(nerd-icons-codicon "nf-cod-symbol_variable") :face font-lock-variable-name-face) + (t ,(nerd-icons-codicon "nf-cod-code") :face font-lock-warning-face)))))) (use-package corfu-terminal @@ -93,7 +151,6 @@ (unless (display-graphic-p) (corfu-terminal-mode))) - ;;; Cape ;; Setup Cape for better completion-at-point support and more (use-package cape diff --git a/.config/emacs/lisp/init-window.el b/.config/emacs/lisp/init-window.el new file mode 100644 index 0000000..9d85ee6 --- /dev/null +++ b/.config/emacs/lisp/init-window.el @@ -0,0 +1,33 @@ +;;; init-window.el -*- lexical-binding: t -*- +(require 'init-const) +(require 'init-funcs) + +;; Window swap C-w C-r on evil +(use-package popper + :bind (("C-`" . popper-toggle-latest) + ("M-`" . popper-cycle) + ("C-M-`" . popper-toggle-type)) + :hook (emacs-startup . popper-mode) + :init + (setq popper-reference-buffers + '("\\*Messages\\*" + "Output\\*$" + "\\*Async Shell Command\\*" + "\\*Compile-Log\\*" + help-mode + compilation-mode)) + + (with-eval-after-load 'doom-modeline + (setq popper-mode-line + '(:eval (let ((face (if (doom-modeline--active) + 'mode-line-emphasis + 'mode-line-inactive))) + (if (and (icons-displayable-p) + (bound-and-true-p doom-modeline-mode)) + (format " %s " + (nerd-icons-octicon "nf-oct-pin" :face face)) + (propertize " POP" 'face face)))))) + :config + (popper-echo-mode +1)) +(provide 'init-window) +;;; init-window.el ends here