diff --git a/lisp/init-kbd.el b/lisp/init-kbd.el index 44df73e..3a20297 100644 --- a/lisp/init-kbd.el +++ b/lisp/init-kbd.el @@ -38,6 +38,14 @@ (global-set-key (kbd "C->") 'mc/mark-next-like-this) (global-set-key (kbd "") 'mc/mark-pop) +;; 大小写 +(global-set-key (kbd "M-c") 'capitalize-dwim) +(global-set-key (kbd "M-u") 'upcase-dwim) +(global-set-key (kbd "M-l") 'downcase-dwim) + +;; pair编辑 +(global-set-key (kbd "C-c p d") 'delete-pair) + ;; 快速复制当前行 (defun duplicate-and-move-to-next-line() (interactive) @@ -91,7 +99,8 @@ (global-set-key (kbd "M-]") 'next-buffer) ;; 打开ibuffer -(global-set-key (kbd "C-x B") 'ibuffer) +(global-set-key (kbd "C-x C-b") 'ibuffer-other-window) +(setq ibuffer-default-sorting-mode 'filename) ;; 段落导航 (global-set-key (kbd "M-p") 'backward-paragraph) @@ -112,8 +121,8 @@ ;; 调整window (global-set-key (kbd "") 'shrink-window-horizontally) (global-set-key (kbd "") 'enlarge-window-horizontally) -(global-set-key (kbd "") 'enlarge-window) -(global-set-key (kbd "") 'shrink-window) +(global-set-key (kbd "C-") 'enlarge-window) +(global-set-key (kbd "C-") 'shrink-window) ;; crux相关 (global-set-key (kbd "C-") 'crux-kill-line-backwards) ;; C-DEL kill line backwards @@ -122,6 +131,14 @@ (global-set-key (kbd "C-a") 'crux-move-beginning-of-line) ;; 移动到第一个缩进而非行首 (global-set-key (kbd "C-x K") 'crux-kill-other-buffers) ;; 删除除当前buffer之外的buffer +;; undo-fu +(global-set-key (kbd "C-/") 'undo-fu-only-undo) +(global-set-key (kbd "C-.") 'undo-fu-only-redo) +(global-set-key (kbd "C-c C-/") 'undo-fu-clear-all) + +;; vundo +(global-set-key (kbd "C-x u") 'vundo) + ;; consult (global-set-key (kbd "C-x b") 'consult-buffer) ;; buffer菜单 (global-set-key (kbd "C-s") 'consult-line) ;; 搜索 @@ -139,6 +156,10 @@ (global-set-key (kbd "C-c f l") 'consult-locate) (global-set-key (kbd "C-c f m") 'consult-fd-global)) +;; avy +(global-set-key (kbd "C-M-;") 'avy-goto-char) +(global-set-key (kbd "M-g g") 'avy-goto-line) + ;; hungry-delete (global-set-key (kbd "C-c DEL") 'hungry-delete-backward) ;; 向后删除到第一个非空字符 (global-set-key (kbd "C-c d") 'hungry-delete-forward) ;; 向前删除到第一个非空字符 @@ -188,6 +209,10 @@ (org-cycle)) (global-set-key (kbd "C-") 'org-cycle-current-subtree) +;; heading菜单 +(with-eval-after-load 'org + (define-key org-mode-map (kbd "C-c i") 'consult-org-heading)) + ;; 存储一个链接 (global-set-key (kbd "C-c l") 'org-store-link) @@ -196,7 +221,9 @@ ;; 在calendar中快速打开当天日记 (eval-after-load "calendar" - '(define-key calendar-mode-map (kbd "j o") 'org-journal-open-entry-for-editing)) + (progn + '(define-key calendar-mode-map (kbd "j o") 'org-journal-open-entry-for-editing) + '(define-key calendar-mode-map (kbd "") 'org-journal-open-entry-for-editing))) ;; 日记 (global-set-key (kbd "C-c j o") 'org-journal-open-current-journal-file) diff --git a/lisp/init-org.el b/lisp/init-org.el index fb5ff5c..43777cf 100644 --- a/lisp/init-org.el +++ b/lisp/init-org.el @@ -16,15 +16,16 @@ (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-file-header "#+title: Daily Journal\n#+category: journal\n#+STARTUP: content\n\n" + org-journal-time-format "%m-%d \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)))) + (format-time-string "%Y-%m-%d %a" time))) + org-journal-carryover-items "TODO=\"TODO\"|TODO=\"STARTED\"|TODO=\"WAITING\"|TODO=\"SOMEDAY\"") (when *is-windows* (setq org-journal-dir "D:/emacs/my-org-daily/")) @@ -53,30 +54,37 @@ (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.")))) + "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." + "Change TODO entry's TODO keyword 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)) + (let* ((todo-keywords (cl-remove-if + (lambda (kw) (member kw org-done-keywords)) + org-todo-keywords-1)) + (todo-pattern (when todo-keywords + (regexp-opt todo-keywords 'words)))) + (when todo-pattern + (mapc (lambda (entry) + (let ((start (car entry)) + (end (set-marker (make-marker) (cadr entry)))) + (goto-char start) + (while (re-search-forward (concat "^\\(\\*+ \\)" todo-pattern) end t) + (replace-match "\\1COMMENT" t nil)) + (set-marker end nil))) + (reverse entries)))) + (save-buffer))) (setq org-journal-handle-old-carryover-fn #'my/org-journal-mark-old-todos-as-comment)) @@ -89,8 +97,7 @@ (add-hook 'org-mode-hook (lambda () (require 'org-tempo) - (org-indent-mode) - (local-set-key (kbd "C-c i") 'consult-org-heading))) + (org-indent-mode))) ;; 预加载,防止windows的org-mode加载卡顿 (if *is-windows* @@ -123,7 +130,7 @@ (when *is-windows* (with-eval-after-load 'org - (setq org-agenda-files '("d:/emacs/org/learning-org-mode.org" + (setq org-agenda-files '("d:/emacs/org/learning-oprg-mode.org" "d:/emacs/hugo/this-is-my-blog/all-blog.org" "d:/emacs/my-org-daily/")))) ; agenda文件,目录或文件 (when *is-mac* @@ -134,9 +141,11 @@ (setq org-default-priority ?D) +(setq org-agenda-skip-function-global + '(org-agenda-skip-entry-if 'todo '("COMMENT"))) + ;; org-super-agenda 配置 (use-package org-super-agenda - :after org-agenda :config (org-super-agenda-mode)) @@ -150,16 +159,38 @@ ("pb" "Priority >= B" ((tags-todo "+PRIORITY<=\"B\""))) ("pc" "Priority >= C" - ((tags-todo "+PRIORITY<=\"C\""))))) + ((tags-todo "+PRIORITY<=\"C\""))) + ("qd" "TODO entries sort by closed time" + ((org-ql-block '(closed) + ((org-ql-block-header "Closed TODOs") + (org-ql-sort '(closed)) + (org-super-agenda-groups + '((:auto-ts t))))))) + ("qS" "SOMEDAYs" + ((org-ql-block '(todo "SOMEDAY") + ((org-ql-block-header "SOMEDAYs") + (org-ql-sort '(start-time)) + (org-super-agenda-groups + '((:auto-ts t))))))) + ("qs" "STARTEDs" + ((org-ql-block '(todo "STARTED") + ((org-ql-block-header "STARTEDs") + (org-ql-sort '(start-time)) + (org-super-agenda-groups + '((:auto-ts t))))))) + ("qt" "TODOs sort by start time" + ((org-ql-block '(todo) + ((org-ql-block-header "TODOs") + (org-ql-sort '(start-time)) + (org-super-agenda-groups + '((:auto-ts t))))))))) ;; capture模板 (when *is-windows* (setq org-capture-templates '(("t" "Todo" entry (file+headline "d:/emacs/org/todos.org" "Workspace") "* TODO [#B] %?\n %i\n %U" - :empty-lines 1) - ("j" "Journal" entry (file+datetree "d:/emacs/org/journal.org") - "* %?\nEntered on %U\n %i\n")))) + :empty-lines 1)))) (when *is-mac* (setq org-capture-templates diff --git a/lisp/init-package.el b/lisp/init-package.el index a2f67b3..0972c6e 100644 --- a/lisp/init-package.el +++ b/lisp/init-package.el @@ -1,6 +1,8 @@ ;;; init-package.el ;;; -*- lexical-binding: t -*- +(setopt use-package-enable-imenu-support t) + ;; 安装gcmh用于管理内存回收 (use-package gcmh :init @@ -91,13 +93,32 @@ search-ring regexp-search-ring extended-command-history) - savehist-autosave-interval 300) - ) + savehist-autosave-interval 300)) ;; saveplace,保存光标位置 (use-package saveplace :hook (after-init . save-place-mode)) +;; undo增强 +(use-package undo-fu) + +(use-package undo-fu-session + :config (undo-fu-session-global-mode)) + +;; vundo +(use-package vundo + :init (setq undo-limit 800000 + undo-strong-limit 1200000 + undo-outer-limit 12000000)) + +;; ibuffer-projectile +(use-package ibuffer-projectile + :init (add-hook 'ibuffer-hook + (lambda () + (ibuffer-projectile-set-filter-groups) + (unless (eq ibuffer-sorting-mode 'alphabetic) + (ibuffer-do-sort-by-alphabetic))))) + ;; 安装ox-hugo (use-package ox-hugo :custom diff --git a/lisp/init-startup.el b/lisp/init-startup.el index 77cc878..403e308 100644 --- a/lisp/init-startup.el +++ b/lisp/init-startup.el @@ -59,4 +59,11 @@ (unless *is-mac* (server-start)) +;; 窗口名 +(setq-default frame-title-format '("%b - Emacs")) + +;; electirc-pair-mode +(add-hook 'emacs-lisp-mode-hook 'electric-pair-mode) +(add-hook 'org-mode-hook 'electric-pair-mode) + (provide 'init-startup)