从Vim检测生成的可执行文件

时间:2014-01-27 18:34:51

标签: vim cmake

我有一个多文件项目,我使用Cmake构建系统。我已经将:make映射到一个键,因为我需要经常编译它。问题是我需要经常运行生成的可执行文件。但是输入:!./variable_program_name非常繁琐。

有没有办法检测/获取生成的可执行文件名?

3 个答案:

答案 0 :(得分:5)

建议的方法是通过Makefile中的单独目标,以便例如:make只触发可执行文件的构建和:make run触发器(构建和)运行。毕竟,Makefile最了解它正在构建的内容,因此决定如何运行构建工件(也许还有传递的参数)最好委托给它。

替代

要从Makefile“返回”可执行文件,将解析:make输出并填充 quickfix list 。您可以定义一个自定义映射(对于为此类窗口设置的qf文件类型),从当前的quickfix行解析可执行文件名,或者甚至使用getqflist()来解析整个输出。这要求Makefile以可检测的方式打印出可执行文件名(和路径)。

替代

如果您甚至无法从输出中可靠地获取可执行文件名,但知道生成可执行文件的目录,则可以在运行{{1}之前创建文件列表(glob())然后再次,然后比较两个列表以获取可执行文件名称。如果您不想从Vim中删除以前的可执行文件,则文件时检查(:make)可能有所帮助。

答案 1 :(得分:1)

对于任何查看此内容的人。 我也有同样的需求,决定用vim脚本/插件来解决。 vim-target

答案 2 :(得分:0)

扩展Ingo Karkat的想法,这个脚本应该可以解决问题(我对vimscript并不好,所以我用bash写的)

#!/bin/sh

# This script tries to build the project using Makefile, and if that fails
# it tries to generate the Makefile with Cmake.
# Then it finds the latest executable file and runs it

# Remember to manually run cmake after changing CMakeLists.txt as a new 
# Makefile will not be automatically regenerated

if [[ -e "Makefile" ]] || [[ -e "makefile" ]]; then
    make
    if [[ $? -ne 0 ]]; then
        echo "Error when running make"
        exit
    fi
else
    if [[ -e "CMakeLists.txt" ]]; then
        cmake .
        if [[ $? -ne 0 ]]; then
            echo "Error when running cmake"
            exit
        fi
        make
        if [[ $? -ne 0 ]]; then
            echo "Error when running make"
            exit
        fi
    else
        echo "CMakeLists.txt doesn't exist"
        exit
    fi
fi

# Find latest executable file
unset latest
for file in "${1:-.}"/*
do
    if [[ -f "$file" ]]; then
        latest=${latest-$file}
        find "$file" -executable -prune -newer "$latest" | read -r dummy && latest=$file
    fi
done

if [[ -x "$latest" ]]; then
    ./$latest
else
    echo "Latest file $latest is not executable"
fi

只需将此脚本放入$PATH并映射一个键即可执行。