我有一个多文件项目,我使用Cmake构建系统。我已经将:make
映射到一个键,因为我需要经常编译它。问题是我需要经常运行生成的可执行文件。但是输入:!./variable_program_name
非常繁琐。
有没有办法检测/获取生成的可执行文件名?
答案 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
并映射一个键即可执行。