Config: extract EMMS and clean up config, add gptel session save with AI-generated filenames

This commit is contained in:
User
2026-04-17 02:35:16 +08:00
parent 263df285fc
commit a755ad5a04
9 changed files with 274 additions and 212 deletions

View File

@@ -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)

View File

@@ -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
View 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

View File

@@ -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))

View File

@@ -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)

View File

@@ -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:

View File

@@ -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))

View File

@@ -85,8 +85,8 @@
(setq visible-bell t (setq visible-bell t
inhibit-compacting-font-caches t ; Dont compact font caches during GC inhibit-compacting-font-caches t ; Dont 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]*"

View File

@@ -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"))
;; 主题修复脚本 ;; 主题修复脚本