前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >project.el 使用说明

project.el 使用说明

作者头像
飞驰的西瓜
发布2022-07-26 16:38:21
3990
发布2022-07-26 16:38:21
举报
文章被收录于专栏:EmacsTalk

在之前的文章中就多次提到过 28 版本的 project.el 是如何好用,但一直没去详细介绍,这篇文章就来填上这个坑。一句话总结,project.el 完全可以替换 projectile[1]。

下载

直接编译 28 版本或者在 elpa[2] 下载最新版。project 相关命令绑定在 C-x p

根目录

在日常编程中,Emacs 的很多包都依赖一个功能:查找当前项目的根目录,比如 lsp-mode、citre 等。在 project.el 中,默认只支持 VC[3] 中的 Git,即 project-try-vc,但可以自定义找根目录的方式,配置如下:

代码语言:javascript
复制
(defun my/project-try-local (dir)
  "Determine if DIR is a non-Git project."
  (catch 'ret
    (let ((pr-flags '((".project" "pom.xml" "go.mod" "Cargo.toml" "project.clj") ;; higher priority
                      ("Makefile" "README.org" "README.md"))))
      (dolist (current-level pr-flags)
        (dolist (f current-level)
          (when-let ((root (locate-dominating-file dir f)))
            (throw 'ret (cons 'local root))))))))
 
(setq project-find-functions '(my/project-try-local project-try-vc))

my/project-try-local 函数定义了常用编程语言的依赖描述文件,只要有这些文件,都可以看作项目根目录。作为额外的补充,可以通过创建一个名为 .project 的文件,用作根目录的标识,与 .projectile 类似

该函数返回一个 cons,car 为项目类型,这里定义为 local,cdr 为根目录。

查找文件

查找文件是非常高频的操作,可以使用 Rust 编写的 fd[4] 来代替 find,速度更快。配置如下:

代码语言:javascript
复制
(defun my/project-files-in-directory (dir)
  "Use `fd' to list files in DIR."
  (let* ((default-directory dir)
         (localdir (file-local-name (expand-file-name dir)))
         (command (format "fd -H -t f -0 . %s" localdir)))
    (project--remote-file-names
     (sort (split-string (shell-command-to-string command) "\0" t)
           #'string<))))
 
(cl-defmethod project-files ((project (head local)) &optional dirs)
  "Override `project-files' to use `fd' in local projects."
  (mapcan #'my/project-files-in-directory
          (or dirs (list (project-root project)))))

通过重载 project-filesM-x project-find-file 时就会用 fd 来搜索文件了。

常用命令

project.el 提供了很多命令来方便在项目中进行操作,这里列举几个常用的:

• project-remember-projects-under,增加项目

• project-forget-project,删除项目

• project-switch-project,切换项目

• project-compile,执行项目的 compile 命令

• project-search,在项目中搜索指定关键字

• project-query-replace-regexp,在项目中执行正则替换

• project-shell-command,执行 shell 命令

• project-eshell,在根目录打开 eshell

• project-dired,在根目录打开 dired

• project-find-dir,在项目指定目录打开 dired

• project-switch-to-buffer,切换到项目中已经打开的 buffer

扩展命令

代码语言:javascript
复制
(defun my/project-info ()
  (interactive)
  (message "%s" (project-current t)))
 
(defun my/project-discover ()
  "Add dir to project under search-path."
  (interactive)
  (dolist (search-path '("~/code/" "~/git/"))
    (dolist (file (file-name-all-completions  "" search-path))
      (when (not (member file '("./" "../")))
        (let ((full-name (expand-file-name file search-path)))
          (when (file-directory-p full-name)
            (when-let ((pr (project-current nil full-name)))
              (project-remember-project pr)
              (message "add project %s..." pr))))))))

上面函数的功能通过名字即可看出,这里不再赘述。

参考

• It’s never too late[5]

引用链接

[1] projectile: https://github.com/bbatsov/projectile [2] elpa: https://elpa.gnu.org/packages/project.html [3] VC: https://www.gnu.org/software/emacs/manual/html_node/emacs/Version-Control.html [4] fd: https://github.com/sharkdp/fd [5] It’s never too late: https://www.manueluberti.eu/emacs/2020/09/18/project/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 EmacsTalk 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 下载
  • 根目录
  • 查找文件
  • 常用命令
  • 扩展命令
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档