I prefer to name my solutions and projects something like projectname.vsX.sln and projectname.vsX.vcproj respectively. However, by default Premake4 generates the names as they are passed to the builtin solution and project functions respectively. Not cool enough for me. By the power of Graysk…uh uhm…Lua:
do
    function myoverride(orig_func)
        local func = orig_func
        return function(name)
            if _ACTION == "vs2003" then
                name = name .. ".vs7"
            elseif _ACTION == "vs2005" then
                name = name .. ".vs8"
            elseif _ACTION == "vs2008" then
                name = name .. ".vs9"
            elseif _ACTION == "vs2010" then
                name = name .. ".vs10"
            end
            elseif _ACTION == "vs2012" then
                name = name .. ".vs11"
            end
            return func(name)
        end
    end
    solution = myoverride(solution)
    project = myoverride(project)
end
… this way the names fit my taste much better.
// Oliver
PS: somewhat more concise but achieving a similar effect:
do
    function myoverride(orig_func)
        local func = orig_func
        return function(name)
            if _ACTION:sub(1,2) == "vs" then
                name = name .. "." .. _ACTION
            end
            return func(name)
        end
    end
    solution = myoverride(solution)
    project = myoverride(project)
end