302 lines
11 KiB
EmacsLisp
302 lines
11 KiB
EmacsLisp
;;; init-org.el --- org-mode config -*- lexical-binding: t -*-
|
||
|
||
;;; Commentary:
|
||
|
||
;;; Code:
|
||
|
||
(use-package org
|
||
:hook
|
||
(org-mode . org-indent-mode)
|
||
(org-mode . visual-line-mode)
|
||
(org-mode . my-org-electric-pair-fix)
|
||
(org-mode . electric-pair-local-mode)
|
||
|
||
:config
|
||
(if *is-windows*
|
||
(add-hook 'org-mode-hook 'font-lock-update))
|
||
|
||
(unless *is-windows*
|
||
(add-hook 'org-mode 'jinx-mode))
|
||
|
||
(defun my-org-electric-pair-fix ()
|
||
(setq-local electric-pair-inhibit-predicate
|
||
(lambda (char)
|
||
(or (eq char ?<)
|
||
(electric-pair-default-inhibit char)))))
|
||
|
||
;; log默认放入drawer中
|
||
(setq org-log-done t
|
||
org-log-into-drawer t)
|
||
|
||
;; 不要在capture时设置bookmark
|
||
(setq org-bookmark-names-plist nil)
|
||
|
||
;; 设置todo关键字
|
||
(setq org-todo-keywords
|
||
(quote ((sequence "TODO(t)" "STARTED(S)" "|" "DONE(d!/!)")
|
||
(sequence "IDKY(i)" "SOMEDAY(s)" "|" "CANCELLED(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"))))
|
||
|
||
(setq org-agenda-span 'day)
|
||
(setq org-agenda-skip-function-global
|
||
'(org-agenda-skip-entry-if 'todo '("COMMENT"))))
|
||
|
||
;; phscroll,优化表格换行
|
||
(use-package phscroll
|
||
:hook
|
||
(org-mode . org-phscroll-activate)
|
||
:init
|
||
(setq org-startup-truncated nil))
|
||
|
||
;; org-babel scheme
|
||
(use-package ob-scheme
|
||
:demand t
|
||
:after org
|
||
:straight nil
|
||
:config
|
||
(add-to-list 'org-babel-load-languages '(scheme . t))
|
||
(org-babel-do-load-languages
|
||
'org-babel-load-languages
|
||
org-babel-load-languages))
|
||
|
||
;; denote
|
||
(use-package denote
|
||
:hook
|
||
(after-init . denote-rename-buffer-mode)
|
||
(dired-mode . denote-dired-mode)
|
||
:config
|
||
(cond
|
||
(*is-android*
|
||
(setq denote-directory "~/storage/shared/my-org-note/"))
|
||
(*is-windows*
|
||
(setq denote-directory "H:/emacs/my-org-note/"))
|
||
(t
|
||
(setq denote-directory "~/org/my-org-note/")))
|
||
(setq denote-prompts '(title signature keywords))
|
||
(setq denote-title-history nil)
|
||
(setq denote-signature-history
|
||
'("note" "project" "fun" "wisdom" "article" "data" "metanote" "agenda" "journal" "archive"))
|
||
(setq denote-known-keywords
|
||
'("emacs")))
|
||
|
||
;; denote-org
|
||
(use-package denote-org)
|
||
|
||
;; denote-journal
|
||
(use-package denote-journal
|
||
:hook
|
||
(calendar-mode . denote-journal-calendar-mode)
|
||
:config
|
||
(setq denote-journal-directory (expand-file-name "journal" denote-directory))
|
||
(setq denote-journal-keyword nil)
|
||
(setq denote-journal-signature "journal")
|
||
(setq denote-journal-keyword "daily"))
|
||
|
||
;; denote-explore
|
||
(use-package denote-explore)
|
||
|
||
;; consult-notes
|
||
(use-package consult-notes
|
||
:straight
|
||
'(consult-notes :fork (:host github :repo "Andsy10/consult-notes"))
|
||
:hook
|
||
(after-init . consult-notes-denote-mode)
|
||
:config
|
||
(setq consult-notes-denote-display-keywords-indicator "_")
|
||
(setq consult-notes-denote-display-id-format 'date)
|
||
(setq consult-notes-denote-display-signature t))
|
||
|
||
;; org-download
|
||
(use-package org-download
|
||
:after org
|
||
:demand t
|
||
:hook
|
||
(org-mode . org-display-inline-images)
|
||
:config
|
||
(setq-default org-download-image-dir "./images/"
|
||
org-download-heading-lvl nil)
|
||
(setq org-download-dragndrop t
|
||
org-download-method 'directory
|
||
org-image-actual-width nil
|
||
org-download-image-html-width 600
|
||
org-return-follows-link t))
|
||
|
||
;; org-ql
|
||
(use-package org-ql)
|
||
|
||
;; org-super-agenda 配置
|
||
(use-package org-super-agenda
|
||
:config
|
||
(org-super-agenda-mode))
|
||
|
||
;; agenda
|
||
(use-package org-agenda
|
||
:straight nil
|
||
:hook
|
||
(org-agenda-finalize . disable-truncate-lines)
|
||
: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 "priority = C" :priority "C")
|
||
(:name "other priority" :priority< "C")
|
||
(:name "someday" :todo "SOMEDAY")
|
||
(:name "I dont know yet" :todo "IDKY"))))))))))
|
||
|
||
;; 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)
|
||
("i" "IDKY" entry
|
||
(file+headline "~/org/my-org-note/20260509T232442==agenda--all-my-todos__org.org" "Something to do")
|
||
"* IDKY %<%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)
|
||
("i" "IDKY" entry
|
||
(file+headline "~/org/my-org-note/20260509T232442==agenda--all-my-todos__org.org" "Something to do")
|
||
"* IDKY %<%m-%d> %?\n%T"
|
||
:empty-lines 1)))
|
||
(t nil))))
|
||
|
||
;; hugo
|
||
(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*
|
||
(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"
|
||
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))))))
|
||
|
||
;; presentation
|
||
(use-package org-tree-slide)
|
||
|
||
;; 农历日历
|
||
(use-package cal-china-x
|
||
:after calendar
|
||
:autoload cal-china-x-setup
|
||
:init
|
||
(cal-china-x-setup)
|
||
:config
|
||
(setq calendar-mark-holidays-flag t
|
||
cal-china-x-important-holidays cal-china-x-chinese-holidays
|
||
cal-china-x-general-holidays '((holiday-lunar 1 15 "元宵节")
|
||
(holiday-lunar 7 7 "七夕节")
|
||
(holiday-fixed 3 8 "妇女节")
|
||
(holiday-fixed 3 12 "植树节")
|
||
(holiday-fixed 5 4 "青年节")
|
||
(holiday-fixed 6 1 "儿童节")
|
||
(holiday-fixed 9 10 "教师节"))
|
||
holiday-other-holidays '((holiday-fixed 2 14 "情人节")
|
||
(holiday-fixed 4 1 "愚人节")
|
||
(holiday-fixed 12 25 "圣诞节")
|
||
(holiday-fixed 6 7 "高考")
|
||
(holiday-float 5 0 2 "母亲节")
|
||
(holiday-float 6 0 3 "父亲节")
|
||
(holiday-float 11 4 4 "感恩节"))
|
||
calendar-holidays (append cal-china-x-important-holidays
|
||
cal-china-x-general-holidays
|
||
holiday-other-holidays)))
|
||
|
||
(provide 'init-org)
|
||
|
||
;;; init-org.el ends here
|