snowmacs/lisp/init-project.el

76 lines
2.6 KiB
EmacsLisp
Raw Normal View History

;;; init-projectile -- 项目管理的配置
;;; Commentary:
;;; Code:
;; 这个是基础配置部分
(require 'project)
;; 配置项目根目录识别
(setq project-vc-extra-root-markers '(".project" ".git" ".hg" ".svn" "Makefile"))
;; 设置项目列表文件
(setq project-list-file "~/.emacs.d/projects")
;; 设置项目切换时的默认命令列表
(setq project-switch-commands
'((project-find-file "Find file")
(project-dired "Dired")
(project-vc-dir "VC-Dir")
(project-shell "Shell")))
;; 自定义项目根目录识别函数
(defun my/project-try-custom-root (dir)
"Define custom project roots."
(let ((root (locate-dominating-file dir ".project")))
(and root (cons 'vc root))))
(add-hook 'project-find-functions #'my/project-try-custom-root)
;; 手动添加项目到 project.el 的项目列表
(defun my/add-project (dir)
"手动将 DIR 添加到 project.el 的项目列表中。"
(interactive "D添加项目目录: ")
2024-08-27 21:32:36 +08:00
(let ((projects (mapcar (lambda (p) (if (listp p) p (list p)))
(project-known-project-roots))))
(unless (member (list dir) projects)
(setq projects (append projects (list (list dir))))
(setq project--list projects)
;; 保存到 projects 文件,而不是 custom.el
(with-temp-file project-list-file
(insert (prin1-to-string projects)))
(message "项目 %s 已添加到 project.el 列表中" dir))))
;; 清除不存在的项目缓存
(defun project-forget-zombie-projects ()
"Remove non-existing projects from the known projects list."
(interactive)
(setq project--list
(cl-remove-if-not #'file-directory-p project--list))
(with-temp-file project-list-file
(insert (prin1-to-string project--list)))
(message "已移除不存在的项目"))
;; hydra配置
;; 定义一个用于Project项目管理的 hydra
(defhydra hydra-project-operations (:color blue :hint nil)
"
^Project项目管理^
^^^^^^^^^^^^^^^^^^^--------------------
_p_: 切换项目 _f_: 查找文件
_d_: 查找目录 _s_: 正则查找
_g_: 全局搜索 _b_: 切换缓冲区
_r_: 忽略项目 _a_: 添加项目
_c_: 清除缓存
"
("p" project-switch-project "切换项目")
("f" project-find-file "查找文件")
("d" project-find-dir "查找目录")
("s" project-find-regexp "正则查找")
("g" project-find-regexp "全局搜索")
("b" project-switch-to-buffer "切换缓冲区")
("r" project-forget-project "忽略项目")
("a" my/add-project "添加项目")
("c" project-forget-zombie-projects "清除缓存"))
(provide 'init-project)
;;; init-project.el ends here