【问题标题】:Finding the buffer file name in Emacs when compiling编译时在 Emacs 中查找缓冲区文件名
【发布时间】:2012-04-10 03:06:26
【问题描述】:

我正在尝试设置 Emacs,以便当我在菜单中选择“Compile..”时,Emacs 会在命令行上执行“make filename”。我正在尝试类似:

(setq compile-command (concat "make " (file-name-sans-extension
                                       buffer-file-name)))

但它不起作用 - 看起来 Emacs 正在为 *scratch* 缓冲区寻找一个文件名,但它没有。有谁知道如何解决这个问题?

谢谢。

更新:正如 Cheeso 所建议的,一个钩子解决了这个问题。这是一个适合我的版本:

(defun cur-file ()
  (file-name-sans-extension
   (file-name-nondirectory (buffer-file-name (current-buffer)))))

(add-hook 'c++-mode-hook
          (lambda()
            (set (make-local-variable 'compile-command)
                 (concat "make " (cur-file)))))

【问题讨论】:

  • n.b.您应该接受 Cheeso 的答案,或者发布您自己的解决方案作为答案并接受。

标签: emacs


【解决方案1】:

是的 - 有几个选项供您选择。

  • 简单:定义一个file-local variable。在文件的标题注释中只包含类似

    的内容
     // -*- compile-command: "gcc -Wall -O3 -o f file.c" -*-
    

    更多详情,请参见: https://stackoverflow.com/a/4540977/48082

  • 更详细 - 有一个名为 smarter-compile.el 的模块可用 on the marmalade repo。它允许您定义一些规则来猜测 compile-command 以用于特定缓冲区。就像,如果有一个makefile,使用MAKE;否则,如果文件是 .c 文件,则使用 gcc;等等

    如果您不想将 cmets 插入每个文件,或者如果您有无数不同类型的文件和项目正在处理,这很好。

ps:我猜你的简单setq 不起作用的原因是你没有在正在编辑的缓冲区中评估它。可能您想将其放入您的个人xxxx-mode-hook-fn,其中 xxx 是您正在编辑的文件的模式。

【讨论】:

  • 嗯,我不确定我是否喜欢第一个选项,但你是对的:Emacs 似乎不会在本地评估表达式。我已经发布了对我有用的修复程序,带有一个钩子。
  • 这个回复解释了为什么这个解决方案有效:stackoverflow.com/a/12758033/54848
猜你喜欢
  • 1970-01-01
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
相关资源
最近更新 更多