【问题标题】:How to efficiently "make" with Vim如何用 Vim 高效地“制作”
【发布时间】:2014-07-31 10:39:56
【问题描述】:

我正在尝试做的似乎是一个非常基本的东西,但我找不到任何关于它的东西。我正在做一个像往常一样构建的项目:

project
|-- bin
|-- inc
`-- src

我想使用 Vim 中包含的 make 命令制作我的项目。但每次我都必须指定:make -C ../。我希望,如果当前目录中没有 Makefile 文件,请进入父目录。我已经这样做了

set tags+=./tags;/

在我的.vimrc.

此外,make 默认是丑陋的。是否有添加颜色的选项,并允许直接访问错误(如在 Emacs 中)。

谢谢

【问题讨论】:

    标签: vim plugins makefile


    【解决方案1】:

    对what Adam said稍作修改:

     :set makeprg=[[\ -f\ Makefile\ ]]\ &&\ make\ \\\|\\\|\ make\ -C\ ..  
    

    未转义,这是

     [[ -f Makefile ]] && make || make -C ..
    

    也就是说,伪代码风格

     if file-exists(Makefile) 
     then make
     else make -C ..
    

    这只会向上一个目录。如果您想要一个更通用的解决方案 尽可能多的目录,您需要能够搜索祖先目录,直到找到 Makefile,我不知道如何简单地从命令行执行此操作。但是编写一个脚本(用你喜欢的任何语言)然后从你的 makeprg 中调用它应该不难。

    【讨论】:

    • 可以使用let 子句来避免如此广泛的转义::let &makeprg = '[[ -f Makefile ]] && make || make -C ..'。
    • [[ a ]] && b || c 与 if a then b else c 不完全相同。如果a 为真并且b 返回一个非零退出代码,那么c 也将被执行。
    • reiner-torenbeek:好点。 [[ a ]] && (b ; true) || c 怎么样。
    【解决方案2】:

    rampion 的解决方案是第一步,但在 vim 负载上计算。当我加载一个多选项卡会话时,从一个选项卡到另一个选项卡的路径可能不一致。

    这是我的解决方案(+ tabnew 的额外内容)。

    fun! SetMkfile()
      let filemk = "Makefile"
      let pathmk = "./"
      let depth = 1
      while depth < 4
        if filereadable(pathmk . filemk)
          return pathmk
        endif
        let depth += 1
        let pathmk = "../" . pathmk
      endwhile
      return "."
    endf
    
    command! -nargs=* Make tabnew | let $mkpath = SetMkfile() | make <args> -C $mkpath | cwindow 10
    

    【讨论】:

      【解决方案3】:

      要回答您的第二个问题,您可以使用 VIM 中的 quickfix 功能浏览错误。 Quickfix 将错误存储在缓冲区中,并允许您向前/向后导航它们。

      您可能必须定义错误正则表达式以允许 VIM 从 Make 的输出中识别这些,但我似乎记得它开箱即用的效果相当好(我不得不修改它对 Java 的工作方式Ant 构建 - 显然不适用于这里)

      【讨论】:

        【解决方案4】:

        到目前为止,最简单的解决方案是在您的 src 目录中创建一个 Makefile,这是许多项目的设置方式,无论编辑器/IDE 是什么。您仍然可以拥有一个调用 make -C src 的顶级 Makefile,其在 src 中构建的规则位于它们所属的 src 中。

        【讨论】:

        • 我不知道为什么项目不尽可能选择顶级 Makefile。
        【解决方案5】:

        如果您在项目根目录中有一个 makefile,则可以使用另一种方法:

        project
        |-- bin
        |-- inc
        |-- src
        | Makefile
        

        如果您的项目路径位于 b:projectDir 等变量中,则可以在开始执行 :make 或 :lmake 之前使用“自动命令”更改到该目录:

        augroup changeMakeDir
            au!
            autocmd QuickfixCmdPre *make
                        \ if exists("b:projectDir") &&
                                            \ b:projectDir != expand("%:p:h") |
                            \ exe 'cd ' . b:projectDir |
                        \ endif
        augroup END
        

        Projectroot plugin可以用来设置b:projectDir;它还提供了将当前目录更改为项目根目录的命令:

        augroup changeMakeDir
            au!
            autocmd QuickfixCmdPre make ProjectRootCD
        augroup END
        

        【讨论】:

          【解决方案6】:

          在你的 .vimrc 中设置 makecmd="make -C .."

          【讨论】:

          • 我比较喜欢,如果当前目录下没有 Makefile 文件,则进入父目录。如果 Makefile 存在,请使用它。
          • 这并不容易。将您的 makecmd 设置为测试该条件的脚本......这并不难:)
          • 这正是我要问的。我不知道如何测试vimrc中是否存在文件
          猜你喜欢
          • 1970-01-01
          • 2011-12-28
          • 2017-03-21
          • 2016-11-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多