【问题标题】:compile directly from vim直接从vim编译
【发布时间】:2009-02-12 10:22:51
【问题描述】:

我想在不关闭 vi 的情况下编译 cpp 文件。
我知道 :!g++ file.cpp 但我更喜欢 :make 所以我在 .vimrc 文件中添加了这一行

au FileType C set makeprg=gcc\ %
au FileType Cpp set makeprg=g++\ %

但我不断得到
"make: ***** 没有指定目标,也没有找到 makefile。停止。** "message.
谁能告诉我我的设置有什么问题?
我用上面的选项编译成功。

【问题讨论】:

  • make 在当前目录中搜索名为 Makefile 的文件。可能是这个问题?我自己是一个 makefile 新手,所以这只是一个猜测。
  • 我不知道“au FileType CPP set makeprg”的内部操作,但我从另一台服务器编译 w/o Makefile。我不明白为什么我在使用 Ubuntu 8.10 的计算机上编译失败
  • 我从没听说过关于 vi 的 :make。是vim的改进吗?

标签: c++ vim compilation


【解决方案1】:

你需要在那里替换,试试这样的:

set makeprg=gmake\ %:r.o

哦,这假设你有:

  1. 目录中的 (M|m)akefile,或
  2. 默认 SUFFIX 规则适用于您的环境(看起来没有)

通过输入检查默认值:

make -n <my_file>.o

看看这是否给你一些明智的选择。

如果在其他位置有makefile,可以添加-f选项指向makefile,例如:

set makeprg=gmake\ -f\ ../some_other_dir/makefile\ %:r.o

顺便说一句,要了解 make,尤其是 gmake,我建议您阅读优秀的书籍“使用 GNU Make 管理项目”(sanitised Amazon link)。

HTH。

干杯

【讨论】:

  • 我发现了我的问题所在。这是关于C,Cpp的情况。我应该把它改成c,cpp。但你的回答很有帮助。谢谢。
  • @Luc, ??还是 $*.o 是一种新的 vim makeprg 语法?
  • $* 不是新的 &makeprg 语法元素。它一直存在(使用 :make)。它将被 make target 替换。那么,所需要的只是一个将使用当前 %
【解决方案2】:

我应该把C,Cpp改成c,cpp,这样就可以了。

谢谢大家,尤其是 Rob Wells,您的回答对我帮助很大。谢谢。

【讨论】:

  • 还将set 更改为setlocal,以免覆盖其他文件类型的默认设置。
【解决方案3】:

我认为如果你编写一个 Makefile 并将它放在 vi 可以找到的地方会容易得多。我不确定你是否真的使用 vi(我只使用过 Vim),但是当有 Makefile 时,编译应该像编写 :make 一样简单(不需要 set makeprg)。

【讨论】:

  • 感谢您的回答。但我将编辑器用于非常小的项目,例如项目欧拉问题。所以每次写代码,制作 Makefile 都是一件很烦人的事情。这就是我尝试使用 :make(direct compile) 的原因。
【解决方案4】:

使用键映射可以轻松实现。

首先打开你的vimrc文件和文件中的这些行,

autocmd filetype cpp nnoremap <F4> :!g++ % -ggdb -o %:r <CR>
autocmd filetype cpp nnoremap<F5> :!g++ % -ggdb -o %:r && ./%:r <CR>

第一行将 F4 键映射到编译文件。第二行将 F5 键映射到编译并运行

如果您经常使用 gdb,那么这也可能会派上用场。

autocmd filetype cpp nnoremap<F10> :!g++ % -ggdb -o %:r && gdb -tui %:r <CR>

这一行将 F10 键映射到编译并启动 gdb

希望这会有所帮助。

【讨论】:

    【解决方案5】:

    我推荐一个名为 SingleCompile 的 vim 插件,而不是你所做的: http://www.vim.org/scripts/script.php?script_id=3115

    【讨论】:

      【解决方案6】:

      首先,制作该死的make文件。那里的每个工具都希望与 make 一起使用,如果您的编译如此简单,则编写一个将所有 c 和 cpp 文件编译为可执行文件的 make 文件大约需要 30 秒。

      其次,如果你拒绝使用make文件,那就试试

      :help system
      

      这应该为您提供足够的信息来提出您自己的类似于此的命令

      :com Mymake call system("g++ ".expand("%"))
      

      【讨论】:

      • 为什么你认为它比:!g++ %更好?
      • @MariusGedminas 好问题。而且我想所有的反对票都是党派,因为答案开始时的书呆子,这在 SO 上几乎不专业或受欢迎。 :P
      猜你喜欢
      • 2020-02-13
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多