Emacs下有什么package可以实现类似于vscode中task.json的功能?

用过 vscode 的 task system, 感觉挺不错。vim也有插件 asynctasks.vim。不知道emacs下有什么package可以实现?

1 个赞

不过我认为一个projectile就已经满足大多数情况了

1 个赞

哦 也是哦 Makefile最简单直接

在进一步问下, Projectile如何实现?注意到projectile有projectile-run-project 命令,可以由projectile-project-run-cmd 设置。 但如何可以实现从一个list里选择多个不同的run command的呢? 这个貌似只能有一个command。

1 个赞

projectile-run-project是依赖的projectile-register-project-type注册的项目类型 来的,例如一个bazel的项目是这样注册的:

(projectile-register-project-type 'bazel '("WORKSPACE")
                                  :compile "bazel build"
                                  :test "bazel test"
                                  :run "bazel run")

在这个例子下, projectile-run-project实际对应的就是bazel run这个命令。

如果想利用projectile来实现类似vscode的功能,需要自己hack一下,当然也比较简单, 跟Makefile差不多,附一个例子:

(defvar-local projectile-tasks '((name1 . "ls")
                                 (name2 . "ls | wc -l")))

(defun my/projectile-run-tasks (&rest _)
  (interactive)
  (ivy-read "run tasks: "
            projectile-tasks
            :sort nil
            :require-match t
            :action (lambda (cand)
                      (let* ((cmd (cdr cand))
                             (default-directory (projectile-project-root)))
                        (async-shell-command cmd)))))

不过都这样了,还是底下拿Makefile来实现吧,把对应的Makefile规则解析出来,然后 再通过ivy-read来执行。

不过这些 GitHub - emacs-taskrunner/emacs-taskrunner: A universal task runner for emacs 都已经做了,可以直接用它

项目任务和编辑器耦合在一起也太奇怪了,比如说用Emacs打开你的项目的人就没法使用vscode的task.json 不如直接写成Makefile。如果觉得Shell脚本写起来不利于维护,可以用其他语言写然后在Makefile里面调用

交互调用make指令可以用(支持ivy)

ivy作者写helm插件?emmmm

ivy 最开始开发就是作为 helm 的插件(准确的说应该是 swiper ),后来才慢慢独立出来的。

1 个赞

谢谢你的回答 这段Hacking的代码给我很多启发 :+1: 我项目是用CMake编译的一个C++程序,然后又用python脚本进行一些测试(之所以用python是因为一:对python更熟悉,二:需要对C++程序输出数据作进一步处理和可视化)。所以我所谓的task就是给不同的input argument给python 脚本。在vscode中用task.json轻松就实现了跑不同task的功能。所以就好奇,在emacs里如何完成类似的功能。看来可以总结为三种办法:写makefile;用emacs-taskrunner;Haking. :grin:

说的对 绑定到task.json上确实不太合适 还是makefile比较cross-editor cross-platform :smile:

start-process + comint-mode 基本就可以搞定大部分的任务了,需要什么可以在那个buffer里面进行定制。