Emacs中如何实现M-x compile

有可能我的表达有问题,请见谅
首先在 Emacs 中进行编译的时候,按下 M-x compile ,输入 gcc demo.c


这样gcc的输出就会从另一个 buffer 中显示,顺带可以在其中跳转到错误

请问下这是怎么实现的?


另外有段时间接触了 flutter ,命名行中运行后可以按下 r 进行 hot-reload ,按下 R 进行 hot-restart
在 compile 的时候运行 flutter run -d chrome


如果我想要更新内容,我不想跳到 compilation buffer 中然后按下 r 键,而是通过执行一个 函数,执行后相当于在命令行按下 r 键,这该怎么做到?


我又想到一个,一保存就自动编译该怎么弄?

一保存就自动编译这个感觉不太好吧,除非你的编译很快,一般项目做大编译都比较慢的吧,编译太频繁对性能也不友好,我现在异步更新tags都放弃了在保存时触发,而是单独更新或编译时更新。

我不想跳到 compilation buffer 中然后按下 r 键,而是通过执行一个 函数,执行后相当于在命令行按下 r 键

这个问题如果我来做的话就是写一个elisp函数绑定快捷键(我用hydra),这个elisp函数做的事情就是 切换到 compilation buffer 中并按下r键,然后立即回到前一个buffer(速度够快在视觉上就看不出有buffer切换的痕迹),编译在后台执行

好像在Vue项目中一保存就自动编译,我都在shell 运行 yarn server, 然后接着写我的代码,出错的时候到shell里看看,切换有点麻烦

vue那个是不是监视整个项目的文件,发现文件修改了(而不论用那个编辑器),就编译重启node服务器吧。

这个我觉得叫代码热更新最合适一些(业务不中断),当然说成是自动编译也可以

这个一般在编译工具链里面实现的, yarn 的话很可能是用了 webpack 或者 rollup 之类的 watch 功能. 原理应该和楼上说的差不多.

用 Emacs 的话, 或许可以模拟一个, 比如用 elisp 监控文件变化, 然后调用编译命令.

但是体验上会比原生的工具差不少, 最主要的问题是 elisp 这边没办法知道项目的依赖关系, 所以只能去批量监控所有源文件. 比如在项目里创建一个 test.js, 只要 webpack 的 entry 不依赖它, 编辑这个文件的时候是不会触发自动编译的, 因为 webpack 知道编译出来也没区别. 在 Emacs 里面就很难实现类似功能.

watch监控整个项目的文件变化来触发自动编译热更新重启服务器其实我觉得不太好,感觉在目录和文件巨多的情况吃内存太多。

我的看法是只watch监控一个或几个文件就够了,这个文件可以是tags文件(emacs有不少ctags的前端感觉也做得不错)。这样省内存,不批量监控elisp好像也没有必要去知道项目的依赖关系