From 61edd16f0c2c690b4dc9064e57cda9e7f9ee6f22 Mon Sep 17 00:00:00 2001 From: andsy10 Date: Mon, 11 May 2026 22:12:31 +0800 Subject: [PATCH] chore(config): Update Emacs configuration with ibuffer and perspective improvements --- .gitignore | 1 - lisp/init-elpa.el | 2 +- lisp/init-exwm.el | 4 +-- lisp/init-kbd-func.el | 30 ++++++++++++++++++ lisp/init-kbd.el | 13 ++++++-- lisp/init-package.el | 60 +++++++++++++++++++++++++++++++---- lisp/init-startup.el | 2 ++ lisp/init-ui.el | 1 + lisp/init-window.el | 2 ++ lisp/my-base16-dark-theme.el | 2 +- lisp/my-base16-light-theme.el | 2 +- 11 files changed, 102 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index 7b03a07..4662b7c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ !init.el !early-init.el -!custom.el !lisp/ !lisp/**/ !lisp/**/*.el diff --git a/lisp/init-elpa.el b/lisp/init-elpa.el index dcdaf18..9eb8bb5 100644 --- a/lisp/init-elpa.el +++ b/lisp/init-elpa.el @@ -42,7 +42,7 @@ (use-package delight :init (delight '((eldoc-mode nil eldoc) - (org-indent-mode nil org) + (org-indent-mode nil org-indent) (desktop-environment-mode nil desktop-environment) (hs-minor-mode nil hideshow)))) diff --git a/lisp/init-exwm.el b/lisp/init-exwm.el index 9b71c8c..78f2da4 100644 --- a/lisp/init-exwm.el +++ b/lisp/init-exwm.el @@ -132,9 +132,7 @@ (add-hook 'exwm-init-hook (lambda () - (if (zerop (shell-command "pgrep -x fcitx5")) - (restart-fcitx5) - (start-process-shell-command "fcitx5" nil "fcitx5 -d")) + (restart-fcitx5) (unless (zerop (shell-command "pgrep -x mihomo")) (start-process-shell-command "mihomo" nil "mihomo -d ~/.config/mihomo/")) (start-process-shell-command "xrandr-refresh" nil "xrandr --output DP-4 --mode 2560x1440 --rate 165.00") diff --git a/lisp/init-kbd-func.el b/lisp/init-kbd-func.el index 2186419..146e6ed 100644 --- a/lisp/init-kbd-func.el +++ b/lisp/init-kbd-func.el @@ -132,6 +132,36 @@ Disable jinx-mode if it's enable and global-jinx-mode is disable , otherwise tog (magit-section-up) (magit-section-toggle (magit-section-at))) +(defun my-persp-remove-marked-ibuffers () + "Remove marked buffers from perspective." + (interactive) + (let ((buffers (ibuffer-get-marked-buffers))) + (dolist (buf buffers) + (persp-remove-buffer buf)))) + +(defun my-persp-add-marked-ibuffers (persp-name) + "Add marked buffers to perspective." + (interactive + (list (completing-read "Perspective: " + (persp-names) + nil nil))) + (let ((buffers (ibuffer-get-marked-buffers))) + (persp-switch persp-name) + (dolist (buf buffers) + (persp-add-buffer buf)))) + +(defun my-persp-set-marked-ibuffers (persp-name) + "Set marked buffers to perspective." + (interactive + (list (completing-read "Perspective: " + (persp-names) + nil nil))) + (let ((buffers (ibuffer-get-marked-buffers))) + (persp-switch persp-name) + (dolist (buf buffers) + (persp-set-buffer buf)))) + + (provide 'init-kbd-func) ;;; init-kbd-func.el ends here diff --git a/lisp/init-kbd.el b/lisp/init-kbd.el index 1adf9a9..af86619 100644 --- a/lisp/init-kbd.el +++ b/lisp/init-kbd.el @@ -100,8 +100,8 @@ ;; scratch buffer (if *is-mac* - (general-def "C-c " 'persp-switch-to-scratch-buffer) - (general-def "C-c " 'persp-switch-to-scratch-buffer)) + (general-def "C-c " 'scratch-buffer) + (general-def "C-c " 'scratch-buffer)) ;; dired (general-def (dired-mode-map dirvish-mode-map) @@ -177,6 +177,12 @@ (general-def calendar-mode-map "RET" 'denote-journal-calendar-find-file) +;; ibuffer +(general-def ibuffer-mode-map + "h k" 'my-persp-remove-marked-ibuffers + "h A" 'my-persp-set-marked-ibuffers + "h a" 'my-persp-add-marked-ibuffers) + ;; multiple-cursor (general-def mc/keymap "" 'newline) @@ -191,7 +197,8 @@ "C-c p c" nil "C-M-" 'persp-prev "C-M-" 'persp-next - "C-c p d" 'persp-kill) + "C-c p d" 'persp-kill + "C-x M-b" 'persp-ibuffer) ;; global map with C-c prefix (general-def diff --git a/lisp/init-package.el b/lisp/init-package.el index a6d8831..69474a2 100644 --- a/lisp/init-package.el +++ b/lisp/init-package.el @@ -194,13 +194,59 @@ targets." ("C-x p b" . consult-project-buffer)) :config (setq projectile-enable-caching t)) + +;; ibuffer +(use-package ibuffer + :config + (setq ibuffer-saved-filter-groups + '(("Main" + ("App" (mode . exwm-mode)) + ("Scratch" (or + (name . "^*scratch"))) + ("Shell" (or + (mode . eshell-mode) + (mode . eat-mode) + (mode . vterm-mode))) + ("Scripts" (or + (mode . shell-script-mode) + (mode . shell-mode) + (mode . sh-mode) + (mode . lua-mode) + (mode . bat-mode))) + ("Elisp" (mode . emacs-lisp-mode)) + ("Scheme" (or + (mode . scheme-mode) + (name . "^*Geiser"))) + ("Text" (or + (mode . org-mode) + (mode . markdown-mode))) + ("Emacs" (or + (name . "^\\*Help\\*$") + (name . "^\\*Custom.*") + (name . "^\\*Org Agenda\\*$") + (name . "^\\*info\\*$") + (name . "^\\*Backtrace\\*$") + (name . "^\\*Messages\\*$") + (name . "*Chinese-word-segmentation*") + (name . "^*Buffer List*") + (name . "*Calendar*"))) + ("Magit" (or + (mode . magit-blame-mode) + (mode . magit-cherry-mode) + (mode . magit-diff-mode) + (mode . magit-log-mode) + (mode . magit-process-mode) + (mode . magit-status-mode))) + ("Directories" (mode . dired-mode)) + ("Diff" (name . "^*Diff"))))) -(use-package ibuffer-projectile - :init (add-hook 'ibuffer-hook - (lambda () - (ibuffer-projectile-set-filter-groups) - (unless (eq ibuffer-sorting-mode 'alphabetic) - (ibuffer-do-sort-by-alphabetic))))) + (add-hook 'ibuffer-hook + (lambda () (ibuffer-switch-to-saved-filter-groups "Main") + (unless (eq ibuffer-sorting-mode 'alphabetic) + (ibuffer-do-sort-by-alphabetic)))) + + (setq ibuffer-show-empty-filter-groups nil) + (setq ibuffer-use-other-window t)) ;; avy中文支持 (use-package ace-pinyin @@ -296,7 +342,7 @@ targets." (setq switch-to-prev-buffer-skip (lambda (win buff bury-or-kill) (not (persp-is-current-buffer buff)))) - (setq persp-initial-frame-name "desktop")) + (setq persp-initial-frame-name "main")) ;; magit (use-package magit) diff --git a/lisp/init-startup.el b/lisp/init-startup.el index 932bd13..4f69f7d 100644 --- a/lisp/init-startup.el +++ b/lisp/init-startup.el @@ -105,6 +105,8 @@ 'ripgrep) (t 'grep))) +(setq switch-to-buffer-obey-display-actions t) + (provide 'init-startup) ;;; init-startup.el ends here diff --git a/lisp/init-ui.el b/lisp/init-ui.el index 6844c2c..7fb0b9c 100644 --- a/lisp/init-ui.el +++ b/lisp/init-ui.el @@ -32,6 +32,7 @@ ;; org-mode美化 (use-package olivetti + :delight :init (add-hook 'olivetti-mode-hook (lambda () diff --git a/lisp/init-window.el b/lisp/init-window.el index 2082bf1..cbf42e6 100644 --- a/lisp/init-window.el +++ b/lisp/init-window.el @@ -32,6 +32,7 @@ "\\*Edit Annotation.*\\*" "\\*Flutter\\*" "\\*Ibuffer\\*" + "Buffers\\*$" "\\*Geiser Debug\\*" "\\*Kimi-Code\\*" "\\*gptel-agent:.*\\*" @@ -50,6 +51,7 @@ process-menu-mode list-environment-mode cargo-process-mode youdao-dictionary-mode osx-dictionary-mode fanyi-mode gptel-mode + ibuffer-mode "^\\*eshell.*\\*.*$" eshell-mode "^\\*shell.*\\*.*$" shell-mode diff --git a/lisp/my-base16-dark-theme.el b/lisp/my-base16-dark-theme.el index 071fbcc..579273a 100644 --- a/lisp/my-base16-dark-theme.el +++ b/lisp/my-base16-dark-theme.el @@ -33,7 +33,7 @@ `(org-block-end-line ((,class (:foreground ,base01 :overline t :slant italic :extend t)))) `(org-priority ((,class (:foreground ,green :weight bold)))) `(org-checkbox ((,class (:foreground ,base0 :weight bold)))) - `(denote-journal-calendar ((,class (:foreground ,red :slant italic)))) + `(denote-journal-calendar ((,class (:foreground ,cyan :slant italic)))) `(font-lock-keyword-face ((,class (:foreground ,cyan :weight bold)))) `(font-lock-doc-face ((,class (:foreground ,green :slant normal)))) `(font-lock-string-face ((,class (:foreground ,green)))) diff --git a/lisp/my-base16-light-theme.el b/lisp/my-base16-light-theme.el index f56740d..2c44040 100644 --- a/lisp/my-base16-light-theme.el +++ b/lisp/my-base16-light-theme.el @@ -33,7 +33,7 @@ `(org-block-end-line ((,class (:foreground ,base01 :overline t :slant italic :extend t)))) `(org-priority ((,class (:foreground ,green :weight bold)))) `(org-checkbox ((,class (:foreground ,base0 :weight bold)))) - `(denote-journal-calendar ((,class (:foreground ,red :slant italic)))) + `(denote-journal-calendar ((,class (:foreground ,cyan :slant italic)))) `(font-lock-keyword-face ((,class (:foreground ,cyan :weight bold)))) `(font-lock-doc-face ((,class (:foreground ,green :slant normal)))) `(font-lock-string-face ((,class (:foreground ,green))))