Files
.emacs.d/lisp/init-kbd.el
Andsy10 0f4ddc392c config: add macOS support with cross-platform compatibility
- Add platform-specific keybindings, paths, and settings for macOS
- Update org-mode templates and agenda files for both Windows and Mac
- Add vterm and lua-ts-mode packages (non-Windows)
- Configure Chinese segmentation for macOS
- Adjust font sizes and encoding settings per platform
2026-03-24 06:34:19 +08:00

230 lines
7.8 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-kbd.el
;;; -*- lexical-binding: t -*-
;; 修改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 "<f2>") 'open-init-file)
;; 快速打开函数与变量的定义
(global-set-key (kbd "C-h C-f") 'find-function)
(global-set-key (kbd "C-h C-v") 'find-variable)
;; 根据平台使用不同的重启方式
(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))
;; multiple cursors
(global-set-key (kbd "C-c c c") 'mc/edit-lines)
(global-set-key (kbd "C-c c a") 'mc/mark-all-in-region)
(global-set-key (kbd "C-<") 'mc/mark-previous-like-this)
(global-set-key (kbd "C->") 'mc/mark-next-like-this)
(global-set-key (kbd "<mouse-5>") 'mc/mark-pop)
;; 快速复制当前行
(defun duplicate-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 "<f3>") 'previous-buffer-with-tab-line)
(global-set-key (kbd "<mouse-4>") 'previous-buffer)
(global-set-key (kbd "M-[") 'previous-buffer)
(global-set-key (kbd "<f4>") 'next-buffer-with-tab-line)
(global-set-key (kbd "<mouse-5>") 'next-buffer)
(global-set-key (kbd "M-]") 'next-buffer)
;; 打开ibuffer
(global-set-key (kbd "C-x B") 'ibuffer)
;; 段落导航
(global-set-key (kbd "M-p") 'backward-paragraph)
(global-set-key (kbd "M-n") 'forward-paragraph)
;; 打开tab-line-mode
(global-set-key (kbd "C-c u t") 'global-tab-line-mode)
(global-set-key (kbd "<mouse-3>") 'global-tab-line-mode)
;; 中键使用embark打开定义
(global-set-key (kbd "<mouse-2>") 'xref-find-definitions)
;; 使用快速切换到scrath buffer
(if *is-mac*
(global-set-key (kbd "C-C <f12>") 'scratch-buffer)
(global-set-key (kbd "C-c <delete>") 'scratch-buffer))
;; 调整window
(global-set-key (kbd "<f5>") 'shrink-window-horizontally)
(global-set-key (kbd "<f6>") 'enlarge-window-horizontally)
(global-set-key (kbd "<f7>") 'enlarge-window)
(global-set-key (kbd "<f8>") 'shrink-window)
;; crux相关
(global-set-key (kbd "C-<backspace>") '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
;; 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 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中有更多操作
;; hungry-delete
(global-set-key (kbd "C-c DEL") 'hungry-delete-backward) ;; 向后删除到第一个非空字符
(global-set-key (kbd "C-c d") '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)
;; 打开目录
(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 ()
(interactive)
(consult-directory-externally default-directory))
(global-set-key (kbd "C-c f d") 'my-open-current-directory)
;; org-mode相关
;; cycle当前subtree
(defun org-cycle-current-subtree()
"Cycle current org-mode subtree."
(interactive)
(org-back-to-heading)
(org-cycle))
(global-set-key (kbd "C-<tab>") 'org-cycle-current-subtree)
;; 存储一个链接
(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"
'(define-key calendar-mode-map (kbd "j o") 'org-journal-open-entry-for-editing))
;; 日记
(global-set-key (kbd "C-c j o") 'org-journal-open-current-journal-file)
(global-set-key (kbd "C-c j n") 'org-journal-new-entry)
;; 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 "<mouse-2>"))
(local-set-key (kbd "<mouse-2>") '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 "<prior>"))
(local-unset-key (kbd "<next>"))
(local-set-key (kbd "<prior>") 'emms-previous)
(local-set-key (kbd "<next>") 'emms-next)))
(defun switch-to-emms-playlist()
(interactive)
(switch-to-buffer "*EMMS Playlist*"))
(global-set-key (kbd "C-c m l") 'switch-to-emms-playlist)
(provide 'init-kbd)