LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1299|回复: 5

emacs如何配置GCC编译环境?

[复制链接]
发表于 2006-8-10 23:55:34 | 显示全部楼层 |阅读模式
在.emacs中配置如下
(setq compile-command "gcc")
(define-key c-mode-base-map [(f7)] 'compile)

按F7后出现gcc,但是这样需要自己写上文件名,请问在emacs中有哪个变量代表了当前buffer or file name?

具体应该怎么配置,搜索了一把什么都没有..
发表于 2006-8-11 01:23:33 | 显示全部楼层
try smart-compile.el ?
回复 支持 反对

使用道具 举报

发表于 2006-8-11 11:34:09 | 显示全部楼层
autotools   我还不会用.. 要学的东西太多了.. 唉..
回复 支持 反对

使用道具 举报

发表于 2006-8-11 17:15:56 | 显示全部楼层
你用make不就可以了:
(setq compile-command "make")
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-11 21:15:11 | 显示全部楼层
???
关键是我现在编译的都是小程序,写Makefile麻烦.直接gcc file.c这样最方便
回复 支持 反对

使用道具 举报

发表于 2006-8-11 21:30:06 | 显示全部楼层
就是这类似的
  1. (define-key c-mode-map (kbd "<f7>")
  2.   #'(lambda ()
  3.       (interactive)
  4.       (compile (concat "gcc -Wall "
  5.                        (buffer-file-name)))))
复制代码

不过还是推荐使用 smart-compile.el ,不管是对于小文件的单独编译还是大工程
的编译都非常方便。
smart-compile.el 提供一个 smart-compile 的函数,它查找当前目录下面有没
有 Makefile ,如果有,则会询问是否使用 make 进行编译。否则,他会通过查
看 smart-compile-alist 来根据当前的文件名以及 major-mode 来得到最合适
的编译命令。

可以在  http://www.emacswiki.org/elisp/smart-compile.el 上面下载到他的最新版本。加载之后就可以通过修改或添加项
目到 smart-compile-alist来实现智能编译了!假如我现在在做一个工程,他
处于 /home/kid/project/foo/下面,我可以这样写:
  1. (add-to-list 'smart-compile-alist
  2.              '("/home/kid/project/foo/.*" . "make"))
复制代码

但是这样也有一些问题,比如如果我工程里面分了模块,里面又分了子目录,而
Makefile 是放在工程目录的最顶层的:
  1. project/foo/
  2.            |-- Makefile
  3.            |-- foo.c
  4.            `-- bar/
  5.                  |-- bar.c
  6.                  `-- foobar.c
复制代码

那么,假如我现在在编辑 bar.c ,编辑完之后使用 smart-compile 则会调用
make 来进行编译,然而这是不正确的,因为 Makefile 不在这儿。不过,也可
以给 make 指定路径来解决这个问题:
  1. (add-to-list 'smart-compile-alist
  2.              '("/home/kid/project/foo/.*" . "make -C /home/kid/project/foo"))
复制代码

其他的也参照设置一下就可以了,在编译命令那里可以使用几个预定义的变量:

- %F 完整的绝对路径(如 /usr/local/bin/netscape.bin)
- %f 除去目录前缀的文件名(如 netscape.bin)
- %n 除去扩展名和目录前缀的文件名(如 netscape)
- %e 扩展名(如 bin)

最后,再把他绑定到一个自己喜欢的快捷键上面就万事大吉了!
  1. (global-set-key (kbd "<f9>") 'smart-compile)
复制代码

另外,那个列表的每一项第二个参数并不一定要是作为 shell 命令运行的字符串,
也可以是一个 lisp 语句,例如,我让他在 muse-mode 的时候使用
muse-project-publish 来进行编译,则可以这么写:
  1. (add-to-list 'smart-compile-alist
  2.              '(muse-mode . (call-interactively 'muse-project-publish)))
复制代码

这样,我写到这儿,就可以按一下 F9 ,就发布当前页面了,而不是调用
compile 来进行编译。另外,从他的源代码里面可以看到,如果通过前面查找
Makefile 以及 smart-compile-alist 的办法都没有办法确定如何编译的时候,
他会查看文件的头两个字符,如果是 ``#!'' 的话,则编译命令就是当前文件名,
这个设计与其说是编译,倒不如说是运行了,但是由于 ``#!'' 又是非常灵活的,
所以这也是一个值得利用的地方,但是如果当前文件没有可执行权限的话,这个
命令是会运行失败的,也许可以修改一下,题取出 ``#!'' 后面的命令来作为编
译命令,或者说,这种情况下的编译命令就是为当前文件加上可执行权限。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表