Files
.emacs.d/lisp/init-org.el
andsy10 aa4dea523e style(config): Reformat Emacs Lisp code for consistency
Standardize formatting across multiple init files: expand
single-line use-package keywords onto separate lines, fix
indentation, remove outdated comments, and clean up whitespace. Also
adds mc/keymap <return> binding and improves fcitx5 startup logic in
EXWM.
2026-05-11 03:40:06 +08:00

273 lines
9.2 KiB
EmacsLisp
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;;; init-org.el --- org-mode config -*- lexical-binding: t -*-
;;; Commentary:
;;; Code:
(use-package org)
;; 一些随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))))))
;; 预加载防止windows的org-mode加载卡顿
;; (if *is-windows*
;; (progn (run-with-idle-timer
;; 0.5 nil
;; (lambda ()
;; (with-temp-buffer
;; (org-mode)
;; (org-mode))
;; (message "Org preloaded")))))
;; 设置标题字体大小
;; (with-eval-after-load 'org
;; (dolist (face org-level-faces)
;; (set-face-attribute face nil :height 1)))
;; log默认放入drawer中
(setq org-log-done t)
(setq org-log-into-drawer t)
;; 将系统时间(星期)设为英文,防止中文乱码
(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@/!)"))))
;; agenda相关
(with-eval-after-load 'recentf
(add-to-list 'recentf-exclude "~/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"))))
(setq org-agenda-span 'day)
(setq org-default-priority ?C)
(setq org-agenda-skip-function-global
'(org-agenda-skip-entry-if 'todo '("COMMENT")))
;; org-babel scheme
(use-package ob-scheme
:straight (:type built-in)
: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
:config
(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"))
(setq denote-known-keywords
'("emacs" "org" "elisp" "scheme" "programming" "philosophy" "film" "linux" "computerstuff" "game" "masterpiece")))
;; denote-org
(use-package denote-org)
;; denote-journal
(use-package denote-journal
:init
(add-hook 'calendar-mode-hook #'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"))
;; denote-explore
(use-package denote-explore)
;; consult-notes
(use-package consult-notes
:straight
'(consult-notes :fork (:host github :repo "Andsy10/consult-notes"))
: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
:config
(when *is-mac*
(setq org-download-image-dir "./images")
(unless (file-exists-p "./images")
(make-directory "./images" t))
(setq org-download-link-format "[[file:%s]]\n")
(setq org-download-timestamp "%Y%m%d_%H%M%S_")
(setq org-download-dragndrop t)
(setq org-image-actual-width nil)
(setq org-download-image-html-width 600)
(add-hook 'org-mode-hook 'org-display-inline-images))
(with-eval-after-load 'org
(require 'org-download)
(setq 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视图
(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\"")))
("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模板
(unless *is-windows*
(setq org-capture-templates
'(("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))))
(setq org-bookmark-names-plist 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.
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)))))
;; 快速部署
(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)))))
;; 预览博客
(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")))
(provide 'init-org)
;;; init-org.el ends here