From e6b1e1b59574da35e41cdac8c6098bbba456b217 Mon Sep 17 00:00:00 2001 From: js0ny Date: Wed, 29 Jan 2025 03:01:59 +0000 Subject: [PATCH] feat(emacs): evil, appearance and edit * evil: Text Object (l -> inner) and Evil-Surround * appearance: mode line (doom) and bufferline (built-in) * edit: vertico and marginalia --- tools/emacs.d/custom.el | 2 +- tools/emacs.d/init.el | 2 ++ tools/emacs.d/lisp/init-appearance.el | 29 +++++++++++++++++++++++++++ tools/emacs.d/lisp/init-basic.el | 7 ------- tools/emacs.d/lisp/init-edit.el | 22 ++++++++++++++++++++ tools/emacs.d/lisp/init-evil.el | 12 +++++++++++ tools/emacs.d/lisp/init-file.el | 24 ++++++++++++++++++++++ tools/emacs.d/lisp/init-package.el | 22 +++++++++----------- 8 files changed, 99 insertions(+), 21 deletions(-) create mode 100644 tools/emacs.d/lisp/init-appearance.el create mode 100644 tools/emacs.d/lisp/init-edit.el create mode 100644 tools/emacs.d/lisp/init-file.el diff --git a/tools/emacs.d/custom.el b/tools/emacs.d/custom.el index 3f4b845..31c9915 100644 --- a/tools/emacs.d/custom.el +++ b/tools/emacs.d/custom.el @@ -4,7 +4,7 @@ ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. '(package-selected-packages - '(gnu-elpa-keyring-update--keyring gnu-elpa-keyring-update lsp-mode catppuccin-theme use-package evil company))) + '(marginalia vertico doom-modeline wakatime-mode evil-surround all-the-icons dired-single gnu-elpa-keyring-update--keyring gnu-elpa-keyring-update lsp-mode catppuccin-theme use-package evil company))) (custom-set-faces ;; custom-set-faces was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. diff --git a/tools/emacs.d/init.el b/tools/emacs.d/init.el index f7b431f..ea4ec51 100644 --- a/tools/emacs.d/init.el +++ b/tools/emacs.d/init.el @@ -19,8 +19,10 @@ ;; Load each modules (require 'init-package) ; package manager should be loaded first (require 'init-basic) +(require 'init-appearance) ; package manager should be loaded first (require 'init-keymaps) (require 'init-evil) +(require 'init-file) ;; (require 'init-lsp) ; FIXME: See .emacs.d/lisp/init-lsp.el ;; Load `custom` file diff --git a/tools/emacs.d/lisp/init-appearance.el b/tools/emacs.d/lisp/init-appearance.el new file mode 100644 index 0000000..2d9bc6a --- /dev/null +++ b/tools/emacs.d/lisp/init-appearance.el @@ -0,0 +1,29 @@ +;;; init-appearance.el + +(when (display-graphic-p) + (add-to-list 'default-frame-alist '(font . "JetBrainsMono NF"))) + +;; Icon Support +;; Once installed, Manually install the fonts required: +;; M-x all-the-icons-install-fonts +;; If under Microsoft Windows, the Installation Directory should be chosen +;; and right-click them to install the fonts +(use-package all-the-icons + :if (display-graphic-p)) + + +(use-package catppuccin-theme + :config + (setq catppuccin-flavor 'mocha) ; This looks like shit in terminal mode + (load-theme 'catppuccin t)) + + +;; Better mode line, see (L7) Icon install +;; M-x nerd-icons-install-fonts +(use-package doom-modeline + :ensure t + :init (doom-modeline-mode 1)) + +(global-tab-line-mode) ; bufferline + +(provide 'init-appearance) diff --git a/tools/emacs.d/lisp/init-basic.el b/tools/emacs.d/lisp/init-basic.el index 77402d7..d9730de 100644 --- a/tools/emacs.d/lisp/init-basic.el +++ b/tools/emacs.d/lisp/init-basic.el @@ -14,13 +14,6 @@ ;; https://book.emacs-china.org/#orgcfd105e Open with Emacs (server-mode 1) -(when (display-graphic-p) - (add-to-list 'default-frame-alist '(font . "JetBrainsMono NF"))) - -(use-package catppuccin-theme - :config - (setq catppuccin-flavor 'mocha) ; This looks like shit in terminal mode - (load-theme 'catppuccin t)) (require 'recentf) (recentf-mode 1) diff --git a/tools/emacs.d/lisp/init-edit.el b/tools/emacs.d/lisp/init-edit.el new file mode 100644 index 0000000..a8d59a6 --- /dev/null +++ b/tools/emacs.d/lisp/init-edit.el @@ -0,0 +1,22 @@ +;;; init-edit.el + +;; Company - Complete Anything +(use-package company + :ensure t + :hook (after-init . global-company-mode) ; 在启动后自动启用 global-company-mode + :bind (:map company-active-map ; TODO: Seems does not work + ("C-n" . company-select-next) + ("C-p" . company-select-previous)) + :config + (setq company-minimum-prefix-length 1 ; 设置最短补全前缀 + company-idle-delay 0.2)) ; 设置补全延迟(秒) + +;; minibuffer 补全增强 +(use-package vertico + :init + (vertico-mode)) + +;; 提供补全注解 +(use-package marginalia + :init + (marginalia-mode)) diff --git a/tools/emacs.d/lisp/init-evil.el b/tools/emacs.d/lisp/init-evil.el index d255b06..5821032 100644 --- a/tools/emacs.d/lisp/init-evil.el +++ b/tools/emacs.d/lisp/init-evil.el @@ -22,6 +22,12 @@ "E" '(lambda () (interactive) (evil-previous-line 5)) ; 5e )) +;; Text Objects Keymap - Use `l` for inner (swap i and l) +;; https://github.com/emacs-evil/evil/blob/master/evil-maps.el#L398-L421 +(define-key evil-visual-state-map "l" evil-inner-text-objects-map) +(define-key evil-operator-state-map "l" evil-inner-text-objects-map) + + ;; Provides Vim-like Leader key (use-package evil-leader :after evil @@ -37,5 +43,11 @@ :config (evil-commentary-mode)) +;; Evil Surround: Vim-surround Evil fork +(use-package evil-surround + :after evil + :config + (global-evil-surround-mode 1)) + (provide 'init-evil) diff --git a/tools/emacs.d/lisp/init-file.el b/tools/emacs.d/lisp/init-file.el new file mode 100644 index 0000000..4aa7a40 --- /dev/null +++ b/tools/emacs.d/lisp/init-file.el @@ -0,0 +1,24 @@ +;;; init-file.el -- File Management configuration +;;; First edit at 2025/01/29 + +;; Dired + +;; Dired Configuration +(with-eval-after-load 'dired + (setq dired-recursive-deletes 'top) ;; Ask Before Delete Dir + (setq dired-recursive-copies 'always) ;; Always Copy Dir + (setq dired-dwim-target t)) ;; dwim for Do What I Mean - 当分屏显示两个 Buffer 时,复制或移动文件会自动将另一个 dired buffer 作为目标目录 + +;; Dired Keybindings - Colemak +(evil-define-key 'normal dired-mode-map + "h" 'dired-up-directory + "i" 'dired-find-file + "n" 'dired-next-line + "e" 'dired-previous-line) + +;; This prevents Dired from opening more buffers +;; https://stackoverflow.com/q/1839313 +(setq dired-kill-when-opening-new-dired-buffer t) + + +(provide 'init-file) diff --git a/tools/emacs.d/lisp/init-package.el b/tools/emacs.d/lisp/init-package.el index 0aca5b0..4f7ce63 100644 --- a/tools/emacs.d/lisp/init-package.el +++ b/tools/emacs.d/lisp/init-package.el @@ -4,7 +4,7 @@ (require 'package) ; Add sources ;; (setq gnutls-algorithm-priority "NORMAL:-VERS-TLS1.3") -(setq package-archives '(("melpa" . "https://melpa.org/packages/") +(setq package-archives '(("melpa" . "https://melpa.org/packages/") ("org" . "https://orgmode.org/elpa/") ("gnu" . "https://elpa.gnu.org/packages/"))) ;; Initialise the package management system @@ -15,14 +15,14 @@ (package-refresh-contents)) ;; Ensure use-package is installed -(unless (package-installed-p 'use-package) +(unless (package-installed-p 'use-package) ; (package-refresh-contents) Move to above (package-install 'use-package)) ;; Use `use-package` for plugin management (eval-when-compile (require 'use-package)) -(setq use-package-always-ensure t) +(setq use-package-always-ensure t) ;; This part initialse the GPG Keyring ; Disable signature first @@ -33,16 +33,6 @@ ; Re-enable signature (setq package-check-signature 'allow-unsigned) -;; Company - Complete Anything -(use-package company - :ensure t - :hook (after-init . global-company-mode) ; 在启动后自动启用 global-company-mode - :bind (:map company-active-map ; TODO: Seems does not work - ("C-n" . company-select-next) - ("C-p" . company-select-previous)) - :config - (setq company-minimum-prefix-length 1 ; 设置最短补全前缀 - company-idle-delay 0.2)) ; 设置补全延迟(秒) ;; Which Key - Prompt available commands (use-package which-key @@ -74,5 +64,11 @@ ; +(use-package wakatime-mode + :ensure t + :config + (global-wakatime-mode)) + + (provide 'init-package) ;;; init-package.el ends here