Config: extract EMMS and clean up config, add gptel session save with AI-generated filenames
This commit is contained in:
1
init.el
1
init.el
@@ -17,6 +17,7 @@
|
|||||||
(require 'init-startup)
|
(require 'init-startup)
|
||||||
(require 'init-elpa)
|
(require 'init-elpa)
|
||||||
(require 'init-package)
|
(require 'init-package)
|
||||||
|
(require 'init-emms)
|
||||||
(require 'init-org)
|
(require 'init-org)
|
||||||
(require 'init-org-refile)
|
(require 'init-org-refile)
|
||||||
(require 'init-completion)
|
(require 'init-completion)
|
||||||
|
|||||||
@@ -44,7 +44,6 @@
|
|||||||
(corfu-popupinfo-mode)
|
(corfu-popupinfo-mode)
|
||||||
(corfu-history-mode)
|
(corfu-history-mode)
|
||||||
:config
|
:config
|
||||||
(add-hook 'after-init-hook #'global-corfu-mode)
|
|
||||||
;;Quit completion before saving
|
;;Quit completion before saving
|
||||||
(add-hook 'before-save-hook #'corfu-quit)
|
(add-hook 'before-save-hook #'corfu-quit)
|
||||||
(advice-add #'persistent-scratch-save :before #'corfu-quit)
|
(advice-add #'persistent-scratch-save :before #'corfu-quit)
|
||||||
@@ -103,8 +102,6 @@
|
|||||||
;; (add-to-list 'completion-at-point-functions #'cape-abbrev)
|
;; (add-to-list 'completion-at-point-functions #'cape-abbrev)
|
||||||
|
|
||||||
;; Make these capfs composable.
|
;; Make these capfs composable.
|
||||||
(advice-add 'lsp-completion-at-point :around #'cape-wrap-noninterruptible)
|
|
||||||
(advice-add 'lsp-completion-at-point :around #'cape-wrap-nonexclusive)
|
|
||||||
(advice-add 'comint-completion-at-point :around #'cape-wrap-nonexclusive)
|
(advice-add 'comint-completion-at-point :around #'cape-wrap-nonexclusive)
|
||||||
(advice-add 'eglot-completion-at-point :around #'cape-wrap-buster)
|
(advice-add 'eglot-completion-at-point :around #'cape-wrap-buster)
|
||||||
(advice-add 'eglot-completion-at-point :around #'cape-wrap-nonexclusive)
|
(advice-add 'eglot-completion-at-point :around #'cape-wrap-nonexclusive)
|
||||||
|
|||||||
161
lisp/init-emms.el
Normal file
161
lisp/init-emms.el
Normal file
@@ -0,0 +1,161 @@
|
|||||||
|
;;; init-emms.el --- emms -*- lexical-binding: t -*-
|
||||||
|
|
||||||
|
;;; Commentary:
|
||||||
|
|
||||||
|
;;; Code:
|
||||||
|
|
||||||
|
(use-package emms
|
||||||
|
:init
|
||||||
|
;; 设置音乐文件默认目录
|
||||||
|
(when *is-windows*
|
||||||
|
(setq emms-source-file-default-directory "F:/luping26-1-11/"))
|
||||||
|
|
||||||
|
:config
|
||||||
|
;; --- 基础设置 ---
|
||||||
|
(require 'emms-setup)
|
||||||
|
(emms-all) ; 加载所有稳定功能
|
||||||
|
|
||||||
|
;; 使用简单模式的 mpv 播放器
|
||||||
|
;; 移除默认的 emms-player-mpv
|
||||||
|
(require 'emms-player-simple)
|
||||||
|
|
||||||
|
;; 定义简单的 mpv 播放器
|
||||||
|
(define-emms-simple-player mpv-simple '(file url streamlist playlist)
|
||||||
|
(concat "\\.\\("
|
||||||
|
(mapconcat 'identity
|
||||||
|
'("mp3" "mp4" "avi" "mkv" "flv" "mov" "wmv" "webm"
|
||||||
|
"ogg" "ogv" "oga" "ogx"
|
||||||
|
"flac" "wav" "aac" "m4a" "wma"
|
||||||
|
"mpg" "mpeg" "mpe" "mpv"
|
||||||
|
"3gp" "3g2"
|
||||||
|
"m3u" "pls")
|
||||||
|
"\\|")
|
||||||
|
"\\)\\'\\|http[s]?://")
|
||||||
|
"mpv"
|
||||||
|
"--force-window=immediate"
|
||||||
|
"--keep-open=yes"
|
||||||
|
"--fs=no"
|
||||||
|
"--quiet")
|
||||||
|
|
||||||
|
;; 设置播放器列表
|
||||||
|
(setq emms-player-list '(emms-player-mpv-simple
|
||||||
|
emms-player-vlc
|
||||||
|
emms-player-mplayer))
|
||||||
|
|
||||||
|
(setq emms-playlist-default-playlist-name "*EMMS Playlist*")
|
||||||
|
(setq emms-playlist-buffer-name "*EMMS Playlist*")
|
||||||
|
|
||||||
|
;; 使用更快的文件查找方法(windows上需要使用internal)
|
||||||
|
;; (setq emms-source-file-directory-tree-function 'emms-source-file-directory-tree-find)
|
||||||
|
(setq emms-source-file-directory-tree-function 'emms-source-file-directory-tree-internal)
|
||||||
|
|
||||||
|
;; 使用原生 Elisp 元数据读取器
|
||||||
|
(setq emms-info-functions '(emms-info-native))
|
||||||
|
|
||||||
|
;; 异步读取元数据
|
||||||
|
(setq emms-info-asynchronously t)
|
||||||
|
|
||||||
|
;; 使用更详细的曲目描述
|
||||||
|
(setq emms-track-description-function #'emms-info-track-description)
|
||||||
|
|
||||||
|
;; 模式行设置
|
||||||
|
(require 'emms-mode-line)
|
||||||
|
(emms-mode-line-mode 1)
|
||||||
|
(emms-mode-line-blank) ; 初始为空
|
||||||
|
|
||||||
|
;; 自定义模式行格式
|
||||||
|
(setq emms-mode-line-format " [%s] ")
|
||||||
|
(setq emms-mode-line-length-limit 60)
|
||||||
|
|
||||||
|
;; 播放时间显示
|
||||||
|
(require 'emms-playing-time)
|
||||||
|
(emms-playing-time-mode 1)
|
||||||
|
|
||||||
|
;; 歌词设置
|
||||||
|
(require 'emms-lyrics)
|
||||||
|
(setq emms-lyrics-display-on-modeline t) ; 在模式行显示歌词
|
||||||
|
(setq emms-lyrics-display-on-minibuffer nil) ; 不在 minibuffer 显示
|
||||||
|
(setq emms-lyrics-display-buffer nil) ; 不使用专用缓冲区
|
||||||
|
(setq emms-lyrics-scroll-p t) ; 启用歌词滚动
|
||||||
|
(setq emms-lyrics-scroll-timer-interval 0.4) ; 滚动间隔
|
||||||
|
(setq emms-lyrics-dir "~/Music/lyrics") ; 歌词文件目录
|
||||||
|
(setq emms-lyrics-display-format " %s ") ; 歌词显示格式
|
||||||
|
(emms-lyrics 1) ; 启用歌词显示
|
||||||
|
|
||||||
|
;; 浏览器设置
|
||||||
|
(require 'emms-browser)
|
||||||
|
(setq emms-browser-default-browse-type 'artist)
|
||||||
|
(setq emms-browser-covers nil) ; 禁用封面
|
||||||
|
|
||||||
|
;; 浏览器显示格式
|
||||||
|
(setq emms-browser-info-title-format "%i%n")
|
||||||
|
(setq emms-browser-playlist-info-title-format "%i%n")
|
||||||
|
|
||||||
|
;; 添加浏览器快捷键
|
||||||
|
(define-key emms-browser-mode-map (kbd "SPC") 'emms-browser-add-tracks-and-play)
|
||||||
|
|
||||||
|
;; 缓存设置
|
||||||
|
(require 'emms-cache)
|
||||||
|
(emms-cache 1) ; 启用缓存
|
||||||
|
|
||||||
|
;; 历史记录
|
||||||
|
(require 'emms-history)
|
||||||
|
(add-hook 'emms-player-started-hook #'emms-last-played-update-current)
|
||||||
|
|
||||||
|
;; 音量控制
|
||||||
|
(require 'emms-volume)
|
||||||
|
;; 在播放列表中使用 +/- 控制音量
|
||||||
|
(define-key emms-playlist-mode-map (kbd "+") #'emms-volume-raise)
|
||||||
|
(define-key emms-playlist-mode-map (kbd "-") #'emms-volume-lower)
|
||||||
|
|
||||||
|
;; 添加(playlist中的)快捷键
|
||||||
|
(define-key emms-playlist-mode-map (kbd "SPC") 'emms-pause)
|
||||||
|
(define-key emms-playlist-mode-map (kbd "N") 'emms-next)
|
||||||
|
(define-key emms-playlist-mode-map (kbd "P") 'emms-previous)
|
||||||
|
(define-key emms-playlist-mode-map (kbd "R") 'emms-random)
|
||||||
|
(define-key emms-playlist-mode-map (kbd "/") 'emms-playlist-limit)
|
||||||
|
|
||||||
|
;; 启用标记功能
|
||||||
|
(require 'emms-mark)
|
||||||
|
|
||||||
|
;; 启用播放列表排序
|
||||||
|
(require 'emms-playlist-sort)
|
||||||
|
(define-key emms-playlist-mode-map (kbd "S s") 'emms-playlist-sort-map)
|
||||||
|
|
||||||
|
;; 启用播放列表限制/过滤
|
||||||
|
(require 'emms-playlist-limit)
|
||||||
|
|
||||||
|
;; 启用标签编辑器
|
||||||
|
(require 'emms-tag-editor)
|
||||||
|
|
||||||
|
;; 启用评分系统
|
||||||
|
(require 'emms-score)
|
||||||
|
(emms-score 1)
|
||||||
|
|
||||||
|
;; 启动后自动恢复播放列表
|
||||||
|
;; (add-hook 'after-init-hook 'emms-history-load)
|
||||||
|
|
||||||
|
;; 显示加载完成消息
|
||||||
|
(message "EMMS loaded")
|
||||||
|
|
||||||
|
;; 关闭自动连播
|
||||||
|
(add-hook 'emms-playlist-mode-hook
|
||||||
|
(lambda ()
|
||||||
|
(setq emms-single-track t))))
|
||||||
|
|
||||||
|
;; 提供 EMMS 快捷启动函数
|
||||||
|
(defun my-emms-start-browser ()
|
||||||
|
"Open emms browser."
|
||||||
|
(interactive)
|
||||||
|
(emms-browser)
|
||||||
|
(message "EMMS browser loaded"))
|
||||||
|
|
||||||
|
(defun my-emms-play-directory (dir)
|
||||||
|
"Play all files in directory.."
|
||||||
|
(interactive "Dchoose a directory: ")
|
||||||
|
(emms-play-directory-tree dir)
|
||||||
|
(message "playing: %s" dir))
|
||||||
|
|
||||||
|
(provide 'init-emms)
|
||||||
|
|
||||||
|
;;; init-emms.el ends here
|
||||||
@@ -5,10 +5,10 @@
|
|||||||
;;; Code:
|
;;; Code:
|
||||||
|
|
||||||
(use-package gptel
|
(use-package gptel
|
||||||
|
:hook (gptel-mode-hook . visual-line-mode)
|
||||||
:config
|
:config
|
||||||
(setq gptel-default-mode 'org-mode)
|
(setq gptel-default-mode 'org-mode)
|
||||||
|
|
||||||
|
|
||||||
(defun my/org-auto-gptel ()
|
(defun my/org-auto-gptel ()
|
||||||
(when (derived-mode-p 'org-mode)
|
(when (derived-mode-p 'org-mode)
|
||||||
(save-excursion
|
(save-excursion
|
||||||
@@ -86,12 +86,77 @@
|
|||||||
(setq gptel-model 'kimi-for-coding
|
(setq gptel-model 'kimi-for-coding
|
||||||
gptel-backend (gptel-get-backend "Kimi-Code"))
|
gptel-backend (gptel-get-backend "Kimi-Code"))
|
||||||
|
|
||||||
|
(defun my-gptel--sanitize-filename (name)
|
||||||
|
"Clean NAME into a safe kebab-case filename string."
|
||||||
|
(let ((clean (downcase name)))
|
||||||
|
(setq clean (replace-regexp-in-string "[^a-z0-9_-]" "-" clean))
|
||||||
|
(setq clean (replace-regexp-in-string "^-+\\|[-]+$" "" clean))
|
||||||
|
(setq clean (replace-regexp-in-string "-[-]+" "-" clean))
|
||||||
|
(string-trim clean)))
|
||||||
|
|
||||||
|
(defun my-gptel-save-session ()
|
||||||
|
"Save current gptel session to ~/gptel/ with AI-generated filename.
|
||||||
|
The filename is prefixed with a YYYYMMDD-HHmmss timestamp and generated
|
||||||
|
from the last 1500 characters of the buffer."
|
||||||
|
(interactive)
|
||||||
|
(unless gptel-mode
|
||||||
|
(user-error "Not a gptel session buffer"))
|
||||||
|
(let* ((buf (current-buffer))
|
||||||
|
(content (with-current-buffer buf
|
||||||
|
(buffer-substring-no-properties (point-min) (point-max))))
|
||||||
|
(tail (substring content (max 0 (- (length content) 1500))))
|
||||||
|
(prompt-text (format "Based on the following conversation, generate a short kebab-case filename (3 to 5 lowercase English words, hyphen-separated, no file extension). Output ONLY the filename, nothing else.\n\n%s"
|
||||||
|
tail)))
|
||||||
|
(message "Generating filename with AI...")
|
||||||
|
(let ((fsm (gptel-request prompt-text
|
||||||
|
:system "You are a filename generator. Output ONLY a short kebab-case filename (3-5 lowercase English words separated by hyphens). No explanations, no quotes, no punctuation, no file extension."
|
||||||
|
:stream nil
|
||||||
|
:callback
|
||||||
|
(lambda (response info)
|
||||||
|
(condition-case err
|
||||||
|
(cond
|
||||||
|
((null response)
|
||||||
|
(message "Failed to generate filename: %s"
|
||||||
|
(or (plist-get info :status) "unknown error")))
|
||||||
|
((not (stringp response))
|
||||||
|
(message "Unexpected response type: %S" response))
|
||||||
|
(t
|
||||||
|
(let* ((generated (my-gptel--sanitize-filename (string-trim response)))
|
||||||
|
(generated (if (string-empty-p generated)
|
||||||
|
"gptel-session"
|
||||||
|
generated))
|
||||||
|
(timestamp (format-time-string "%Y%m%d-%H%M%S"))
|
||||||
|
(dir (expand-file-name "~/gptel/"))
|
||||||
|
(base (concat timestamp "-" generated))
|
||||||
|
(file (expand-file-name (concat base ".org") dir)))
|
||||||
|
;; handle name collision
|
||||||
|
(when (file-exists-p file)
|
||||||
|
(setq base (concat timestamp "-" generated "-" (format-time-string "%S")))
|
||||||
|
(setq file (expand-file-name (concat base ".org") dir)))
|
||||||
|
(unless (file-directory-p dir)
|
||||||
|
(make-directory dir t))
|
||||||
|
;; write-file triggers gptel--save-state to preserve metadata
|
||||||
|
(with-current-buffer buf
|
||||||
|
(write-file file))
|
||||||
|
(if (file-exists-p file)
|
||||||
|
(progn
|
||||||
|
(pop-to-buffer (find-file-noselect file))
|
||||||
|
(message "Saved gptel session to %s" file))
|
||||||
|
(message "ERROR: File was not created: %s" file)))))
|
||||||
|
(error (message "gptel save-session error: %S" err)))))))
|
||||||
|
(unless (plist-get (gptel-fsm-info fsm) :callback)
|
||||||
|
(message "WARNING: gptel-request did not register callback!")))))
|
||||||
|
|
||||||
(with-eval-after-load 'gptel
|
(with-eval-after-load 'gptel
|
||||||
|
(define-key gptel-mode-map (kbd "C-c C-s") #'my-gptel-save-session)
|
||||||
(setf gptel--system-message
|
(setf gptel--system-message
|
||||||
"You are a large language model living in Emacs and a helpful assistant. Respond concisely.
|
"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`).")))
|
- 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`).")))
|
||||||
|
|
||||||
(use-package gptel-agent
|
(use-package gptel-agent
|
||||||
|
:init
|
||||||
|
(with-eval-after-load 'gptel
|
||||||
|
(require 'gptel-agent))
|
||||||
:config
|
:config
|
||||||
(add-to-list 'gptel-agent-dirs "~/.emacs.d/lisp/" t)
|
(add-to-list 'gptel-agent-dirs "~/.emacs.d/lisp/" t)
|
||||||
(gptel-agent-update))
|
(gptel-agent-update))
|
||||||
|
|||||||
@@ -4,11 +4,15 @@
|
|||||||
|
|
||||||
;;; Code:
|
;;; 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 hydra
|
(use-package hydra
|
||||||
:defines (consult-imenu-config posframe-border-width)
|
:defines (consult-imenu-config)
|
||||||
:functions childframe-completion-workable-p
|
|
||||||
:hook ((emacs-lisp-mode . hydra-add-imenu)
|
|
||||||
((after-init after-load-theme server-after-make-frame) . hydra-set-posframe))
|
|
||||||
:init
|
:init
|
||||||
(with-eval-after-load 'consult-imenu
|
(with-eval-after-load 'consult-imenu
|
||||||
(setq consult-imenu-config
|
(setq consult-imenu-config
|
||||||
@@ -18,28 +22,11 @@
|
|||||||
(?m "Macros" font-lock-function-name-face)
|
(?m "Macros" font-lock-function-name-face)
|
||||||
(?p "Packages" font-lock-constant-face)
|
(?p "Packages" font-lock-constant-face)
|
||||||
(?t "Types" font-lock-type-face)
|
(?t "Types" font-lock-type-face)
|
||||||
(?v "Variables" font-lock-variable-name-face))))))
|
(?v "Variables" font-lock-variable-name-face)))))))
|
||||||
|
|
||||||
(defun hydra-set-posframe ()
|
|
||||||
"Set display type and appearance of hydra."
|
|
||||||
;; Display type
|
|
||||||
(if (childframe-completion-workable-p)
|
|
||||||
(setq hydra-hint-display-type 'posframe)
|
|
||||||
(setq hydra-hint-display-type 'lv))
|
|
||||||
;; Appearance
|
|
||||||
(setq hydra-posframe-show-params
|
|
||||||
`(:left-fringe 8
|
|
||||||
:right-fringe 8
|
|
||||||
:internal-border-width ,posframe-border-width
|
|
||||||
:internal-border-color ,(face-background 'posframe-border nil t)
|
|
||||||
:background-color ,(face-background 'tooltip nil t)
|
|
||||||
:foreground-color ,(face-foreground 'tooltip nil t)
|
|
||||||
:lines-truncate t
|
|
||||||
:poshandler posframe-poshandler-frame-center-near-bottom))))
|
|
||||||
|
|
||||||
;; multiple-cursors
|
;; multiple-cursors
|
||||||
(defhydra hydra-multiple-cursors ()
|
(defhydra hydra-multiple-cursors ()
|
||||||
"
|
"
|
||||||
^Mark^ ^Unmark^ ^Other^
|
^Mark^ ^Unmark^ ^Other^
|
||||||
------------------------------------------------------------------
|
------------------------------------------------------------------
|
||||||
_p_ : prev line _P_ : previous _c_ : edit lines
|
_p_ : prev line _P_ : previous _c_ : edit lines
|
||||||
@@ -49,17 +36,17 @@ _b_ : prev symbol
|
|||||||
_s_ : in region
|
_s_ : in region
|
||||||
_a_ : all dwim
|
_a_ : all dwim
|
||||||
"
|
"
|
||||||
("p" mc/mark-previous-like-this)
|
("p" mc/mark-previous-like-this)
|
||||||
("n" mc/mark-next-like-this)
|
("n" mc/mark-next-like-this)
|
||||||
("b" mc/mark-previous-like-this-symbol)
|
("b" mc/mark-previous-like-this-symbol)
|
||||||
("f" mc/mark-next-like-this-symbol)
|
("f" mc/mark-next-like-this-symbol)
|
||||||
("P" mc/unmark-previous-like-this)
|
("P" mc/unmark-previous-like-this)
|
||||||
("N" mc/unmark-next-like-this)
|
("N" mc/unmark-next-like-this)
|
||||||
("a" mc/mark-all-dwim)
|
("a" mc/mark-all-dwim)
|
||||||
("s" mc/mark-all-in-region)
|
("s" mc/mark-all-in-region)
|
||||||
("c" mc/edit-lines)
|
("c" mc/edit-lines)
|
||||||
("." mc/mark-pop)
|
("." mc/mark-pop)
|
||||||
("q" nil))
|
("q" nil))
|
||||||
|
|
||||||
(global-set-key (kbd "C-c c") 'hydra-multiple-cursors/body)
|
(global-set-key (kbd "C-c c") 'hydra-multiple-cursors/body)
|
||||||
|
|
||||||
@@ -84,7 +71,7 @@ _a_ : all dwim
|
|||||||
(defun restart-emacs ()
|
(defun restart-emacs ()
|
||||||
"Restart emacs (for Windows)"
|
"Restart emacs (for Windows)"
|
||||||
(interactive)
|
(interactive)
|
||||||
(save-some-buffers)
|
(save-some-buffers)
|
||||||
(w32-shell-execute "open" "runemacs.exe")
|
(w32-shell-execute "open" "runemacs.exe")
|
||||||
(kill-emacs))
|
(kill-emacs))
|
||||||
(global-set-key (kbd "C-c r") 'restart-emacs))
|
(global-set-key (kbd "C-c r") 'restart-emacs))
|
||||||
@@ -207,7 +194,7 @@ Disable jinx-mode if it's enable and global-jinx-mode is disable , otherwise tog
|
|||||||
|
|
||||||
;; 使用快速切换到scratch buffer
|
;; 使用快速切换到scratch buffer
|
||||||
(if *is-mac*
|
(if *is-mac*
|
||||||
(global-set-key (kbd "C-C <f12>") 'scratch-buffer)
|
(global-set-key (kbd "C-c <f12>") 'scratch-buffer)
|
||||||
(global-set-key (kbd "C-c <delete>") 'scratch-buffer))
|
(global-set-key (kbd "C-c <delete>") 'scratch-buffer))
|
||||||
|
|
||||||
;; 调整window
|
;; 调整window
|
||||||
@@ -310,7 +297,7 @@ Disable jinx-mode if it's enable and global-jinx-mode is disable , otherwise tog
|
|||||||
(fboundp 'w32-shell-execute))
|
(fboundp 'w32-shell-execute))
|
||||||
(shell-command-to-string (encode-coding-string (replace-regexp-in-string "/" "\\\\"
|
(shell-command-to-string (encode-coding-string (replace-regexp-in-string "/" "\\\\"
|
||||||
(format "explorer.exe %s" (file-name-directory (expand-file-name file))))
|
(format "explorer.exe %s" (file-name-directory (expand-file-name file))))
|
||||||
'gbk))
|
'gbk))
|
||||||
(call-process (pcase system-type
|
(call-process (pcase system-type
|
||||||
('darwin "open")
|
('darwin "open")
|
||||||
('cygwin "cygstart")
|
('cygwin "cygstart")
|
||||||
@@ -406,17 +393,17 @@ Disable jinx-mode if it's enable and global-jinx-mode is disable , otherwise tog
|
|||||||
(define-key embark-file-map (kbd "p") 'emms-play-dired))
|
(define-key embark-file-map (kbd "p") 'emms-play-dired))
|
||||||
|
|
||||||
(add-hook 'dired-mode-hook
|
(add-hook 'dired-mode-hook
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(local-unset-key (kbd "<mouse-2>"))
|
(local-unset-key (kbd "<mouse-2>"))
|
||||||
(local-set-key (kbd "<mouse-2>") 'emms-play-dired)
|
(local-set-key (kbd "<mouse-2>") 'emms-play-dired)
|
||||||
(local-set-key (kbd "C-c m a") 'emms-add-dired)))
|
(local-set-key (kbd "C-c m a") 'emms-add-dired)))
|
||||||
|
|
||||||
(add-hook 'emms-playlist-mode-hook
|
(add-hook 'emms-playlist-mode-hook
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(local-unset-key (kbd "<prior>"))
|
(local-unset-key (kbd "<prior>"))
|
||||||
(local-unset-key (kbd "<next>"))
|
(local-unset-key (kbd "<next>"))
|
||||||
(local-set-key (kbd "<prior>") 'emms-previous)
|
(local-set-key (kbd "<prior>") 'emms-previous)
|
||||||
(local-set-key (kbd "<next>") 'emms-next)))
|
(local-set-key (kbd "<next>") 'emms-next)))
|
||||||
|
|
||||||
(defun switch-to-emms-playlist()
|
(defun switch-to-emms-playlist()
|
||||||
"Switch to emms playlist."
|
"Switch to emms playlist."
|
||||||
@@ -452,7 +439,9 @@ Disable jinx-mode if it's enable and global-jinx-mode is disable , otherwise tog
|
|||||||
"o" 'gptel
|
"o" 'gptel
|
||||||
"m" 'gptel-menu
|
"m" 'gptel-menu
|
||||||
"s" 'gptel-send
|
"s" 'gptel-send
|
||||||
"a" 'gptel-agent)
|
"a" 'gptel-agent
|
||||||
|
"t" 'gptel-tools
|
||||||
|
"g" 'gptel-mode)
|
||||||
|
|
||||||
(provide 'init-kbd)
|
(provide 'init-kbd)
|
||||||
|
|
||||||
|
|||||||
@@ -278,7 +278,6 @@
|
|||||||
#+title: %(symbol-value 'my-org-capture-temp-title)
|
#+title: %(symbol-value 'my-org-capture-temp-title)
|
||||||
#+date: %U
|
#+date: %U
|
||||||
#+category: %^{Category|none|project|book|article|note|wisdom|fun|data}
|
#+category: %^{Category|none|project|book|article|note|wisdom|fun|data}
|
||||||
#+STARTUP: content
|
|
||||||
|
|
||||||
* %(symbol-value 'my-org-capture-temp-title) :root%^g
|
* %(symbol-value 'my-org-capture-temp-title) :root%^g
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
;; 安装gcmh用于管理内存回收
|
;; 安装gcmh用于管理内存回收
|
||||||
(use-package gcmh
|
(use-package gcmh
|
||||||
;; :demand t
|
:demand t
|
||||||
:init
|
:init
|
||||||
(setq gcmh-idle-delay 'auto
|
(setq gcmh-idle-delay 'auto
|
||||||
gcmh-auto-idle-delay-factor 10
|
gcmh-auto-idle-delay-factor 10
|
||||||
@@ -187,7 +187,7 @@ targets."
|
|||||||
#'consult-preview-at-point-mode))))
|
#'consult-preview-at-point-mode))))
|
||||||
|
|
||||||
;; nerd-icon
|
;; nerd-icon
|
||||||
(use-package nerd-icons)
|
;; (use-package nerd-icons)
|
||||||
|
|
||||||
;; 启用savehist,保存命令顺序
|
;; 启用savehist,保存命令顺序
|
||||||
(use-package savehist
|
(use-package savehist
|
||||||
@@ -291,159 +291,6 @@ targets."
|
|||||||
:bind (:map markdown-mode-map
|
:bind (:map markdown-mode-map
|
||||||
("C-c C-e" . markdown-do)))
|
("C-c C-e" . markdown-do)))
|
||||||
|
|
||||||
;; 安装emms
|
|
||||||
(use-package emms
|
|
||||||
:init
|
|
||||||
;; 设置音乐文件默认目录
|
|
||||||
(when *is-windows*
|
|
||||||
(setq emms-source-file-default-directory "F:/luping26-1-11/"))
|
|
||||||
|
|
||||||
:config
|
|
||||||
;; --- 基础设置 ---
|
|
||||||
(require 'emms-setup)
|
|
||||||
(emms-all) ; 加载所有稳定功能
|
|
||||||
|
|
||||||
;; 使用简单模式的 mpv 播放器
|
|
||||||
;; 移除默认的 emms-player-mpv
|
|
||||||
(require 'emms-player-simple)
|
|
||||||
|
|
||||||
;; 定义简单的 mpv 播放器
|
|
||||||
(define-emms-simple-player mpv-simple '(file url streamlist playlist)
|
|
||||||
(concat "\\.\\("
|
|
||||||
(mapconcat 'identity
|
|
||||||
'("mp3" "mp4" "avi" "mkv" "flv" "mov" "wmv" "webm"
|
|
||||||
"ogg" "ogv" "oga" "ogx"
|
|
||||||
"flac" "wav" "aac" "m4a" "wma"
|
|
||||||
"mpg" "mpeg" "mpe" "mpv"
|
|
||||||
"3gp" "3g2"
|
|
||||||
"m3u" "pls")
|
|
||||||
"\\|")
|
|
||||||
"\\)\\'\\|http[s]?://")
|
|
||||||
"mpv"
|
|
||||||
"--force-window=immediate"
|
|
||||||
"--keep-open=yes"
|
|
||||||
"--fs=no"
|
|
||||||
"--quiet")
|
|
||||||
|
|
||||||
;; 设置播放器列表
|
|
||||||
(setq emms-player-list '(emms-player-mpv-simple
|
|
||||||
emms-player-vlc
|
|
||||||
emms-player-mplayer))
|
|
||||||
|
|
||||||
(setq emms-playlist-default-playlist-name "*EMMS Playlist*")
|
|
||||||
(setq emms-playlist-buffer-name "*EMMS Playlist*")
|
|
||||||
|
|
||||||
;; 使用更快的文件查找方法(windows上需要使用internal)
|
|
||||||
;; (setq emms-source-file-directory-tree-function 'emms-source-file-directory-tree-find)
|
|
||||||
(setq emms-source-file-directory-tree-function 'emms-source-file-directory-tree-internal)
|
|
||||||
|
|
||||||
;; 使用原生 Elisp 元数据读取器
|
|
||||||
(setq emms-info-functions '(emms-info-native))
|
|
||||||
|
|
||||||
;; 异步读取元数据
|
|
||||||
(setq emms-info-asynchronously t)
|
|
||||||
|
|
||||||
;; 使用更详细的曲目描述
|
|
||||||
(setq emms-track-description-function #'emms-info-track-description)
|
|
||||||
|
|
||||||
;; 模式行设置
|
|
||||||
(require 'emms-mode-line)
|
|
||||||
(emms-mode-line-mode 1)
|
|
||||||
(emms-mode-line-blank) ; 初始为空
|
|
||||||
|
|
||||||
;; 自定义模式行格式
|
|
||||||
(setq emms-mode-line-format " [%s] ")
|
|
||||||
(setq emms-mode-line-length-limit 60)
|
|
||||||
|
|
||||||
;; 播放时间显示
|
|
||||||
(require 'emms-playing-time)
|
|
||||||
(emms-playing-time-mode 1)
|
|
||||||
|
|
||||||
;; 歌词设置
|
|
||||||
(require 'emms-lyrics)
|
|
||||||
(setq emms-lyrics-display-on-modeline t) ; 在模式行显示歌词
|
|
||||||
(setq emms-lyrics-display-on-minibuffer nil) ; 不在 minibuffer 显示
|
|
||||||
(setq emms-lyrics-display-buffer nil) ; 不使用专用缓冲区
|
|
||||||
(setq emms-lyrics-scroll-p t) ; 启用歌词滚动
|
|
||||||
(setq emms-lyrics-scroll-timer-interval 0.4) ; 滚动间隔
|
|
||||||
(setq emms-lyrics-dir "~/Music/lyrics") ; 歌词文件目录
|
|
||||||
(setq emms-lyrics-display-format " %s ") ; 歌词显示格式
|
|
||||||
(emms-lyrics 1) ; 启用歌词显示
|
|
||||||
|
|
||||||
;; 浏览器设置
|
|
||||||
(require 'emms-browser)
|
|
||||||
(setq emms-browser-default-browse-type 'artist)
|
|
||||||
(setq emms-browser-covers nil) ; 禁用封面
|
|
||||||
|
|
||||||
;; 浏览器显示格式
|
|
||||||
(setq emms-browser-info-title-format "%i%n")
|
|
||||||
(setq emms-browser-playlist-info-title-format "%i%n")
|
|
||||||
|
|
||||||
;; 添加浏览器快捷键
|
|
||||||
(define-key emms-browser-mode-map (kbd "SPC") 'emms-browser-add-tracks-and-play)
|
|
||||||
|
|
||||||
;; 缓存设置
|
|
||||||
(require 'emms-cache)
|
|
||||||
(emms-cache 1) ; 启用缓存
|
|
||||||
|
|
||||||
;; 历史记录
|
|
||||||
(require 'emms-history)
|
|
||||||
(add-hook 'emms-player-started-hook #'emms-last-played-update-current)
|
|
||||||
|
|
||||||
;; 音量控制
|
|
||||||
(require 'emms-volume)
|
|
||||||
;; 在播放列表中使用 +/- 控制音量
|
|
||||||
(define-key emms-playlist-mode-map (kbd "+") #'emms-volume-raise)
|
|
||||||
(define-key emms-playlist-mode-map (kbd "-") #'emms-volume-lower)
|
|
||||||
|
|
||||||
;; 添加(playlist中的)快捷键
|
|
||||||
(define-key emms-playlist-mode-map (kbd "SPC") 'emms-pause)
|
|
||||||
(define-key emms-playlist-mode-map (kbd "N") 'emms-next)
|
|
||||||
(define-key emms-playlist-mode-map (kbd "P") 'emms-previous)
|
|
||||||
(define-key emms-playlist-mode-map (kbd "R") 'emms-random)
|
|
||||||
(define-key emms-playlist-mode-map (kbd "/") 'emms-playlist-limit)
|
|
||||||
|
|
||||||
;; 启用标记功能
|
|
||||||
(require 'emms-mark)
|
|
||||||
|
|
||||||
;; 启用播放列表排序
|
|
||||||
(require 'emms-playlist-sort)
|
|
||||||
(define-key emms-playlist-mode-map (kbd "S s") 'emms-playlist-sort-map)
|
|
||||||
|
|
||||||
;; 启用播放列表限制/过滤
|
|
||||||
(require 'emms-playlist-limit)
|
|
||||||
|
|
||||||
;; 启用标签编辑器
|
|
||||||
(require 'emms-tag-editor)
|
|
||||||
|
|
||||||
;; 启用评分系统
|
|
||||||
(require 'emms-score)
|
|
||||||
(emms-score 1)
|
|
||||||
|
|
||||||
;; 启动后自动恢复播放列表
|
|
||||||
;; (add-hook 'after-init-hook 'emms-history-load)
|
|
||||||
|
|
||||||
;; 显示加载完成消息
|
|
||||||
(message "EMMS loaded")
|
|
||||||
|
|
||||||
;; 关闭自动连播
|
|
||||||
(add-hook 'emms-playlist-mode-hook
|
|
||||||
(lambda ()
|
|
||||||
(setq emms-single-track t))))
|
|
||||||
|
|
||||||
;; 提供 EMMS 快捷启动函数
|
|
||||||
(defun my-emms-start-browser ()
|
|
||||||
"Open emms browser."
|
|
||||||
(interactive)
|
|
||||||
(emms-browser)
|
|
||||||
(message "EMMS browser loaded"))
|
|
||||||
|
|
||||||
(defun my-emms-play-directory (dir)
|
|
||||||
"Play all files in directory.."
|
|
||||||
(interactive "Dchoose a directory: ")
|
|
||||||
(emms-play-directory-tree dir)
|
|
||||||
(message "playing: %s" dir))
|
|
||||||
|
|
||||||
;; vterm
|
;; vterm
|
||||||
(unless *is-windows*
|
(unless *is-windows*
|
||||||
(use-package vterm))
|
(use-package vterm))
|
||||||
|
|||||||
@@ -85,8 +85,8 @@
|
|||||||
(setq visible-bell t
|
(setq visible-bell t
|
||||||
inhibit-compacting-font-caches t ; Don’t compact font caches during GC
|
inhibit-compacting-font-caches t ; Don’t compact font caches during GC
|
||||||
delete-by-moving-to-trash t ; Deleting files go to OS's trash folder
|
delete-by-moving-to-trash t ; Deleting files go to OS's trash folder
|
||||||
make-backup-files nil ; Forbide to make backup files
|
;; make-backup-files nil ; Forbide to make backup files
|
||||||
auto-save-default nil ; Disable auto save
|
;; auto-save-default nil ; Disable auto save
|
||||||
|
|
||||||
uniquify-buffer-name-style 'post-forward-angle-brackets ; Show path if names are same
|
uniquify-buffer-name-style 'post-forward-angle-brackets ; Show path if names are same
|
||||||
adaptive-fill-regexp "[ t]+|[ t]*([0-9]+.|*+)[ t]*"
|
adaptive-fill-regexp "[ t]+|[ t]*([0-9]+.|*+)[ t]*"
|
||||||
|
|||||||
@@ -38,6 +38,9 @@
|
|||||||
;; rainbow mode
|
;; rainbow mode
|
||||||
(use-package rainbow-mode)
|
(use-package rainbow-mode)
|
||||||
|
|
||||||
|
;; rainbow-delimiters
|
||||||
|
(use-package rainbow-delimiters)
|
||||||
|
|
||||||
;; 自定义主题路径
|
;; 自定义主题路径
|
||||||
(add-to-list 'custom-theme-load-path "~/.emacs.d/lisp/")
|
(add-to-list 'custom-theme-load-path "~/.emacs.d/lisp/")
|
||||||
|
|
||||||
@@ -60,7 +63,7 @@
|
|||||||
;; (use-package color-theme-modern)
|
;; (use-package color-theme-modern)
|
||||||
(use-package naysayer-theme)
|
(use-package naysayer-theme)
|
||||||
|
|
||||||
;; 安装smart-mode-line
|
;; modeline
|
||||||
;; (use-package smart-mode-line
|
;; (use-package smart-mode-line
|
||||||
;; :config
|
;; :config
|
||||||
;; (setq sml/no-confirm-load-theme t)
|
;; (setq sml/no-confirm-load-theme t)
|
||||||
@@ -181,9 +184,9 @@
|
|||||||
|
|
||||||
;; 安装cnfonts脚本,用于修复中英文对齐
|
;; 安装cnfonts脚本,用于修复中英文对齐
|
||||||
(use-package cnfonts
|
(use-package cnfonts
|
||||||
:defer 0
|
:init
|
||||||
:config
|
|
||||||
(cnfonts-mode 1)
|
(cnfonts-mode 1)
|
||||||
|
:config
|
||||||
(cnfonts--select-profile "profile1"))
|
(cnfonts--select-profile "profile1"))
|
||||||
|
|
||||||
;; 主题修复脚本
|
;; 主题修复脚本
|
||||||
|
|||||||
Reference in New Issue
Block a user