From fffd35f8edb23ef48e168eb4172e10bc158485af Mon Sep 17 00:00:00 2001 From: User Date: Fri, 17 Apr 2026 06:52:00 +0800 Subject: [PATCH] Config: extract keybinding functions and clean up key configs - Add init-kbd-func.el for keybinding helper functions - Move global-display-line-numbers-mode from early-init.el to init.el - Slim down init-kbd.el: remove hydra-multiple-cursors, migrate defs - Reorganize dirvish config - Remove scattered global-set-key bindings from init-org, init-ui, etc. - Guard server-start with server-running-p check - Set ibuffer-default-sorting-mode to filename - Tweak gptel config --- early-init.el | 1 - init.el | 3 + lisp/init-dired.el | 26 +- lisp/init-gptel.el | 5 +- lisp/init-kbd-func.el | 110 +++++++ lisp/init-kbd.el | 661 +++++++++++++++------------------------- lisp/init-org-refile.el | 3 - lisp/init-org.el | 8 - lisp/init-package.el | 17 +- lisp/init-startup.el | 7 +- lisp/init-ui.el | 2 - 11 files changed, 376 insertions(+), 467 deletions(-) create mode 100644 lisp/init-kbd-func.el diff --git a/early-init.el b/early-init.el index 6039657..bdbbeb0 100644 --- a/early-init.el +++ b/early-init.el @@ -12,7 +12,6 @@ (scroll-bar-mode -1)) ; 禁用滚动条 (menu-bar-mode -1) ; 禁用菜单栏 (setq display-line-numbers-type '2) -(global-display-line-numbers-mode t) ; 启用行号 (setq display-line-numbers-grow-only t) ; 行号栏只增不减 (setq display-line-numbers-width-start 4) ; 预设4位宽度 diff --git a/init.el b/init.el index b4644b0..354bed3 100644 --- a/init.el +++ b/init.el @@ -13,6 +13,8 @@ (when (file-exists-p custom-file) (load-file custom-file)) +(global-display-line-numbers-mode t) + (require 'init-const) (require 'init-startup) (require 'init-elpa) @@ -27,6 +29,7 @@ (require 'init-gptel) (require 'init-workspace) (require 'init-ui) +(require 'init-kbd-func) (require 'init-kbd) (require 'init-segmentation) diff --git a/lisp/init-dired.el b/lisp/init-dired.el index 98aa02d..e33204b 100644 --- a/lisp/init-dired.el +++ b/lisp/init-dired.el @@ -6,23 +6,6 @@ (setq dired-dwim-target t) -(with-eval-after-load 'dirvish - (define-key dirvish-mode-map (kbd "") - (lambda () (interactive) (forward-line 1) (dired-move-to-filename))) - (define-key dirvish-mode-map (kbd "C-n") - (lambda () (interactive) (forward-line 1) (dired-move-to-filename))) - (define-key dirvish-mode-map (kbd "n") - (lambda () (interactive) (forward-line 1) (dired-move-to-filename))) - (define-key dirvish-mode-map (kbd "b") 'dired-up-directory) - (define-key dirvish-mode-map (kbd "C-b") 'dired-up-directory) - (define-key dirvish-mode-map (kbd "") 'dired-up-directory) - (define-key dirvish-mode-map (kbd "") 'dired-find-file) - (define-key dirvish-mode-map (kbd "C-f") 'dired-find-file) - (define-key dirvish-mode-map (kbd "") 'dirvish-layout-toggle)) - -(with-eval-after-load 'dirvish - (add-hook 'dired-mode-hook #'dired-hide-details-mode)) - ;; dirvish (use-package dirvish :init @@ -39,6 +22,9 @@ (setq dirvish-default-layout '(1 0.15 0.45)) + (with-eval-after-load 'dirvish + (add-hook 'dired-mode-hook #'dired-hide-details-mode)) + :custom (dirvish-quick-access-entries (cond @@ -56,7 +42,8 @@ ("p" "~/Pictures/" "Pictures") ("d" "~/Downloads/" "Download") ("v" "~/Movies/" "Videos") - ("n" "~/org/my-org-note/" "Notes"))) + ("n" "~/org/my-org-note/" "Notes") + ("g" "~/gptel/" "gptel sessions"))) (*is-linux* '(("h" "~/" "Home") @@ -65,7 +52,8 @@ ("p" "~/图片/" "Pictures") ("d" "~/downloads/" "Downloads") ("v" "~/视频/" "Videos") - ("n" "~/org/my-org-note/" "Notes"))) + ("n" "~/org/my-org-note/" "Notes") + ("g" "~/gptel/" "gptel sessions"))) (t nil)))) (use-package trashed diff --git a/lisp/init-gptel.el b/lisp/init-gptel.el index ac565fa..4d161ed 100644 --- a/lisp/init-gptel.el +++ b/lisp/init-gptel.el @@ -148,10 +148,7 @@ from the last 1500 characters of the buffer." (message "WARNING: gptel-request did not register callback!"))))) (with-eval-after-load 'gptel - (define-key gptel-mode-map (kbd "C-c C-s") #'my-gptel-save-session) - (setf gptel--system-message - "You are a large language model living in Emacs and a helpful assistant. Respond concisely. -- NEVER use unescaped org-mode headings. Lines MUST NOT begin with `* `, `** `, `*** `, etc. If you must start a line with asterisks, use the standard org escape format `,*` (e.g. `,* Heading`, `,** Sub-heading`)."))) + (define-key gptel-mode-map (kbd "C-c C-s") #'my-gptel-save-session))) (use-package gptel-agent :init diff --git a/lisp/init-kbd-func.el b/lisp/init-kbd-func.el new file mode 100644 index 0000000..8a40f94 --- /dev/null +++ b/lisp/init-kbd-func.el @@ -0,0 +1,110 @@ +;;; init-kbd-func.el --- functions for keybindings -*- lexical-binding: t -*- + +;;; Commentary: + +;;; Code: + +(defun open-init-file() + "Open user's init.el file in ~/.emacs.d ." + (interactive) + (find-file "~/.emacs.d/init.el")) + +(when *is-windows* + (defun restart-emacs () + "Restart emacs (for Windows)" + (interactive) + (save-some-buffers) + (w32-shell-execute "open" "runemacs.exe") + (kill-emacs))) + +(defun my/jinx-smart-toggle () + "Toggle jinx-mode smartly. +Disable jinx-mode if it's enable and global-jinx-mode is disable , otherwise toggle global-jinx-mode." + (interactive) + (unless (featurep 'jinx) + (require 'jinx)) + (let ((local-on (bound-and-true-p jinx-mode)) + (global-on (bound-and-true-p global-jinx-mode))) + (cond + ((and local-on (not global-on)) + (message "disable jinx-mode in current buffer") + (jinx-mode -1)) + (t + (if global-on + (progn + (message "disable global-jinx-mode") + (global-jinx-mode -1)) + (progn + (message "enable global-jinx-mode") + (global-jinx-mode 1))))))) + +(defun duplicate-and-move-to-next-line() + "Duplicate current line and move to next line." + (interactive) + (progn + (duplicate-line) + (next-line))) + +(defun popper-toggle-type-delete-other-window() + "Toggle type of popper window and delete other window." + (interactive) + (popper-toggle-type) + (delete-other-windows)) + +(defun consult-directory-externally (file) + "Open FILE externally using the default application of the system." + (interactive "fOpen externally: ") + (if (and (eq system-type 'windows-nt) + (fboundp 'w32-shell-execute)) + (shell-command-to-string (encode-coding-string (replace-regexp-in-string "/" "\\\\" + (format "explorer.exe %s" (file-name-directory (expand-file-name file)))) + 'gbk)) + (call-process (pcase system-type + ('darwin "open") + ('cygwin "cygstart") + (_ "xdg-open")) + nil 0 nil + (file-name-directory (expand-file-name file))))) + +(defun my-open-current-directory () + "Open current directory in default file explorer." + (interactive) + (consult-directory-externally default-directory)) + +(defun org-cycle-current-subtree() + "Cycle current subtree." + (interactive) + (org-back-to-heading) + (org-cycle)) + +(defun consult-org-ripgrep () + "Jump to org agenda files use consult-ripgrep." + (interactive) + (consult-ripgrep org-agenda-files)) + +(defun org-journal-open-current-journal-file-delete-other-window() + "Call org-journal-open-current-journal-file and delete other window." + (interactive) + (org-journal-open-current-journal-file) + (delete-other-windows)) + +(defun org-journal-new-entry-delete-other-window() + "Call org-journal-new-entry and delete other window." + (interactive) + (org-journal-new-entry nil) + (delete-other-windows)) + +(defun switch-to-emms-playlist() + "Switch to emms playlist." + (interactive) + (switch-to-buffer "*EMMS Playlist*")) + +(defun my/dired-next-line() + "move to forward line in dired buffer" + (interactive) + (forward-line 1) + (dired-move-to-filename)) + +(provide 'init-kbd-func) + +;;; init-kbd-func.el ends here diff --git a/lisp/init-kbd.el b/lisp/init-kbd.el index f909f02..7e1e688 100644 --- a/lisp/init-kbd.el +++ b/lisp/init-kbd.el @@ -4,13 +4,243 @@ ;;; Code: -;; 好像是ivy-posframe里的函数,后面要用 -(defun childframe-completion-workable-p () - "Check if childframe completion is workable." - (and (display-graphic-p) - (not (eq system-type 'windows-nt)) - (>= emacs-major-version 26))) +(use-package general) +;; 修改mac键位 +(when *is-mac* + (setq mac-command-modifier 'meta) + (setq mac-option-modifier 'none)) + +;; g for gptel +(general-def + :prefix "C-c g" + "o" 'gptel + "m" 'gptel-menu + "s" 'gptel-send + "a" 'gptel-agent + "t" 'gptel-tools) + +(general-def gptel-mode-map + "C-c C-s" 'my-gptel-save-session) + +;; u for ui +(general-def + :prefix "C-c u" + "l" 'global-tab-line-mode + "d" 'disable-theme + "f" 'rainbow-mode + "b" 'indent-bars-mode + "t" 'consult-theme + "c" 'my-color-picker) + +;; f for find and consult command +(general-def + :prefix "C-c f" + "r" 'consult-recent-file + "f" 'consult-fd + "g" 'consult-ripgrep + "e" 'consult-flycheck + "l" 'consult-locate + "m" 'consult-fd-global + "d" 'my-open-current-directory + "j" 'consult-jinx) + +;; t for modes toggle +(general-def + :prefix "C-c t" + "f" 'global-flycheck-mode + "j" 'my/jinx-smart-toggle + "g" 'gptel-mode) + +;; o for org-mode +(general-def + :prefix "C-c o" + "s" 'consult-org-agenda + "g" 'consult-org-ripgrep + "C" 'calendar + "c" 'org-capture + "p" 'my-blog-publish + "v" 'my-blog-preview) + +;; q for org-ql +(general-def + :prefix "C-c q" + "s" 'org-ql-search + "v" 'org-ql-view) + +;; j for journal +(general-def + :prefix "C-c j" + "o" 'org-journal-open-current-journal-file-delete-other-window + "n" 'org-journal-new-entry-delete-other-window) + +;; m for media +(general-def + :prefix "C-c m" + "n" 'emms-next + "p" 'emms-previous + "b" 'emms-browser + "q" 'emms-stop + "S" 'emms-toggle-single-track + "l" 'switch-to-emms-playlist + "d" 'my-emms-play-directory) + +;; d for dired +(general-def + :prefix "C-c d" + "a" 'dirvish-quick-access + "s" 'dirvish-side + "h" 'dirvish-history-menu) + +;; scratch buffer +(if *is-mac* + (general-def "C-c " 'scratch-buffer) + (general-def "C-c " 'scratch-buffer)) + +;; dired +(general-def (dired-mode-map dirvish-mode-map) + "h" 'dirvish-history-menu + "M-," 'scroll-other-window-down + "M-." 'scroll-other-window + "" 'emms-play-dired + "C-c m a" 'emms-add-dired + "" 'my/dired-next-line + "C-n" 'my/dired-next-line + "n" 'my/dired-next-line + "b" 'dired-up-directory + "C-b" 'dired-up-directory + "" 'dired-find-file + "" 'dired-up-directory + "C-f" 'dired-find-file + "" 'dirvish-layout-toggle) + +;; flycheck +(general-def flycheck-mode-map + "M-{" 'flycheck-previous-error + "M-}" 'flycheck-next-error) + +;; vterm +(general-def vterm-mode-map + "M-]" nil + "C-x C-x" 'vterm-send-C-x) + +;; embark +(general-def embark-file-map + "d" 'consult-directory-externally + "p" 'emms-play-dired) + +(general-def minibuffer-local-map + "C-c C-e" 'embark-export) + +;; markdown +(general-def markdown-mode-map + "M-p" nil + "M-n" nil) + +;; org-mode +(general-def org-mode-map + "C-" 'org-cycle-current-subtree + "C-c i" 'consult-org-heading + "C-c o w" 'my-org-refile-to-new-file) + +;; emms +(general-def emms-playlist-mode-map + "" 'emms-previous + "" 'emms-next) + +;; perspective +(general-def persp-mode-map + "C-c p c" nil + "C-M-" 'persp-prev + "C-M-" 'persp-next + "C-c p d" 'persp-kill) + +;; global map with C-c prefix +(general-def + :prefix "C-c" + "c" 'hydra-multiple-cursors/body + "r" 'restart-emacs + "e" 'er/expand-region + "s" 'consult-focus-lines + "i" 'consult-imenu + "a" 'org-agenda + "l" 'org-store-link + "k" 'comment-line + "v" 'vterm) + +;; global map +(general-def + + ;; buffer, file, and window + "" 'open-init-file + "" 'previous-buffer + "" 'next-buffer + "M-[" 'previous-buffer + "M-]" 'next-buffer + "C-x C-b" 'ibuffer-other-window + "C-x K" 'crux-kill-other-buffers + "C-x b" 'consult-buffer + "M-o" 'ace-window + + ;; edit + "M-c" 'capitalize-dwim + "M-u" 'upcase-dwim + "M-l" 'downcase-dwim + "C-," 'duplicate-and-move-to-next-line + "C-k" 'crux-smart-kill-line + "C-" 'crux-kill-line-backwards + "C-o" 'crux-smart-open-line + "C-a" 'crux-move-beginning-of-line + "M-y" 'consult-yank-from-kill-ring + "C-c " 'hungry-delete-backward + "C-c C-" 'hungry-delete-forward + "M-P" 'drag-stuff-up + "M-N" 'drag-stuff-down + + ;; undo + "C-/" 'undo-fu-only-undo + "C-?" 'undo-fu-only-redo + "C-x u" 'vundo + + ;; navigate + "M-p" 'backward-paragraph + "M-n" 'forward-paragraph + "" 'xref-find-definitions-at-mouse + "C-s" 'consult-line + "C-M-;" 'avy-goto-char + "C-M-'" 'avy-goto-word-1 + "M-g g" 'avy-goto-line + + ;; window + "M-" 'shrink-window-horizontally + "M-" 'enlarge-window-horizontally + "M-" 'shrink-window + "M-" 'enlarge-window + "" 'esw/swap-two-windows + "M-`" 'popper-toggle + "C-M-=" 'popper-toggle-type-delete-other-window + + ;; other + "C-x r b" 'consult-bookmark + "C-;" 'embark-act + "" 'global-tab-line-mode) + +;; expand region +(setq expand-region-reset-fast-key "r") +(setq expand-region-contract-fast-key "c") + +;; save-some-buffer时diff更改 +(add-to-list 'save-some-buffers-action-alist + (list "d" + (lambda (buffer) (diff-buffer-with-file (buffer-file-name buffer))) + "show diff between the buffer and its file")) + +;; 在calendar中快速打开当天日记 +(general-def calendar-mode-map + "j o" 'org-journal-open-entry-for-editing + "" 'org-journal-open-entry-for-editing) + +;; hydra (use-package hydra :defines (consult-imenu-config) :init @@ -26,7 +256,7 @@ ;; multiple-cursors (defhydra hydra-multiple-cursors () - " + " ^Mark^ ^Unmark^ ^Other^ ------------------------------------------------------------------ _p_ : prev line _P_ : previous _c_ : edit lines @@ -36,412 +266,17 @@ _b_ : prev symbol _s_ : in region _a_ : all dwim " - ("p" mc/mark-previous-like-this) - ("n" mc/mark-next-like-this) - ("b" mc/mark-previous-like-this-symbol) - ("f" mc/mark-next-like-this-symbol) - ("P" mc/unmark-previous-like-this) - ("N" mc/unmark-next-like-this) - ("a" mc/mark-all-dwim) - ("s" mc/mark-all-in-region) - ("c" mc/edit-lines) - ("." mc/mark-pop) - ("q" nil)) - -(global-set-key (kbd "C-c c") 'hydra-multiple-cursors/body) - -(use-package general) - -;; 修改mac键位 -(when *is-mac* - (setq mac-command-modifier 'meta) - (setq mac-option-modifier 'none)) - -;; 使用F2打开init.el -(defun open-init-file() - "Open user's init.el file in ~/.emacs.d ." - (interactive) - (find-file "~/.emacs.d/init.el")) - -(global-set-key (kbd "") 'open-init-file) - -;; 根据平台使用不同的重启方式 -(if *is-windows* - (progn - (defun restart-emacs () - "Restart emacs (for Windows)" - (interactive) - (save-some-buffers) - (w32-shell-execute "open" "runemacs.exe") - (kill-emacs)) - (global-set-key (kbd "C-c r") 'restart-emacs)) - (global-set-key (kbd "C-c r") 'restart-emacs)) - -;; expand region -(global-set-key (kbd "C-c e") 'er/expand-region) -(setq expand-region-reset-fast-key "r") -(setq expand-region-contract-fast-key "c") - -;; 大小写 -(global-set-key (kbd "M-c") 'capitalize-dwim) -(global-set-key (kbd "M-u") 'upcase-dwim) -(global-set-key (kbd "M-l") 'downcase-dwim) - -;; jinx相关 -(defun my/jinx-smart-toggle () - "Toggle jinx-mode smartly. -Disable jinx-mode if it's enable and global-jinx-mode is disable , otherwise toggle global-jinx-mode." - (interactive) - (unless (featurep 'jinx) - (require 'jinx)) - (let ((local-on (bound-and-true-p jinx-mode)) - (global-on (bound-and-true-p global-jinx-mode))) - (cond - ((and local-on (not global-on)) - (message "disable jinx-mode in current buffer") - (jinx-mode -1)) - (t - (if global-on - (progn - (message "disable global-jinx-mode") - (global-jinx-mode -1)) - (progn - (message "enable global-jinx-mode") - (global-jinx-mode 1))))))) - -(global-set-key (kbd "C-c j j") 'my/jinx-smart-toggle) -(with-eval-after-load 'init-jinx - (global-set-key (kbd "C-c f j") 'consult-jinx)) - -;; pair编辑 -;; (global-set-key (kbd "C-c p d") 'delete-pair) - -;; 快速复制当前行 -(defun duplicate-and-move-to-next-line() - "Duplicate current line and move to next line." - (interactive) - (progn - (duplicate-line) - (next-line))) -(global-set-key (kbd "C-,") 'duplicate-and-move-to-next-line) - -;; 切换buffer -(defun my-tab-line-buffers () - "Get list of buffers shown in tab-line." - (mapcar (lambda (tab) - (if (consp tab) (cdr tab) tab)) - (funcall tab-line-tabs-function))) - -(defun previous-buffer-with-tab-line () - "Switch to previous buffer in tab-line order." - (interactive) - (let ((already-enabled global-tab-line-mode)) - (unless already-enabled - (global-tab-line-mode 1)) - (let* ((buffers (my-tab-line-buffers)) - (current (current-buffer)) - (pos (cl-position current buffers))) - (when pos - (switch-to-buffer - (nth (mod (1- pos) (length buffers)) buffers)))) - (unless already-enabled - (run-with-idle-timer 0.5 nil (lambda () (global-tab-line-mode -1)))))) - -(defun next-buffer-with-tab-line () - "Switch to next buffer in tab-line order." - (interactive) - (let ((already-enabled global-tab-line-mode)) - (unless already-enabled - (global-tab-line-mode 1)) - (let* ((buffers (my-tab-line-buffers)) - (current (current-buffer)) - (pos (cl-position current buffers))) - (when pos - (switch-to-buffer - (nth (mod (1+ pos) (length buffers)) buffers)))) - (unless already-enabled - (run-with-idle-timer 0.5 nil (lambda () (global-tab-line-mode -1)))))) - -(global-set-key (kbd "") 'previous-buffer-with-tab-line) -(global-set-key (kbd "") 'previous-buffer) -(global-set-key (kbd "M-[") 'previous-buffer) -(global-set-key (kbd "") 'next-buffer-with-tab-line) -(global-set-key (kbd "") 'next-buffer) -(global-set-key (kbd "M-]") 'next-buffer) - -;; 打开tab-line-mode -(global-set-key (kbd "C-c u l") 'global-tab-line-mode) -(global-set-key (kbd "") 'global-tab-line-mode) - -;; 关闭主题 -(global-set-key (kbd "C-c u d") 'disable-theme) -(global-set-key (kbd "C-c u f") 'describe-face) -(global-set-key (kbd "C-c u r") 'rainbow-mode) - -;; indent-bars -(global-set-key (kbd "C-c u b") 'indent-bars-mode) - -;; 打开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) -(global-set-key (kbd "M-n") 'forward-paragraph) - -;; 中键使用embark打开定义 -(global-set-key (kbd "") 'xref-find-definitions) - -;; 使用快速切换到scratch buffer -(if *is-mac* - (global-set-key (kbd "C-c ") 'scratch-buffer) - (global-set-key (kbd "C-c ") 'scratch-buffer)) - -;; 调整window -(global-set-key (kbd "M-") 'shrink-window-horizontally) -(global-set-key (kbd "M-") 'enlarge-window-horizontally) -(global-set-key (kbd "M-") 'enlarge-window) -(global-set-key (kbd "M-") 'shrink-window) - -;; es-windows -(global-set-key (kbd "") 'esw/swap-two-windows) - -;; popper -(global-set-key (kbd "M-`") 'popper-toggle-latest) - -(defun popper-toggle-type-delete-other-window() - "Toggle type of popper window and delete other window." - (interactive) - (popper-toggle-type) - (delete-other-windows)) -(global-set-key (kbd "C-M-=") 'popper-toggle-type-delete-other-window) - -;; crux相关 -(global-set-key (kbd "C-") 'crux-kill-line-backwards) ;; C-DEL kill line backwards -(global-set-key (kbd "C-c k") 'comment-line) ;; 快速注释 -(global-set-key (kbd "C-k") 'crux-smart-kill-line) ;; smart kill line -(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) - -;; 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) ;; 搜索 -(global-set-key (kbd "C-c s") 'consult-focus-lines) ;; focus line -(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 g") 'consult-ripgrep) ;; consult-ripgrep -(global-set-key (kbd "M-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结果在一个菜单中显示 -(global-set-key (kbd "C-c f e") 'consult-flycheck) ;; flycheck菜单 -(global-set-key (kbd "C-c u t") 'consult-theme) ;; 主题预览 - -(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)) - -;; flycheck -(global-set-key (kbd "C-c f c") 'global-flycheck-mode) -(with-eval-after-load 'flycheck - (define-key flycheck-mode-map (kbd "M-{") 'flycheck-previous-error) - (define-key flycheck-mode-map (kbd "M-}") 'flycheck-next-error)) - -;; avy -(global-set-key (kbd "C-M-;") 'avy-goto-char) -(global-set-key (kbd "C-M-'") 'avy-goto-word-1) -(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 C-") 'hungry-delete-forward) ;; 向前删除到第一个非空字符 - -;; drag-stuff -(global-set-key (kbd "M-P") 'drag-stuff-up) -(global-set-key (kbd "M-N") 'drag-stuff-down) - -;; ace-windows -(global-set-key (kbd "M-o") 'ace-window) - -;; embark,修饰键之后加C-h可以查看所有指令 -(global-set-key (kbd "C-;") 'embark-act) - -;; vterm -(global-set-key (kbd "C-c v") 'vterm) -(with-eval-after-load 'vterm - (define-key vterm-mode-map (kbd "M-]") nil) - (define-key vterm-mode-map (kbd "C-x C-x") 'vterm-send-C-x)) - -;; ;; eshell -;; (with-eval-after-load 'eshell -;; (define-key eshell-mode-map (kbd "M-n") nil) -;; (define-key eshell-mode-map (kbd "M-p") nil) -;; (define-key eshell-mode-map (kbd "M-{") 'eshell-previous-matching-input-from-input) -;; (define-key eshell-mode-map (kbd "M-}") 'eshell-next-matching-input-from-input)) - -;; 打开目录 -(defun consult-directory-externally (file) - "Open FILE externally using the default application of the system." - (interactive "fOpen externally: ") - (if (and (eq system-type 'windows-nt) - (fboundp 'w32-shell-execute)) - (shell-command-to-string (encode-coding-string (replace-regexp-in-string "/" "\\\\" - (format "explorer.exe %s" (file-name-directory (expand-file-name file)))) - 'gbk)) - (call-process (pcase system-type - ('darwin "open") - ('cygwin "cygstart") - (_ "xdg-open")) - nil 0 nil - (file-name-directory (expand-file-name file))))) - -(with-eval-after-load 'embark - (define-key embark-file-map (kbd "d") 'consult-directory-externally)) - -;;打开当前文件的目录 -(defun my-open-current-directory () - "Open current directory in default file explorer." - (interactive) - (consult-directory-externally default-directory)) - -(global-set-key (kbd "C-c f d") 'my-open-current-directory) - -;; save-some-buffer时diff更改 -(add-to-list 'save-some-buffers-action-alist - (list "d" - (lambda (buffer) (diff-buffer-with-file (buffer-file-name buffer))) - "show diff between the buffer and its file")) -;; markdown -(with-eval-after-load 'markdown-mode - (define-key markdown-mode-map (kbd "M-p") nil) - (define-key markdown-mode-map (kbd "M-n") nil)) - -;; org-mode相关 -;; cycle当前subtree -(defun org-cycle-current-subtree() - "Cycle current subtree." - (interactive) - (org-back-to-heading) - (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)) - -;; 用consult检索org-agenda-file标题 -(global-set-key (kbd "C-c o s") 'consult-org-agenda) - -;; 用ripgrep搜索org-agenda-file -(defun my/org-agenda-rifle () - "Jump to org agenda files use consult-ripgrep." - (interactive) - (consult-ripgrep org-agenda-files)) - -(global-set-key (kbd "C-c o g") 'my/org-agenda-rifle) - -;; 存储一个链接 -(global-set-key (kbd "C-c l") 'org-store-link) - -;; 打开calendar -(global-set-key (kbd "C-c o C") 'calendar) - -;; 在calendar中快速打开当天日记 -(eval-after-load "calendar" - (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))) - -;; org-ql -(global-set-key (kbd "C-c q s") 'org-ql-search) -(global-set-key (kbd "C-c q v") 'org-ql-view) - -;; 日记 -(defun org-journal-open-current-journal-file-delete-other-window() - "Call org-journal-open-current-journal-file and delete other window." - (interactive) - (org-journal-open-current-journal-file) - (delete-other-windows)) - -(defun org-journal-new-entry-delete-other-window() - "Call org-journal-new-entry and delete other window." - (interactive) - (org-journal-new-entry nil) - (delete-other-windows)) - -(global-set-key (kbd "C-c j o") 'org-journal-open-current-journal-file-delete-other-window) -(global-set-key (kbd "C-c j n") 'org-journal-new-entry-delete-other-window) - -;; emms -(global-set-key (kbd "C-c m n") 'emms-next) -(global-set-key (kbd "C-c m p") 'emms-previous) -(global-set-key (kbd "C-c m b") 'emms-browser) -(global-set-key (kbd "C-c m q") 'emms-stop) -(global-set-key (kbd "C-c m S") 'emms-toggle-single-track) ;自动连播开关 - -(with-eval-after-load 'embark - (define-key embark-file-map (kbd "p") 'emms-play-dired)) - -(add-hook 'dired-mode-hook - (lambda () - (local-unset-key (kbd "")) - (local-set-key (kbd "") 'emms-play-dired) - (local-set-key (kbd "C-c m a") 'emms-add-dired))) - -(add-hook 'emms-playlist-mode-hook - (lambda () - (local-unset-key (kbd "")) - (local-unset-key (kbd "")) - (local-set-key (kbd "") 'emms-previous) - (local-set-key (kbd "") 'emms-next))) - -(defun switch-to-emms-playlist() - "Switch to emms playlist." - (interactive) - (switch-to-buffer "*EMMS Playlist*")) -(global-set-key (kbd "C-c m l") 'switch-to-emms-playlist) - -(global-set-key (kbd "C-c m d") 'my-emms-play-directory) - -;; dashboard -(global-set-key (kbd "C-c D") 'dashboard-open) - -;; dired -(with-eval-after-load 'dirvish - (global-set-key (kbd "C-c d a") 'dirvish-quick-access) - (global-set-key (kbd "C-c d s") 'dirvish-side) - (global-set-key (kbd "C-c d h") 'dirvish-history-menu) - (global-set-key (kbd "C-x d") 'dired-jump) - (global-set-key (kbd "C-x C-j") 'dired) - (define-key dired-mode-map (kbd "h") 'dirvish-history-menu) - (define-key dired-mode-map (kbd "M-,") 'scroll-other-window-down) - (define-key dired-mode-map (kbd "M-.") 'scroll-other-window)) - -;; perspective -(global-set-key (kbd "C-M-") 'persp-prev) -(global-set-key (kbd "C-M-") 'persp-next) -(define-key persp-mode-map (kbd "C-c p c") nil) -(global-set-key (kbd "C-c p d") 'persp-kill) - -;; gptel -(general-def - :prefix "C-c g" - "o" 'gptel - "m" 'gptel-menu - "s" 'gptel-send - "a" 'gptel-agent - "t" 'gptel-tools - "g" 'gptel-mode) + ("p" mc/mark-previous-like-this) + ("n" mc/mark-next-like-this) + ("b" mc/mark-previous-like-this-symbol) + ("f" mc/mark-next-like-this-symbol) + ("P" mc/unmark-previous-like-this) + ("N" mc/unmark-next-like-this) + ("a" mc/mark-all-dwim) + ("s" mc/mark-all-in-region) + ("c" mc/edit-lines) + ("." mc/mark-pop) + ("q" nil)) (provide 'init-kbd) diff --git a/lisp/init-org-refile.el b/lisp/init-org-refile.el index 99db956..7f4bbc4 100644 --- a/lisp/init-org-refile.el +++ b/lisp/init-org-refile.el @@ -135,9 +135,6 @@ (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 ecb36a1..fd15b52 100644 --- a/lisp/init-org.el +++ b/lisp/init-org.el @@ -150,8 +150,6 @@ (sequence "WAITING(w@/!)" "SOMEDAY(S)" "|" "CANCELLED(c@/!)" "MEETING(m)" "PHONE(p)")))) ;; agenda相关 -(global-set-key (kbd "C-c a") 'org-agenda) - (when *is-windows* (setq org-agenda-files '("h:/emacs/hugo/this-is-my-blog/all-blog.org" "h:/emacs/my-org-daily/" @@ -295,8 +293,6 @@ (setq org-bookmark-names-plist nil) -(global-set-key (kbd "C-c o c") 'org-capture) - ;; 批量调整表格 (defun org-table-align-all () "Ajust all table in current buffer." @@ -373,8 +369,6 @@ See `org-capture-templates' for more information." (message "Push may have failed or nothing to push, check *Messages* buffer for details") (message "Push successfully %s" timestamp))))) -(global-set-key (kbd "C-c o p") 'my-blog-publish) - ;; 预览博客 (defun my-blog-preview () "Save and preview blog." @@ -391,8 +385,6 @@ See `org-capture-templates' for more information." ;; 自动打开浏览器 (browse-url "http://localhost:1313"))) -(global-set-key (kbd "C-c o v") 'my-blog-preview) - (provide 'init-org) ;;; init-org.el ends here diff --git a/lisp/init-package.el b/lisp/init-package.el index 5170d21..793f035 100644 --- a/lisp/init-package.el +++ b/lisp/init-package.el @@ -227,22 +227,7 @@ targets." (lambda () (ibuffer-projectile-set-filter-groups) (unless (eq ibuffer-sorting-mode 'alphabetic) - (ibuffer-do-sort-by-alphabetic)))) - (when (centaur-treesit-available-p) - (defun treesit-mark-bigger-node () - "Use tree-sitter to mark regions." - (let* ((root (treesit-buffer-root-node)) - (node (treesit-node-descendant-for-range root (region-beginning) (region-end))) - (node-start (treesit-node-start node)) - (node-end (treesit-node-end node))) - ;; Node fits the region exactly. Try its parent node instead. - (when (and (= (region-beginning) node-start) (= (region-end) node-end)) - (when-let* ((node (treesit-node-parent node))) - (setq node-start (treesit-node-start node) - node-end (treesit-node-end node)))) - (set-mark node-end) - (goto-char node-start))) - (add-to-list 'er/try-expand-list 'treesit-mark-bigger-node))) + (ibuffer-do-sort-by-alphabetic))))) ;; avy中文支持 (use-package ace-pinyin diff --git a/lisp/init-startup.el b/lisp/init-startup.el index b9ae063..96a2c31 100644 --- a/lisp/init-startup.el +++ b/lisp/init-startup.el @@ -65,7 +65,9 @@ (advice-add 'scratch-buffer :after #'my/scratch-set-mode) ;; 开启server mode -(server-start) +(require 'server) +(unless (server-running-p) + (server-start)) ;; 窗口名 (setq-default frame-title-format '("%b - Emacs")) @@ -73,6 +75,9 @@ ;; electirc-pair-mode (add-hook 'org-mode-hook 'electric-pair-local-mode) +;; ibuffer +(setq ibuffer-default-sorting-mode 'filename) + ;; short anwser (if (boundp 'use-short-answers) (setq use-short-answers t) diff --git a/lisp/init-ui.el b/lisp/init-ui.el index 9cfbe38..384206d 100644 --- a/lisp/init-ui.el +++ b/lisp/init-ui.el @@ -33,8 +33,6 @@ colors)))) (string-trim (car (split-string choice))))) -(global-set-key (kbd "C-c u c") 'my-color-picker) - ;; rainbow mode (use-package rainbow-mode)