From c3c59376f0a9966709f76aa5a6e7ce335b7baba0 Mon Sep 17 00:00:00 2001 From: User Date: Thu, 9 Apr 2026 16:04:01 +0800 Subject: [PATCH] Config: add init-org-refile.el , fix dirvish quick access path --- lisp/init-dired.el | 15 +++-- lisp/init-kbd.el | 1 + lisp/init-org-refile.el | 142 ++++++++++++++++++++++++++++++++++++++++ lisp/init-org.el | 38 +++++------ 4 files changed, 170 insertions(+), 26 deletions(-) create mode 100644 lisp/init-org-refile.el diff --git a/lisp/init-dired.el b/lisp/init-dired.el index 10c425d..7335d35 100644 --- a/lisp/init-dired.el +++ b/lisp/init-dired.el @@ -37,19 +37,22 @@ (setq dirvish-default-layout '(1 0.15 0.45)) :custom (dirvish-quick-access-entries - (when *is-windows* + (cond + (*is-windows* '(("h" "~/" "Home") ("e" "~/.emacs.d/") ("p" "c:/Users/gaozh/Pictures/Screenshots/" "Pictures") ("d" "f:/下载25-2-10/" "Download") ("v" "f:/luping26-1-11/" "Videos") ("n" "h:/emacs/my-org-note/" "Notes"))) - (when *is-mac* + (*is-mac* '(("h" "~/" "Home") - ("e" "~/.emacs.d/") - ("p" "~/Pictures/" "Pictures") - ("d" "~/Downloads/" "Download") - ("v" "~/Movies/" "Videos"))))) + ("e" "~/.emacs.d/") + ("p" "~/Pictures/" "Pictures") + ("d" "~/Downloads/" "Download") + ("v" "~/Movies/" "Videos") + ("n" "~/org/my-org-note/"))) + (t nil)))) (use-package trashed :commands (trashed) diff --git a/lisp/init-kbd.el b/lisp/init-kbd.el index 0a9786e..f15ed46 100644 --- a/lisp/init-kbd.el +++ b/lisp/init-kbd.el @@ -246,6 +246,7 @@ Disable jinx-mode if it's enable and global-jinx-mode is disable , otherwise tog ;; vterm (with-eval-after-load 'vterm + (global-set-key (kbd "C-c v") 'vterm) (define-key vterm-mode-map (kbd "M-]") nil) (define-key vterm-mode-map (kbd "C-x C-x") 'vterm-send-C-x)) diff --git a/lisp/init-org-refile.el b/lisp/init-org-refile.el new file mode 100644 index 0000000..8e3a695 --- /dev/null +++ b/lisp/init-org-refile.el @@ -0,0 +1,142 @@ +;;; init-org-refile.el --- org-refile config -*- lexical-binding: t -*- + +;;; Commentary: + +;;; Code: + +(defun my-org-refile-to-new-file () + "org-refile as a separate org file with custom template." + (interactive) + (require 'org-element) + (org-back-to-heading t) + + (let* ((heading-components (org-heading-components)) + ;; (todo (nth 2 heading-components)) ; 保留todo状态 + (raw-title (nth 4 heading-components)) ; 纯标题文本 + (tags (org-get-tags nil t)) + (begin (point)) + (end (save-excursion (org-end-of-subtree t t) (point))) + (original-content (buffer-substring begin end)) + + ;; 检测原条目是否有属性,不包括logbook + (has-properties-p + (with-temp-buffer + (insert original-content) + (goto-char (point-min)) + (forward-line 1) ; 跳过headline + (looking-at org-property-drawer-re))) + + ;; 如果有属性则提取内容 + (original-props + (when has-properties-p + (with-temp-buffer + (insert original-content) + (goto-char (point-min)) + (forward-line 1) + (let ((start (point))) + (when (re-search-forward ":END:" nil t) + (forward-line 1) + (buffer-substring start (point))))))) + + ;; 询问文件名,保留中文,只替换空格和特殊字符 + (default-name (replace-regexp-in-string "[ \\/:*?\"<>|]" "_" raw-title)) + (user-filename (read-string "Filename (without .org): " default-name)) + + (filename (format "%s-%s.org" + (format-time-string "%Y%m%d") + user-filename)) + (target-dir (if *is-windows* + "h:/emacs/my-org-note/" + "~/org/my-org-note/")) + (filepath (expand-file-name filename target-dir)) + + ;; 询问category + (category (completing-read "Category: " + '("none" "note" "project") + nil t "project")) + + ;; 询问 Tags(原有标签作为默认值) + (tag-input (read-string "Tags (space separated): " + (mapconcat #'identity tags " "))) + + (formatted-tags + (if (and tag-input (not (string= tag-input ""))) + (concat ":" (replace-regexp-in-string " " ":" tag-input) ":") + "")) + + ;; 提取body + (body + (with-temp-buffer + (insert original-content) + (goto-char (point-min)) + (forward-line 1) + + ;; 如果有属性抽屉则跳过 + (when (looking-at org-property-drawer-re) + (while (not (looking-at org-property-end-re)) + (forward-line 1)) + (forward-line 1)) + + ;; 跳过schedule和deadline + ;; (when (looking-at org-planning-line-re) + ;; (forward-line 1)) + + ;; 清理开头的空行 + (skip-chars-forward "\n") + (buffer-substring (point) (point-max))))) + + ;; 检查文件是否存在 + (when (and (file-exists-p filepath) + (not (y-or-n-p (format "File %s exists. Overwrite? " filename)))) + (error "Refile canceled")) + + (unless (file-exists-p target-dir) + (make-directory target-dir t)) + + ;; 将原条目的TODO关键字改为COMMENT(如果有) + (let ((todo (nth 2 heading-components))) + (when todo + (save-excursion + (goto-char begin) + (when (re-search-forward (concat "^\\(\\*+ \\s-*\\)" (regexp-quote todo)) (save-excursion (forward-line 1) (point)) t) + (replace-match "\\1COMMENT" t nil))))) + + ;; 创建新文件 + (condition-case err + (with-temp-file filepath + ;; 文件头 + (insert (format "#+title: %s\n" user-filename)) + (insert (format "#+date: %s\n" (format-time-string "[%Y-%m-%d %a %H:%M]"))) + (insert (format "#+category: %s\n\n" category)) + + ;; 插入标题和tag + (insert (format "* STARTED %s %s\n" + ;; (if todo (concat todo " ") "") + user-filename + formatted-tags)) + + ;; 只有原条目有属性时才插入 + (when original-props + (insert original-props)) + + ;; 插入body + (insert body) + + ;; 确保格式正确,添加文件尾局部变量 + (unless (bolp) (insert "\n")) + (insert "\n# Local Variables:\n# org-use-tag-inheritance: nil\n# End:\n")) + + (error + (goto-char begin) + (insert original-content) + (error "Failed to create file: %s" err))) + + (find-file-other-window filepath) + (message "Successfully refiled to %s" filepath))) + +(with-eval-after-load 'org + (define-key org-mode-map (kbd "C-c o w") #'my-org-refile-to-new-file)) + +(provide 'init-org-refile) + +;;; init-org-refile.el ends here diff --git a/lisp/init-org.el b/lisp/init-org.el index 271cc6a..c30feba 100644 --- a/lisp/init-org.el +++ b/lisp/init-org.el @@ -159,8 +159,8 @@ "h:/emacs/my-org-daily/" "h:/emacs/my-org-note/"))) (when *is-mac* - (with-eval-after-load 'org - (setq org-agenda-files '("~/org/my-org-daily")))) + (setq org-agenda-files '("~/org/my-org-daily" + "~/org/my-org-note/"))) (setq org-agenda-span 'day) @@ -243,19 +243,23 @@ ;; (setq org-tags-exclude-from-inheritance '()) ;; capture模板 -(when *is-windows* - (defvar my-org-capture-temp-title "" "Temporarily store the org-capture filename.") - (setq org-capture-templates - '(("n" "New Note" plain - (file (lambda () - (setq my-org-capture-temp-title (read-string "Filename (without .org): ")) - (expand-file-name (format "%s/%s-%s.org" - "h:/emacs/my-org-note" +(defvar my-org-capture-temp-title "" "Temporarily store the org-capture filename.") +(setq org-capture-templates + '(("n" "New Note" plain + (file (lambda () + (setq my-org-capture-temp-title (read-string "Filename (without .org): ")) + (expand-file-name (if *is-windows* + (format "%s/%s-%s.org" + "h:/emacs/my-org-note/" + (format-time-string "%Y%m%d") + my-org-capture-temp-title) + (format "%s/%s-%s.org" + "~/org/my-org-note/" (format-time-string "%Y%m%d") - my-org-capture-temp-title)))) - "#+title: %(symbol-value 'my-org-capture-temp-title) + my-org-capture-temp-title))))) + "#+title: %(symbol-value 'my-org-capture-temp-title) #+date: %U -#+category: %^{Category|none|plan|book|article|note|insight} +#+category: %^{Category|none|project|book|article|note|insight} * %(symbol-value 'my-org-capture-temp-title) %^g %U @@ -269,13 +273,7 @@ # org-use-tag-inheritance: nil # End: " - :jump-to-captured t)))) - -(when *is-mac* - (setq org-capture-templates - '(("t" "Todo" entry (file+headline "~/org/some-orgs/todos.org" "Workspace") - "* TODO [#B] %?\n %i\n %U" - :empty-lines 1)))) + :jump-to-captured t))) (global-set-key (kbd "C-c o c") 'org-capture)