refactor: restructure Emacs config and add org journal features

- Add .gitignore for config management
- Fix early-init compatibility for tool-bar-mode
- Add org-journal, org-super-agenda, and org-ql support
- Improve consult with cross-platform file search
- Add embark-export keybinding
This commit is contained in:
User
2026-03-26 00:15:24 +08:00
parent 0f4ddc392c
commit d7d81d8fbf
6 changed files with 175 additions and 137 deletions

13
.gitignore vendored Normal file
View File

@@ -0,0 +1,13 @@
# 忽略所有文件
*
# 保留特定配置文件
!init.el
!early-init.el
!custom.el
!lisp/
!lisp/**/
!lisp/**/*.el
# 保留 .gitignore 本身
!.gitignore

View File

@@ -1,9 +1,10 @@
(setq package-enable-at-startup nil) (setq package-enable-at-startup nil)
(setq inhibit-startup-screen t) ; 禁用开始菜单 (setq inhibit-startup-screen t) ; 禁用开始菜单
(tool-bar-mode -1) ; 禁用工具栏 (when (fboundp 'tool-bar-mode)
(tool-bar-mode -1) ; 禁用工具栏
(scroll-bar-mode -1)) ; 禁用滚动条
(menu-bar-mode -1) ; 禁用菜单栏 (menu-bar-mode -1) ; 禁用菜单栏
(scroll-bar-mode -1) ; 禁用滚动条
(setq display-line-numbers-type '2) (setq display-line-numbers-type '2)
(global-display-line-numbers-mode t) ; 启用行号 (global-display-line-numbers-mode t) ; 启用行号
(setq display-line-numbers-grow-only t) ; 行号栏只增不减 (setq display-line-numbers-grow-only t) ; 行号栏只增不减

View File

@@ -18,4 +18,3 @@
(require 'init-kbd) (require 'init-kbd)
(require 'init-ui) (require 'init-ui)
(require 'init-segmentation) (require 'init-segmentation)
(put 'scroll-left 'disabled nil)

View File

@@ -128,10 +128,16 @@
(global-set-key (kbd "C-c i") 'consult-imenu) ;; imenu (global-set-key (kbd "C-c i") 'consult-imenu) ;; imenu
(global-set-key (kbd "C-c f r") 'consult-recent-file) ;; 最近打开 (global-set-key (kbd "C-c f r") 'consult-recent-file) ;; 最近打开
(global-set-key (kbd "C-c f f") 'consult-fd) ;; 调用fd进行目录内搜索 (global-set-key (kbd "C-c f f") 'consult-fd) ;; 调用fd进行目录内搜索
(global-set-key (kbd "C-c f l") 'consult-locate) ;; consult-locate
(global-set-key (kbd "C-c f g") 'consult-ripgrep) ;; consult-ripgrep (global-set-key (kbd "C-c f g") 'consult-ripgrep) ;; consult-ripgrep
(global-set-key (kbd "C-c y") 'consult-yank-from-kill-ring) ;; 从kill ring中粘贴 (global-set-key (kbd "C-c y") 'consult-yank-from-kill-ring) ;; 从kill ring中粘贴
(global-set-key (kbd "C-x r b") 'consult-bookmark) ;; 书签菜单embark中有更多操作 (global-set-key (kbd "C-x r b") 'consult-bookmark) ;; 书签菜单embark中有更多操作
(define-key minibuffer-local-map (kbd "C-c C-e") 'embark-export) ;; 把minibuffer结果在一个菜单中显示
(if *is-mac*
(progn
(global-set-key (kbd "C-c f l") 'consult-fd-global)
(global-set-key (kbd "C-c f m") 'consult-locate))
(global-set-key (kbd "C-c f l") 'consult-locate)
(global-set-key (kbd "C-c f m") 'consult-fd-global))
;; hungry-delete ;; hungry-delete
(global-set-key (kbd "C-c DEL") 'hungry-delete-backward) ;; 向后删除到第一个非空字符 (global-set-key (kbd "C-c DEL") 'hungry-delete-backward) ;; 向后删除到第一个非空字符

View File

@@ -3,6 +3,95 @@
(use-package org) (use-package org)
;; org-contrib 和 org-checklist
(use-package org-contrib
:straight (org-contrib :type git :host github :repo "emacsmirror/org-contrib"
:depth 1))
(add-hook 'org-mode-hook
(lambda ()
(require 'org-checklist nil t)))
;; org-journal
(use-package org-journal
:config
(setq org-journal-file-format "%Y-%m-%d.org"
org-journal-file-header "#+title: Daily Journal\n#+category: journal\n\n"
org-journal-time-format "%m-%d %R \n:PROPERTIES:\n:Created: <%Y-%m-%d %a %H:%M:%S>\n:END:\n"
org-journal-time-prefix "\n*** TODO "
org-journal-hide-entries-p t
org-journal-date-format (lambda (time)
(format "* %s %s\n:PROPERTIES:\n:Created: [%s]\n:END:"
(format-time-string "%Y-%m-%d" time)
(format-time-string "%a" time)
(format-time-string "%Y-%m-%d %a" time))))
(when *is-windows*
(setq org-journal-dir "D:/emacs/my-org-daily/"))
(when *is-mac*
(setq org-journal-dir "~/org/my-org-daily/"))
(add-hook 'org-journal-mode-hook 'font-lock-update)
(defun my/journal-setup-new-day ()
(save-excursion
(org-back-to-heading)
(let ((day-end (save-excursion (org-end-of-subtree) (point))))
(unless (search-forward "** daily" day-end t)
(goto-char day-end)
(insert "\n\n** daily\n\n\n")
(insert "** tasks\n")))))
(add-hook 'org-journal-after-header-create-hook #'my/journal-setup-new-day)
(defun my/journal-position-cursor-after-time ()
(when (derived-mode-p 'org-journal-mode)
(org-back-to-heading)
(end-of-line)))
(add-hook 'org-journal-after-entry-create-hook #'my/journal-position-cursor-after-time)
(defun org-journal-open-entry-for-editing (&optional event)
"Open journal entry for the date under cursor in calendar for editing."
(interactive
(list last-nonmenu-event))
(let* ((date (calendar-cursor-to-date t event))
(time (org-journal--calendar-date->time date))
(org-journal-file (org-journal--get-entry-path time)))
(if (file-exists-p org-journal-file)
(progn
(funcall org-journal-find-file org-journal-file)
(unless (org-journal--daily-p)
(org-journal--goto-entry date)))
(message "No journal entry for this date."))))
(defun my/org-journal-mark-old-todos-as-comment (entries)
"Change of TODO entry's TODO key word to COMMENT after carryover."
(save-excursion
(mapc (lambda (entry)
(let ((start (car entry))
(end (cadr entry)))
(goto-char start)
(when (re-search-forward "^\\(\\*+ \\)TODO\\>" end t)
(replace-match "\\1COMMENT" t nil))))
(reverse entries)))
(save-buffer))
(setq org-journal-handle-old-carryover-fn #'my/org-journal-mark-old-todos-as-comment))
;; 在org-journal加载cns-mode
(add-hook 'org-journal-mode-hook
(lambda ()
(global-cns-mode-enable-in-buffer)))
;; 一些随org-mode加载的基础配置
(add-hook 'org-mode-hook
(lambda ()
(require 'org-tempo)
(org-indent-mode)
(local-set-key (kbd "C-c i") 'consult-org-heading)))
;; 预加载防止windows的org-mode加载卡顿 ;; 预加载防止windows的org-mode加载卡顿
(if *is-windows* (if *is-windows*
(progn (run-with-idle-timer (progn (run-with-idle-timer
@@ -13,18 +102,6 @@
(org-mode)) (org-mode))
(message "Org preloaded"))))) (message "Org preloaded")))))
;; 一些随org-mode加载的基础配置
(add-hook 'org-mode-hook
(lambda ()
(require 'org-tempo)
(org-indent-mode)
(local-set-key (kbd "C-c i") 'consult-org-heading)))
;; 设置todo关键字
(setq org-todo-keywords
(quote ((sequence "TODO(t)" "STARTED(s)" "|" "DONE(d!/!)")
(sequence "WAITING(w@/!)" "SOMEDAY(S)" "|" "CANCELLED(c@/!)" "MEETING(m)" "PHONE(p)"))))
;; 设置标题字体大小 ;; 设置标题字体大小
;; (dolist (face org-level-faces) ;; (dolist (face org-level-faces)
;; (set-face-attribute face nil :height 1)) ;; (set-face-attribute face nil :height 1))
@@ -36,6 +113,45 @@
;; 将系统时间(星期)设为英文,防止中文乱码 ;; 将系统时间(星期)设为英文,防止中文乱码
(setq system-time-locale "C") (setq system-time-locale "C")
;; 设置todo关键字
(setq org-todo-keywords
(quote ((sequence "TODO(t)" "STARTED(s)" "|" "DONE(d!/!)")
(sequence "WAITING(w@/!)" "SOMEDAY(S)" "|" "CANCELLED(c@/!)" "MEETING(m)" "PHONE(p)"))))
;; agenda相关
(global-set-key (kbd "C-c a") 'org-agenda)
(when *is-windows*
(with-eval-after-load 'org
(setq org-agenda-files '("d:/emacs/org/learning-org-mode.org"
"d:/emacs/hugo/this-is-my-blog/all-blog.org"
"d:/emacs/my-org-daily/")))) ; agenda文件目录或文件
(when *is-mac*
(with-eval-after-load 'org
(setq org-agenda-files '("~/org/my-org-daily"))))
(setq org-agenda-span 'day)
(setq org-default-priority ?D)
;; org-super-agenda 配置
(use-package org-super-agenda
:after org-agenda
:config
(org-super-agenda-mode))
;; org-ql
(use-package org-ql)
;; 自定义已完成任务视图
(setq org-agenda-custom-commands
'(("pa" "Priority >= A"
((tags-todo "+PRIORITY=\"A\"")))
("pb" "Priority >= B"
((tags-todo "+PRIORITY<=\"B\"")))
("pc" "Priority >= C"
((tags-todo "+PRIORITY<=\"C\"")))))
;; capture模板 ;; capture模板
(when *is-windows* (when *is-windows*
(setq org-capture-templates (setq org-capture-templates
@@ -53,34 +169,13 @@
(global-set-key (kbd "C-c o c") 'org-capture) (global-set-key (kbd "C-c o c") 'org-capture)
(setq org-agenda-custom-commands ;; 批量调整表格
'(("c" "important stuff" (defun org-table-align-all ()
((tags-todo "+PRIORITY=\"A\""))) "Ajust all table in current buffer."
;; ...other commands here (interactive)
)) (save-excursion
(goto-char (point-min))
;; org-contrib 和 org-checklist (org-table-map-tables 'org-table-align t)))
(use-package org-contrib
:straight (org-contrib :type git :host github :repo "emacsmirror/org-contrib"
:depth 1))
(add-hook 'org-mode-hook
(lambda ()
(require 'org-checklist nil t)))
;; agenda相关
(global-set-key (kbd "C-c a") 'org-agenda)
(when *is-windows*
(with-eval-after-load 'org
(setq org-agenda-files '("d:/emacs/org/learning-org-mode.org"
"d:/emacs/hugo/this-is-my-blog/all-blog.org"
"d:/emacs/my-org-daily/")))) ; agenda文件目录或文件
(when *is-mac*
(with-eval-after-load 'org
(setq org-agenda-files '("~/org/my-org-daily"))))
(setq org-agenda-span 'day)
;; hugo ;; hugo
(with-eval-after-load 'org-capture (with-eval-after-load 'org-capture
@@ -151,85 +246,4 @@ See `org-capture-templates' for more information."
(global-set-key (kbd "C-c o v") 'my-blog-preview) (global-set-key (kbd "C-c o v") 'my-blog-preview)
;; 批量调整表格
(defun org-table-align-all ()
"Ajust all table in current buffer."
(interactive)
(save-excursion
(goto-char (point-min))
(org-table-map-tables 'org-table-align t)))
;; org-journal
(use-package org-journal
:config
(setq org-journal-file-format "%Y-%m-%d.org"
org-journal-file-header "#+title: Daily Journal\n#+category: journal\n\n"
org-journal-time-format "%R \n:PROPERTIES:\n:Created: <%Y-%m-%d %a %H:%M:%S>\n:END:\n"
org-journal-time-prefix "\n*** TODO "
org-journal-hide-entries-p t
org-journal-date-format (lambda (time)
(format "* %s %s\n:PROPERTIES:\n:Created: [%s]\n:END:"
(format-time-string "%Y-%m-%d" time)
(format-time-string "%a" time)
(format-time-string "%Y-%m-%d %a" time))))
(when *is-windows*
(setq org-journal-dir "D:/emacs/my-org-daily/"))
(when *is-mac*
(setq org-journal-dir "~/org/my-org-daily/"))
(add-hook 'org-journal-mode-hook 'font-lock-update)
(defun my/journal-setup-new-day ()
(save-excursion
(org-back-to-heading)
(let ((day-end (save-excursion (org-end-of-subtree) (point))))
(unless (search-forward "** daily" day-end t)
(goto-char day-end)
(insert "\n\n** daily\n\n\n")
(insert "** tasks\n")))))
(add-hook 'org-journal-after-header-create-hook #'my/journal-setup-new-day)
(defun my/journal-position-cursor-after-time ()
(when (derived-mode-p 'org-journal-mode)
(org-back-to-heading)
(end-of-line)))
(add-hook 'org-journal-after-entry-create-hook #'my/journal-position-cursor-after-time)
(defun org-journal-open-entry-for-editing (&optional event)
"Open journal entry for the date under cursor in calendar for editing."
(interactive
(list last-nonmenu-event))
(let* ((date (calendar-cursor-to-date t event))
(time (org-journal--calendar-date->time date))
(org-journal-file (org-journal--get-entry-path time)))
(if (file-exists-p org-journal-file)
(progn
(funcall org-journal-find-file org-journal-file)
(unless (org-journal--daily-p)
(org-journal--goto-entry date)))
(message "No journal entry for this date."))))
(defun my/org-journal-mark-old-todos-as-comment (entries)
"Change of TODO entry's TODO key word to COMMENT after carryover."
(save-excursion
(mapc (lambda (entry)
(let ((start (car entry))
(end (cadr entry)))
(goto-char start)
(when (re-search-forward "^\\(\\*+ \\)TODO\\>" end t)
(replace-match "\\1COMMENT" t nil))))
(reverse entries)))
(save-buffer))
(setq org-journal-handle-old-carryover-fn #'my/org-journal-mark-old-todos-as-comment))
;; 在org-journal加载cns-mode
(add-hook 'org-journal-mode-hook
(lambda ()
(global-cns-mode-enable-in-buffer)))
(provide 'init-org) (provide 'init-org)

View File

@@ -45,7 +45,23 @@
:init (marginalia-mode)) :init (marginalia-mode))
;; 安装consult增强搜索和其他菜单 ;; 安装consult增强搜索和其他菜单
(use-package consult) (use-package consult
:config
(defun consult-fd-global ()
"Search for all files use fd"
(interactive)
(let ((consult-fd-args "fd -H -I -i -c never --full-path")
(default-directory "~/"))
(consult-fd)))
(if *is-windows*
(progn
(setq consult-locate-args (encode-coding-string "es.exe -i -p -r" 'gbk))
(add-to-list 'process-coding-system-alist '("es" gbk . gbk))))
(when *is-mac*
(setopt consult-locate-args "mdfind -name")))
;; 安装embark一个菜单用用就明白了 ;; 安装embark一个菜单用用就明白了
(use-package embark (use-package embark
@@ -65,17 +81,6 @@
'embark-collect-mode-hook 'embark-collect-mode-hook
#'consult-preview-at-point-mode)))) #'consult-preview-at-point-mode))))
(define-key minibuffer-local-map (kbd "C-c C-e") 'embark-export)
(if *is-windows*
(progn
(setq consult-locate-args (encode-coding-string "es.exe -i -p -r" 'gbk))
(add-to-list 'process-coding-system-alist '("es" gbk . gbk))))
(when *is-mac*
(setopt consult-locate-args "mdfind -name"))
;; 启用savehist保存命令顺序 ;; 启用savehist保存命令顺序
(use-package savehist (use-package savehist
:hook (after-init . savehist-mode) :hook (after-init . savehist-mode)