diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f526fb7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +# 忽略所有文件 +* + +# 保留特定配置文件 +!init.el +!early-init.el +!custom.el +!lisp/ +!lisp/**/ +!lisp/**/*.el + +# 保留 .gitignore 本身 +!.gitignore diff --git a/early-init.el b/early-init.el index b0e34a1..23b2f6a 100644 --- a/early-init.el +++ b/early-init.el @@ -1,9 +1,10 @@ (setq package-enable-at-startup nil) (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) ; 禁用菜单栏 -(scroll-bar-mode -1) ; 禁用滚动条 (setq display-line-numbers-type '2) (global-display-line-numbers-mode t) ; 启用行号 (setq display-line-numbers-grow-only t) ; 行号栏只增不减 diff --git a/init.el b/init.el index 9210c17..c8acafa 100644 --- a/init.el +++ b/init.el @@ -18,4 +18,3 @@ (require 'init-kbd) (require 'init-ui) (require 'init-segmentation) -(put 'scroll-left 'disabled nil) diff --git a/lisp/init-kbd.el b/lisp/init-kbd.el index 7b01052..44df73e 100644 --- a/lisp/init-kbd.el +++ b/lisp/init-kbd.el @@ -128,10 +128,16 @@ (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 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 y") 'consult-yank-from-kill-ring) ;; 从kill ring中粘贴 (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 (global-set-key (kbd "C-c DEL") 'hungry-delete-backward) ;; 向后删除到第一个非空字符 diff --git a/lisp/init-org.el b/lisp/init-org.el index c9503f1..fb5ff5c 100644 --- a/lisp/init-org.el +++ b/lisp/init-org.el @@ -3,6 +3,95 @@ (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加载卡顿 (if *is-windows* (progn (run-with-idle-timer @@ -13,18 +102,6 @@ (org-mode)) (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) ;; (set-face-attribute face nil :height 1)) @@ -36,6 +113,45 @@ ;; 将系统时间(星期)设为英文,防止中文乱码 (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模板 (when *is-windows* (setq org-capture-templates @@ -53,34 +169,13 @@ (global-set-key (kbd "C-c o c") 'org-capture) -(setq org-agenda-custom-commands - '(("c" "important stuff" - ((tags-todo "+PRIORITY=\"A\""))) - ;; ...other commands here - )) - -;; 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))) - -;; 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) +;; 批量调整表格 +(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))) ;; hugo (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) -;; 批量调整表格 -(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) diff --git a/lisp/init-package.el b/lisp/init-package.el index 7e147fd..a2f67b3 100644 --- a/lisp/init-package.el +++ b/lisp/init-package.el @@ -45,7 +45,23 @@ :init (marginalia-mode)) ;; 安装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,一个菜单,用用就明白了 (use-package embark @@ -65,17 +81,6 @@ 'embark-collect-mode-hook #'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,保存命令顺序 (use-package savehist :hook (after-init . savehist-mode)