refactor: Reorganize config with use-package and optimize startup hooks
- Split monolithic init-package.el into focused modules - Convert eager `:init` blocks to lazy `:hook` - Consolidate UI settings and defer theme loading. - Remove duplicated config between GUI and terminal paths.
This commit is contained in:
368
lisp/init-org.el
368
lisp/init-org.el
@@ -4,52 +4,46 @@
|
||||
|
||||
;;; Code:
|
||||
|
||||
(use-package org)
|
||||
(use-package org
|
||||
:hook
|
||||
(org-mode . (lambda ()
|
||||
(org-indent-mode)
|
||||
(visual-line-mode)
|
||||
(jinx-mode)
|
||||
(electric-pair-local-mode)
|
||||
(require 'org-tempo)
|
||||
(setq-local electric-pair-inhibit-predicate
|
||||
(lambda (char)
|
||||
(or (eq char ?<)
|
||||
(electric-pair-default-inhibit char))))))
|
||||
:config
|
||||
;; log默认放入drawer中
|
||||
(setq org-log-done t
|
||||
org-log-into-drawer t)
|
||||
|
||||
;; 一些随org-mode加载的基础配置
|
||||
(add-hook 'org-mode-hook
|
||||
(lambda ()
|
||||
(require 'org-tempo)
|
||||
(org-indent-mode)
|
||||
(visual-line-mode)
|
||||
(setq-local electric-pair-inhibit-predicate
|
||||
(lambda (char)
|
||||
(or (eq char ?<)
|
||||
(electric-pair-default-inhibit char))))))
|
||||
;; 不要在capture时设置bookmark
|
||||
(setq org-bookmark-names-plist nil)
|
||||
|
||||
;; log默认放入drawer中
|
||||
(setq org-log-done t)
|
||||
(setq org-log-into-drawer t)
|
||||
;; 设置todo关键字
|
||||
(setq org-todo-keywords
|
||||
(quote ((sequence "TODO(t)" "STARTED(S)" "|" "DONE(d!/!)")
|
||||
(sequence "WAITING(w@/!)" "SOMEDAY(s)" "|" "CANCELLED(c@/!)"))))
|
||||
|
||||
;; 将系统时间(星期)设为英文,防止中文乱码
|
||||
(setq system-time-locale "C")
|
||||
;; agenda相关
|
||||
(cond
|
||||
(*is-windows*
|
||||
(setq org-agenda-files '("h:/emacs/hugo/this-is-my-blog/all-blog.org"
|
||||
"h:/emacs/my-org-note/20260509T232442==agenda--all-my-todos__org.org")))
|
||||
(*is-mac*
|
||||
(setq org-agenda-files '("~/org/my-org-note/20260509T232442==agenda--all-my-todos__org.org")))
|
||||
(*is-linux*
|
||||
(setq org-agenda-files '("~/org/my-org-note/20260509T232442==agenda--all-my-todos__org.org")))
|
||||
(*is-android*
|
||||
(setq org-agenda-files '("~/storage/shared/my-org-note/20260509T232442==agenda--all-my-todos__org.org"))))
|
||||
|
||||
;; 设置todo关键字
|
||||
(setq org-todo-keywords
|
||||
(quote ((sequence "TODO(t)" "STARTED(S)" "|" "DONE(d!/!)")
|
||||
(sequence "WAITING(w@/!)" "SOMEDAY(s)" "|" "CANCELLED(c@/!)"))))
|
||||
|
||||
;; agenda相关
|
||||
(with-eval-after-load 'recentf
|
||||
(if *is-android*
|
||||
(add-to-list 'recentf-exclude "~/storage/shared/my-org-note/journal/.*\\.org\\'")
|
||||
(add-to-list 'recentf-exclude "~/org/my-org-note/journal/.*\\.org\\'")
|
||||
(add-to-list 'recentf-exclude "~/org/my-org-note/20260509T232442==agenda--all-my-todos__org\\.org")))
|
||||
|
||||
(cond
|
||||
(*is-windows*
|
||||
(setq org-agenda-files '("h:/emacs/hugo/this-is-my-blog/all-blog.org"
|
||||
"h:/emacs/my-org-note/20260509T232442==agenda--all-my-todos__org.org")))
|
||||
(*is-mac*
|
||||
(setq org-agenda-files '("~/org/my-org-note/20260509T232442==agenda--all-my-todos__org.org")))
|
||||
(*is-linux*
|
||||
(setq org-agenda-files '("~/org/my-org-note/20260509T232442==agenda--all-my-todos__org.org")))
|
||||
(*is-android*
|
||||
(setq org-agenda-files '("~/storage/shared/my-org-note/20260509T232442==agenda--all-my-todos__org.org"))))
|
||||
|
||||
(setq org-agenda-span 'day)
|
||||
(setq org-agenda-skip-function-global
|
||||
'(org-agenda-skip-entry-if 'todo '("COMMENT")))
|
||||
(setq org-agenda-span 'day)
|
||||
(setq org-agenda-skip-function-global
|
||||
'(org-agenda-skip-entry-if 'todo '("COMMENT"))))
|
||||
|
||||
;; org-babel scheme
|
||||
(use-package ob-scheme
|
||||
@@ -64,8 +58,8 @@
|
||||
|
||||
;; denote
|
||||
(use-package denote
|
||||
:init
|
||||
(denote-rename-buffer-mode)
|
||||
:hook
|
||||
(after-init . denote-rename-buffer-mode)
|
||||
:config
|
||||
(if *is-android*
|
||||
(setq denote-directory "~/storage/shared/my-org-note/")
|
||||
@@ -82,8 +76,8 @@
|
||||
|
||||
;; denote-journal
|
||||
(use-package denote-journal
|
||||
:init
|
||||
(add-hook 'calendar-mode-hook #'denote-journal-calendar-mode)
|
||||
:hook
|
||||
(calendar-mode . denote-journal-calendar-mode)
|
||||
:config
|
||||
(setq denote-journal-directory (expand-file-name "journal" denote-directory))
|
||||
(setq denote-journal-keyword nil)
|
||||
@@ -97,8 +91,8 @@
|
||||
(use-package consult-notes
|
||||
:straight
|
||||
'(consult-notes :fork (:host github :repo "Andsy10/consult-notes"))
|
||||
:init
|
||||
(consult-notes-denote-mode)
|
||||
:hook
|
||||
(after-init . consult-notes-denote-mode)
|
||||
:config
|
||||
(setq consult-notes-denote-display-keywords-indicator "_")
|
||||
(setq consult-notes-denote-display-id-format 'date)
|
||||
@@ -129,97 +123,110 @@
|
||||
:config
|
||||
(org-super-agenda-mode))
|
||||
|
||||
;; 自定义agenda视图
|
||||
(setq org-agenda-custom-commands
|
||||
'(("pa" "priority >= A"
|
||||
((org-ql-block '(and (priority "A") (todo))
|
||||
((org-ql-block-header "priority = A")))))
|
||||
("pb" "priority >= B"
|
||||
((org-ql-block '(and (priority >= "B") (todo))
|
||||
((org-ql-block-header "priority >= B")
|
||||
(org-super-agenda-groups
|
||||
'((:name "priority = A" :priority "A")
|
||||
(:name "priority = B" :priority "B")))))))
|
||||
("pc" "priority >= C"
|
||||
((org-ql-block '(and (priority >= "C") (todo))
|
||||
((org-ql-block-header "priority >= C")
|
||||
(org-super-agenda-groups
|
||||
'((:name "priority = A" :priority "A")
|
||||
(:name "priority = B" :priority "B")
|
||||
(:name "priority = C" :priority "C")))))))
|
||||
("qd" "TODO entries sort by closed time"
|
||||
((org-ql-block '(closed)
|
||||
((org-ql-block-header "Closed TODOs")
|
||||
(org-super-agenda-groups
|
||||
'((:auto-ts t)))))))
|
||||
("qs" "SOMEDAYs"
|
||||
((org-ql-block '(todo "SOMEDAY")
|
||||
((org-ql-block-header "SOMEDAYs")
|
||||
(org-super-agenda-groups
|
||||
'((:auto-ts t)))))))
|
||||
("qS" "STARTEDs"
|
||||
((org-ql-block '(todo "STARTED")
|
||||
((org-ql-block-header "STARTEDs")
|
||||
(org-super-agenda-groups
|
||||
'((:auto-ts t)))))))
|
||||
("qt" "TODOs sort by start time"
|
||||
((org-ql-block '(todo)
|
||||
((org-ql-block-header "TODOs")
|
||||
(org-super-agenda-groups
|
||||
'((:auto-ts t)))))))
|
||||
("qa" "all TODO entries"
|
||||
((org-ql-block '(and (not (done)) (todo))
|
||||
((org-ql-block-header "all TODOs")
|
||||
(org-super-agenda-groups
|
||||
'((:name "started" :todo "STARTED")
|
||||
(:name "priority = A" :priority "A")
|
||||
(:name "priority = B" :priority "B")
|
||||
(:name "other priority" :priority< "B")
|
||||
(:name "someday" :todo "SOMEDAY")))))))))
|
||||
;; agenda
|
||||
(use-package org-agenda
|
||||
:straight nil
|
||||
:config
|
||||
(setq org-agenda-custom-commands
|
||||
'(("pa" "priority >= A"
|
||||
((org-ql-block '(and (priority "A") (todo))
|
||||
((org-ql-block-header "priority = A")))))
|
||||
("pb" "priority >= B"
|
||||
((org-ql-block '(and (priority >= "B") (todo))
|
||||
((org-ql-block-header "priority >= B")
|
||||
(org-super-agenda-groups
|
||||
'((:name "priority = A" :priority "A")
|
||||
(:name "priority = B" :priority "B")))))))
|
||||
("pc" "priority >= C"
|
||||
((org-ql-block '(and (priority >= "C") (todo))
|
||||
((org-ql-block-header "priority >= C")
|
||||
(org-super-agenda-groups
|
||||
'((:name "priority = A" :priority "A")
|
||||
(:name "priority = B" :priority "B")
|
||||
(:name "priority = C" :priority "C")))))))
|
||||
("qd" "TODO entries sort by closed time"
|
||||
((org-ql-block '(closed)
|
||||
((org-ql-block-header "Closed TODOs")
|
||||
(org-super-agenda-groups
|
||||
'((:auto-ts t)))))))
|
||||
("qs" "SOMEDAYs"
|
||||
((org-ql-block '(todo "SOMEDAY")
|
||||
((org-ql-block-header "SOMEDAYs")
|
||||
(org-super-agenda-groups
|
||||
'((:auto-ts t)))))))
|
||||
("qS" "STARTEDs"
|
||||
((org-ql-block '(todo "STARTED")
|
||||
((org-ql-block-header "STARTEDs")
|
||||
(org-super-agenda-groups
|
||||
'((:auto-ts t)))))))
|
||||
("qt" "TODOs sort by start time"
|
||||
((org-ql-block '(todo)
|
||||
((org-ql-block-header "TODOs")
|
||||
(org-super-agenda-groups
|
||||
'((:auto-ts t)))))))
|
||||
("qa" "all TODO entries"
|
||||
((org-ql-block '(and (not (done)) (todo))
|
||||
((org-ql-block-header "all TODOs")
|
||||
(org-super-agenda-groups
|
||||
'((:name "started" :todo "STARTED")
|
||||
(:name "priority = A" :priority "A")
|
||||
(:name "priority = B" :priority "B")
|
||||
(:name "other priority" :priority< "B")
|
||||
(:name "someday" :todo "SOMEDAY"))))))))))
|
||||
|
||||
;; capture模板
|
||||
(setq org-capture-templates
|
||||
(cond
|
||||
((or *is-linux* *is-mac*)
|
||||
'(("t" "TODO" entry
|
||||
(file+headline "~/org/my-org-note/20260509T232442==agenda--all-my-todos__org.org" "Something to do")
|
||||
"* TODO %<%m-%d> %?\n%T"
|
||||
:empty-lines 1)
|
||||
("s" "SOMEDAY" entry
|
||||
(file+headline "~/org/my-org-note/20260509T232442==agenda--all-my-todos__org.org" "Something to do")
|
||||
"* SOMEDAY %<%m-%d> %?\n%T"
|
||||
:empty-lines 1)))
|
||||
(*is-android*
|
||||
'(("t" "TODO" entry
|
||||
(file+headline "~/storage/shared/my-org-note/20260509T232442==agenda--all-my-todos__org.org" "Something to do")
|
||||
"* TODO %<%m-%d> %?\n%T"
|
||||
:empty-lines 1)
|
||||
("s" "SOMEDAY" entry
|
||||
(file+headline "~/storage/shared/my-org-note/20260509T232442==agenda--all-my-todos__org.org" "Something to do")
|
||||
"* SOMEDAY %<%m-%d> %?\n%T"
|
||||
:empty-lines 1)))
|
||||
(t nil)))
|
||||
|
||||
(setq org-bookmark-names-plist nil)
|
||||
;; capture
|
||||
(use-package org-capture
|
||||
:straight nil
|
||||
:config
|
||||
(setq org-capture-templates
|
||||
(cond
|
||||
((or *is-linux* *is-mac*)
|
||||
'(("t" "TODO" entry
|
||||
(file+headline "~/org/my-org-note/20260509T232442==agenda--all-my-todos__org.org" "Something to do")
|
||||
"* TODO %<%m-%d> %?\n%T"
|
||||
:empty-lines 1)
|
||||
("s" "SOMEDAY" entry
|
||||
(file+headline "~/org/my-org-note/20260509T232442==agenda--all-my-todos__org.org" "Something to do")
|
||||
"* SOMEDAY %<%m-%d> %?\n%T"
|
||||
:empty-lines 1)))
|
||||
(*is-android*
|
||||
'(("t" "TODO" entry
|
||||
(file+headline "~/storage/shared/my-org-note/20260509T232442==agenda--all-my-todos__org.org" "Something to do")
|
||||
"* TODO %<%m-%d> %?\n%T"
|
||||
:empty-lines 1)
|
||||
("s" "SOMEDAY" entry
|
||||
(file+headline "~/storage/shared/my-org-note/20260509T232442==agenda--all-my-todos__org.org" "Something to do")
|
||||
"* SOMEDAY %<%m-%d> %?\n%T"
|
||||
:empty-lines 1)))
|
||||
(t nil))))
|
||||
|
||||
;; hugo
|
||||
(use-package ox-hugo)
|
||||
|
||||
(with-eval-after-load 'org-capture
|
||||
(defun org-hugo-new-subtree-post-capture-template ()
|
||||
"Returns `org-capture' template string for new Hugo post.
|
||||
(use-package ox-hugo
|
||||
:config
|
||||
(with-eval-after-load 'org-capture
|
||||
(defun org-hugo-new-subtree-post-capture-template ()
|
||||
"Returns `org-capture' template string for new Hugo post.
|
||||
See `org-capture-templates' for more information."
|
||||
(let* ((title (read-from-minibuffer "Post Title: ")) ;Prompt to enter the post title
|
||||
(fname (org-hugo-slug title)))
|
||||
(mapconcat #'identity
|
||||
`(
|
||||
,(concat "* TODO " title)
|
||||
":PROPERTIES:"
|
||||
,(concat ":EXPORT_FILE_NAME: " fname)
|
||||
":END:"
|
||||
"\n\n") ;Place the cursor here finally
|
||||
"\n")))
|
||||
(if *is-windows*
|
||||
(let* ((title (read-from-minibuffer "Post Title: ")) ;Prompt to enter the post title
|
||||
(fname (org-hugo-slug title)))
|
||||
(mapconcat #'identity
|
||||
`(
|
||||
,(concat "* TODO " title)
|
||||
":PROPERTIES:"
|
||||
,(concat ":EXPORT_FILE_NAME: " fname)
|
||||
":END:"
|
||||
"\n\n") ;Place the cursor here finally
|
||||
"\n")))
|
||||
(if *is-windows*
|
||||
(add-to-list 'org-capture-templates
|
||||
'("h" ;`org-capture' binding + h
|
||||
"Hugo post"
|
||||
entry
|
||||
;; It is assumed that below file is present in `org-directory'
|
||||
;; and that it has a "Blog Ideas" heading. It can even be a
|
||||
;; symlink pointing to the actual location of all-posts.org!
|
||||
(file+headline "h:/emacs/hugo/this-is-my-blog/all-blog.org" "Blog Ideas")
|
||||
(function org-hugo-new-subtree-post-capture-template)))
|
||||
(add-to-list 'org-capture-templates
|
||||
'("h" ;`org-capture' binding + h
|
||||
"Hugo post"
|
||||
@@ -227,61 +234,48 @@ See `org-capture-templates' for more information."
|
||||
;; It is assumed that below file is present in `org-directory'
|
||||
;; and that it has a "Blog Ideas" heading. It can even be a
|
||||
;; symlink pointing to the actual location of all-posts.org!
|
||||
(file+headline "h:/emacs/hugo/this-is-my-blog/all-blog.org" "Blog Ideas")
|
||||
(function org-hugo-new-subtree-post-capture-template)))
|
||||
(add-to-list 'org-capture-templates
|
||||
'("h" ;`org-capture' binding + h
|
||||
"Hugo post"
|
||||
entry
|
||||
;; It is assumed that below file is present in `org-directory'
|
||||
;; and that it has a "Blog Ideas" heading. It can even be a
|
||||
;; symlink pointing to the actual location of all-posts.org!
|
||||
(file+headline "~/org/hugo/this-is-my-blog/all-blog.org" "Blog Ideas")
|
||||
(function org-hugo-new-subtree-post-capture-template)))))
|
||||
(file+headline "~/org/hugo/this-is-my-blog/all-blog.org" "Blog Ideas")
|
||||
(function org-hugo-new-subtree-post-capture-template)))))
|
||||
|
||||
;; 快速部署
|
||||
(defun my-blog-publish ()
|
||||
"Publish blog , git add/commit/push , generate commit message."
|
||||
(interactive)
|
||||
(let* ((blog-dir (if *is-windows*
|
||||
"h:/emacs/hugo/this-is-my-blog/"
|
||||
"~/org/hugo/this-is-my-blog/"))
|
||||
(timestamp (format-time-string "%Y-%m-%d %H:%M:%S"))
|
||||
(default-directory blog-dir))
|
||||
;; 快速部署
|
||||
(defun my-blog-publish ()
|
||||
"Publish blog , git add/commit/push , generate commit message."
|
||||
(interactive)
|
||||
(let* ((blog-dir (if *is-windows*
|
||||
"h:/emacs/hugo/this-is-my-blog/"
|
||||
"~/org/hugo/this-is-my-blog/"))
|
||||
(timestamp (format-time-string "%Y-%m-%d %H:%M:%S"))
|
||||
(default-directory blog-dir))
|
||||
;; save buffer
|
||||
(save-buffer)
|
||||
;; git add
|
||||
(message "Adding files...")
|
||||
(eshell-command "git add .")
|
||||
;; git commit with timestamp
|
||||
(message "Committing: %s" timestamp)
|
||||
(eshell-command (format "git commit -m \"Update: %s\"" timestamp))
|
||||
;; git push
|
||||
(message "Pushing to remote...")
|
||||
(let ((exit-code (eshell-command "git push")))
|
||||
(if (eq exit-code t)
|
||||
(message "Push may have failed or nothing to push, check *Messages* buffer for details")
|
||||
(message "Push successfully %s" timestamp)))))
|
||||
|
||||
;; save buffer
|
||||
;; 预览博客
|
||||
(defun my-blog-preview ()
|
||||
"Save and preview blog."
|
||||
(interactive)
|
||||
(save-buffer)
|
||||
|
||||
;; git add
|
||||
(message "Adding files...")
|
||||
(eshell-command "git add .")
|
||||
|
||||
;; git commit with timestamp
|
||||
(message "Committing: %s" timestamp)
|
||||
(eshell-command (format "git commit -m \"Update: %s\"" timestamp))
|
||||
|
||||
;; git push
|
||||
(message "Pushing to remote...")
|
||||
(let ((exit-code (eshell-command "git push")))
|
||||
(if (eq exit-code t)
|
||||
(message "Push may have failed or nothing to push, check *Messages* buffer for details")
|
||||
(message "Push successfully %s" timestamp)))))
|
||||
|
||||
;; 预览博客
|
||||
(defun my-blog-preview ()
|
||||
"Save and preview blog."
|
||||
(interactive)
|
||||
(save-buffer)
|
||||
(let ((default-directory (if *is-windows*
|
||||
"h:/emacs/hugo/this-is-my-blog/"
|
||||
"~/org/hugo/this-is-my-blog/")))
|
||||
;; 启动 Hugo server
|
||||
(start-process "hugo-server" "*hugo-server*"
|
||||
"hugo" "server" "-D" "--bind" "0.0.0.0" "--port" "1313")
|
||||
;; 等待服务器启动
|
||||
(sleep-for 2)
|
||||
;; 自动打开浏览器
|
||||
(browse-url "http://localhost:1313")))
|
||||
(let ((default-directory (if *is-windows*
|
||||
"h:/emacs/hugo/this-is-my-blog/"
|
||||
"~/org/hugo/this-is-my-blog/")))
|
||||
;; 启动 Hugo server
|
||||
(start-process "hugo-server" "*hugo-server*"
|
||||
"hugo" "server" "-D" "--bind" "0.0.0.0" "--port" "1313")
|
||||
;; 等待服务器启动
|
||||
(sleep-for 2)
|
||||
;; 自动打开浏览器
|
||||
(browse-url "http://localhost:1313"))))
|
||||
|
||||
;; 农历日历
|
||||
(use-package cal-china-x
|
||||
|
||||
Reference in New Issue
Block a user