From db6d244ba875285e41868088a59e670ac0045b8f Mon Sep 17 00:00:00 2001 From: verdant Date: Wed, 1 Jul 2026 09:26:37 +0800 Subject: Tweak some package and configuration Package: remove evil, dashboard, ivy-posframe configure yasnippet, mu4e Configuration: - Markdown: Add (setup-markdown-writing-environment) when enable markdown-mode and org-mode. - Add pdf-tools --- config.el | 370 +++++++++++++++++++++++++++++++------------------------------- 1 file changed, 188 insertions(+), 182 deletions(-) (limited to 'config.el') diff --git a/config.el b/config.el index ed48203..94e3089 100644 --- a/config.el +++ b/config.el @@ -1,31 +1,41 @@ ;; -*- lexical-binding: t; -*- -(use-package evil - :init - (setq evil-want-keybinding nil - evil-want-C-u-scroll t) - :config - (evil-mode) - :ensure t) -(use-package evil-collection - :after evil - :ensure t - :config - (evil-collection-init)) +(setq user-full-name "Verdant" + user-mail-address "im@verdant.ee") -(use-package olivetti) +(require 'package) +(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) +(add-to-list 'package-archives '("gnu" . "https://elpa.gnu.org/packages/") t) +(add-to-list 'package-archives '("melpa" . "https://mirrors.ustc.edu.cn/elpa/melpa/") t) +(add-to-list 'package-archives '("nongnu" . "https://mirrors.ustc.edu.cn/elpa/nongnu/") t) + +(add-hook 'c-mode-hook + (lambda () + (add-hook 'before-save-hook #'clang-format-buffer nil t))) + +(electric-pair-mode) (use-package yasnippet :ensure t :config + (setq yas-snippet-dirs + '("~/.emacs.d/snippets")) + (yas-global-mode 1)) +(global-set-key (kbd "C-c c") 'compile) + +(use-package gdscript-mode + :ensure t + :hook (gdscript-mode . eglot-ensure)) + (use-package ivy :ensure t :init (ivy-mode 1) (counsel-mode 1) :config + (global-set-key (kbd "C-x r g") nil) (setq ivy-use-selectable-prompt t) (setq ivy-use-preview t) (setq ivy-fixed-height-minibuffer t) @@ -43,14 +53,10 @@ ("C-c V" . 'ivy-pop-view) ("C-x C-@" . 'counsel-mark-ring); 在某些终端上 C-x C-SPC 会被映射为 C-x C-@,比如在 macOS 上,所以要手动设置 ("C-x C-SPC" . 'counsel-mark-ring) + ("C-x r g" . 'counsel-rg) :map minibuffer-local-map ("C-r" . counsel-minibuffer-history))) -;; (use-package ivy-posframe -;; :ensure t -;; :config -;; (ivy-posframe-mode t)) - (use-package ivy-rich :ensure t :config @@ -101,28 +107,52 @@ :config (setq clang-format-executable (executable-find "clang-format"))) -(use-package sis - :config - (sis-ism-lazyman-config "1" "2" 'fcitx5) - (sis-global-cursor-color-mode t) - ;; 启用 /respect/ 模式 - (sis-global-respect-mode t) - ;; 为所有缓冲区启用 /context/ 模式 - (sis-global-context-mode t) - ;; 为所有缓冲区启用 /inline english/ 模式 - (sis-global-inline-mode t) - (with-eval-after-load 'evil - ;; 强制在进入插入模式时触发 sis 的恢复逻辑 - ;;(add-hook 'evil-insert-state-entry-hook #'sis-context-restore) - ; (add-hook 'evil-insert-state-entry-hook #'sis-set-chinese)) - )) +(global-flycheck-mode) -(require 'smtpmail) +(setq dired-recursive-copies 'always) +(setq dired-recursive-deletes 'always) +(setq dired-dwim-target t) -(add-to-list 'load-path "/usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14") +(put 'dired-find-alternate-file 'disabled nil) +(with-eval-after-load 'dired + (define-key dired-mode-map (kbd "RET") 'dired-find-alternate-file) + (define-key dired-mode-map (kbd "^") (lambda () (interactive) (find-alternate-file "..")))) -(setq gnutls-algorithm-priority "NORMAL:%COMPAT") +(defun dired-sort-size () (interactive) (dired-sort-other (concat dired-listing-switches "S"))) +(defun dired-sort-extension () (interactive) (dired-sort-other (concat dired-listing-switches "X"))) +(defun dired-sort-ctime () (interactive) (dired-sort-other (concat dired-listing-switches "ct"))) +(defun dired-sort-utime () (interactive) (dired-sort-other (concat dired-listing-switches "ut"))) +(defun dired-sort-time () (interactive) (dired-sort-other (concat dired-listing-switches "t"))) +(defun dired-sort-name () (interactive) (dired-sort-other (concat dired-listing-switches ""))) +(add-hook 'dired-mode-hook + (lambda () + (define-key dired-mode-map (kbd "C-b") nil) + (define-key dired-mode-map (kbd "C-f") nil) + (define-key dired-mode-map (kbd "C-b") #'dired-up-directory) + (define-key dired-mode-map (kbd "C-f") #'dired-find-file))) + +(global-auto-revert-mode t) + +;; https://kuanyui.github.io/2014/06/21/dired-tutorial-and-essential-configs/ + (defun dired-directory-sort () + "Dired sort hook to list directories first." + (save-excursion + (let (buffer-read-only) + (forward-line 2) ;; beyond dir. header + (sort-regexp-fields t "^.*$" "[ ]*." (point) (point-max)))) + (and (featurep 'xemacs) + (fboundp 'dired-insert-set-properties) + (dired-insert-set-properties (point-min) (point-max))) + (set-buffer-modified-p nil)) + +(add-hook 'dired-after-readin-hook 'dired-directory-sort) + +(setq dired-listing-switches "-alh") + +(require 'smtpmail) +(add-to-list 'load-path "/usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14") +(setq gnutls-algorithm-priority "NORMAL:%COMPAT") (defun mu4e-goodies~break-cjk-word (word) "Break CJK word into list of bi-grams like: 我爱你 -> 我爱 爱你" (if (or (<= (length word) 2) @@ -182,9 +212,7 @@ (mu4e-hide-index-messages t) :init - (setq user-mail-address "im@verdant.ee" - user-full-name "Verdant" - mu4e-debug t) + (setq mu4e-debug t) (setq message-send-mail-function 'sendmail-send-it sendmail-program "/usr/bin/msmtp" @@ -208,12 +236,24 @@ :name "Verdant" :match-func (lambda (msg) (when msg - (string-prefix-p "/ljc" (mu4e-message-field msg :maildir)))) + (string-prefix-p "/verdant" (mu4e-message-field msg :maildir)))) :vars '((mu4e-sent-folder . "/Verdant/Sent") (mu4e-trash-folder . "/Verdant/Trash") (mu4e-refile-folder . "/Verdant/Archive") (mu4e-drafts-folder . "/Verdant/Drafts") - (user-mail-address . "im@verdant.ee"))))) + (user-mail-address . "im@verdant.ee"))) + + (make-mu4e-context + :name "Outlook" + :match-func (lambda (msg) + (when msg + (string-prefix-p "/outlook" (mu4e-message-field msg :maildir)))) + :vars '((mu4e-sent-folder . "/Outlook/Sent") + (mu4e-trash-folder . "/Outlook/Trash") + (mu4e-refile-folder . "/Outlook/Archive") + (mu4e-drafts-folder . "/Outlook/Drafts") + (user-mail-address . "verdant.im@outlook.com") + (user-full-name . "Verdant"))))) (setq mu4e-compose-complete-only-personal t mu4e-view-show-addresses t @@ -272,33 +312,27 @@ :bind (("C-x o" . ace-window))) -(use-package dashboard - :ensure t - :config - (setq dashboard-startup-banner 'logo - dashboard-banner-logo-title "Welcome to Verdant's Emacverse!!!" - dashboard-center-content t - dashboard-set-heading-icons t - dashboard-items '((recents . 10) - (bookmarks . 5)) - dashboard-footer-messages '("verdant.el")) - - ;; 核心三件套 - (setq initial-buffer-choice (lambda () (get-buffer-create "*dashboard*"))) - (dashboard-setup-startup-hook) - (add-hook 'after-init-hook #'dashboard-open t)) +(add-hook 'after-init-hook + (lambda () + (setq inhibit-startup-screen t) + (setq initial-buffer-choice "~"))) (setq custom-safe-themes t) -(load-theme 'doom-Iosvkem) - -(set-face-attribute - 'default nil - :height 120) +(when (display-graphic-p) + ;(load-theme 'ef-dark) + (load-theme 'doom-Iosvkem) + ) -(setq window-combination-resize t) +(setq default-frame-alist '((alpha-background . 100))) (setq x-stretch-cursor t) +(set-fontset-font t 'han (font-spec :family "Noto Sans CJK SC")) +(set-fontset-font t 'cjk-misc (font-spec :family "Noto Sans CJK SC")) +(set-fontset-font t 'bopomofo (font-spec :family "Noto Sans CJK SC")) + +(set-frame-font (font-spec :family "FiraMono Nerd Font Mono" :size 18)) + (setq scheme-program-name "mit-scheme") (require 'cmuscheme) @@ -310,152 +344,124 @@ (add-to-list 'auto-mode-alist '("\\.scm\\'" . scheme-mode)) +(use-package olivetti) (defun setup-markdown-writing-environment () "为 Markdown 写作优化的环境:开启 Olivetti,关闭行号。" (interactive) - (variable-pitch-mode 1) - (display-line-numbers-mode -1) - (pixel-scroll-precision-mode 1) - (olivetti-mode)) + (olivetti-mode) + + (display-line-numbers-mode -1) + ) (add-hook 'markdown-mode-hook (lambda () - ;; 取消 Evil 的 TAB 绑定,使用 markdown-cycle - (define-key evil-normal-state-local-map (kbd "TAB") 'markdown-cycle) - (define-key evil-insert-state-local-map (kbd "TAB") 'indent-for-tab-command))) + (setup-markdown-writing-environment))) -(setq dired-recursive-copies 'always) -(setq dired-recursive-deletes 'always) -(setq dired-dwim-target t) +(setq org-agenda-files '("~/org/")) +(global-set-key (kbd "C-c a") 'org-agenda) -(put 'dired-find-alternate-file 'disabled nil) -(with-eval-after-load 'dired - (define-key dired-mode-map (kbd "RET") 'dired-find-alternate-file) - (define-key dired-mode-map (kbd "^") (lambda () (interactive) (find-alternate-file "..")))) ; was dired-up-directory) +(defun my-org-mode-setup () + (setq left-margin-width 1) + (setq right-margin-width 2) + (org-restart-font-lock) + (font-lock-mode 1)) -(setq dired-dwim-target t) +(add-hook 'org-mode-hook 'my-org-mode-setup) -;; dired-sort -(defun dired-sort-size () - "Dired sort by size." - (interactive) - (dired-sort-other (concat dired-listing-switches "S"))) +(setq org-startup-indented t + org-ellipsis "  " + org-pretty-entities t + org-hide-emphasis-markers nil + org-src-fontify-natively t + org-src-tab-acts-natively t + org-agenda-block-separator "" + org-fontify-whole-heading-line t + org-fontify-done-headline t + org-fontify-quote-and-verse-blocks t) -(defun dired-sort-extension () - "Dired sort by extension." - (interactive) - (dired-sort-other (concat dired-listing-switches "X"))) +(use-package ox-reveal + :ensure t + :config + (global-set-key [(f12)] 'org-reveal-export-to-html-and-browse) + (reveal-mode 1)) +(setq org-reveal-root "https://cdn.jsdelivr.net/npm/reveal.js@4.5.0") + +(use-package org-noter +:ensure t +:config +(setq org-noter-notes-search-path '("~/org/wiki/"))) + +(use-package pdf-tools + :ensure t + :config + (pdf-tools-install) + (add-hook 'pdf-view-mode-hook (lambda () (display-line-numbers-mode -1))) + (add-hook 'pdf-view-mode-hook 'pdf-tools-enable-minor-modes) + (setq org-noter-always-create-frame nil) + (setq org-noter-window-layout 'horizontal-split) ; 强制在当前屏幕左右水平分屏 +) -(defun dired-sort-ctime () - "Dired sort by create time." +(defun my/keyboard-escape-quit() + "快速的 Esc 退出 minibuffer" (interactive) - (dired-sort-other (concat dired-listing-switches "ct"))) + (keyboard-escape-quit)) -(defun dired-sort-utime () - "Dired sort by access time." - (interactive) - (dired-sort-other (concat dired-listing-switches "ut"))) +(global-set-key (kbd "") #'my/keyboard-escape-quit) -(defun dired-sort-time () - "Dired sort by time." - (interactive) - (dired-sort-other (concat dired-listing-switches "t"))) +(auto-save-mode 1) (setq ring-bell-function 'ignore custom-safe-themes + t cursor-type 'box fringes-outside-margins t display-time-24hr-format + t display-time-day-and-date t display-time-interval 60 + display-time-format "%a %b %-e %H:%M" scroll-step 1 + scroll-conservatively 10000) -(defun dired-sort-name () - "Dired sort by name." - (interactive) - (dired-sort-other (concat dired-listing-switches ""))) -;; 在 Dired 中,按`l`进入文件,按`h`回到上一级目录 -(add-hook 'evil-mode-hook (lambda () - (with-eval-after-load 'dired - (add-hook 'dired-mode-hook - (lambda () - (define-key evil-normal-state-local-map (kbd "h") nil) - (define-key evil-normal-state-local-map (kbd "l") nil) - (define-key evil-normal-state-local-map (kbd "h") #'dired-up-directory) - (define-key evil-normal-state-local-map (kbd "l") #'dired-find-file)))))) +(when (display-graphic-p) (set-frame-size (selected-frame) 143 40)) -(add-hook 'dired-mode-hook - (lambda () - (define-key dired-mode-map (kbd "C-b") nil) - (define-key dired-mode-map (kbd "C-f") nil) - (define-key dired-mode-map (kbd "C-b") #'dired-up-directory) - (define-key dired-mode-map (kbd "C-f") #'dired-find-file))) +;; (if (fboundp 'global-display-line-numbers-mode) +;; (global-display-line-numbers-mode -1) (setq +;; display-line-numbers-type nil)) -(global-set-key (kbd "") #'my/keyboard-escape-quit) +;; (display-time-mode 1) +(global-display-line-numbers-mode) -(global-auto-revert-mode t) ; 另一程序修改文件让 Emacs 及时刷新 Buffer +(setq-default delete-by-moving-to-trash t) -(use-package org-bullets - :ensure t - :config - (setq org-bullets-bullet-list '("☰" "☷" "☯" "☭"))) -(org-bullets-mode) +(show-paren-mode 1) -(lambda () (progn - (setq left-margin-width 2) - (setq right-margin-width 2) - (set-window-buffer nil (current-buffer)))) +(setq c-basic-offset 4 tab-width 4) -(setq org-startup-indented t - org-ellipsis "  " ;; folding symbol - org-pretty-entities t - org-hide-emphasis-markers t - ;; show actually italicized text instead of /italicized text/ - org-agenda-block-separator "" - org-fontify-whole-heading-line t - org-fontify-done-headline t - org-fontify-quote-and-verse-blocks t) +(use-package counsel :ensure t) -(auto-save-mode 1) - -(setq ring-bell-function 'ignore - custom-safe-themes t ; 禁用非法操作提示 - cursor-type 'box - fringes-outside-margins t - display-time-24hr-format t ; 时间使用 24 小时制 - display-time-day-and-date t ; 时间显示包括日期和时间 - display-time-interval 60 ; 刷新频率 - display-time-format "%a %b %-e %H:%M" ; 时间格式 - scroll-step 1 - scroll-conservatively 10000) -(when (display-graphic-p) - (set-frame-size (selected-frame) 143 40)) -(global-display-line-numbers-mode t) -(display-time-mode 1) - -(setq confirm-kill-emacs #'yes-or-no-p ; 关闭 Emacs 时询问 y or n - auto-save-visited-interval 5 - native-comp-async-report-warinings-errors nil - backup-directory-alist `((".*" . ,temporary-file-directory)) - auto-save-file-name-transforms `((".*" ,temporary-file-directory t)) - select-enable-clipboard t - select-enable-primary t - interprogram-cut-function - (lambda (text &optional push) - (let ((process-connection-type nil)) - (let ((proc (start-process "xclip" nil "xclip" "-selection" "clipboard"))) - (process-send-string proc text) - (process-send-eof proc)))) - interprogram-paste-function - (lambda () - (shell-command-to-string "xclip -o -selection clipboard"))) - -(setq-default delete-by-moving-to-transh t) +(setopt use-short-answers t) -(defun my/keyboard-escape-quit() - "快速的 Esc 退出 minibuffer" - (interactive) - (keyboard-escape-quit)) +(repeat-mode 1) +(setopt repeat-exit-key "RET") -(global-set-key (kbd "") #'my/keyboard-escape-quit) +(global-set-key (kbd "C-x t") (lambda () (interactive) (goto-char + (point-min)) (forward-line 1) + (org-babel-tangle))) -(show-paren-mode 1) ; 减轻数括号的痛苦 +(setq + backup-by-copying t ; 自动备份 + backup-directory-alist + '(("." . "~/tmp")) ; 自动备份目录 + delete-old-versions t ; 自动删除旧的备份文件 + kept-new-versions 3 ; 保留最近的3个备份文件 + kept-old-versions 1 ; 保留最早的1个备份文件 + version-control t) ; 多次备份 -(provide 'config) +(use-package vterm :ensure t) -(setq c-basic-offset 4 - tab-width 4) +(use-package elfeed-org + :ensure t + :config + (setq rmh-elfeed-org-files (list "~/.emacs.d/elfeed.org"))) +(elfeed-org) + +(add-hook 'elfeed-show-mode-hook (lambda () + (display-line-numbers-mode -1) + (olivetti-mode))) -(use-package counsel - :ensure t) +(setq mastodon-instance-url "https://akk.glowisle.me" + mastodon-active-user "verdabt") + +(provide 'config) -- cgit v1.2.3