我的情况很不寻常。
我正在使用Visual Studio(VS)编写脚本以使用in-game in the game Space Engineers。
问题是你只使用游戏中文件的一部分代码。 (I.E,Ctrl + A不会这样做)。因此,选择正确的部分是乏味的。
我想简化在VS中复制所需代码并将其粘贴到Space Engineers中的过程。 想法是修剪所有不必要的空白区域(有一个字符限制)并在按下VS中运行时复制到剪贴板。
我发现您可以创建自己的构建配置并使用“预构建事件命令行”来运行自定义的东西。我们的想法是创建一个简单的控制台应用程序,完成上面描述的操作。但我不知道如何将正确的文件发送到所述应用程序。
我是否在正确的轨道上?如何将所需文件发送到修剪应用程序?还有更好的方法吗?
修改 当我说“简单的控制台应用程序”时,这就是我的想法。 它做了我需要它做的一切(修剪空白区域并将一部分代码添加到剪贴板)。唯一缺少的是我必须指定我想要它使用的文件名。这不重要,它会很好。
using System;
using System.Windows.Forms;
namespace TrimFileToClipboard
{
class Program
{
[STAThread()]
static void Main(string[] args)
{
string startString = (args.Length > 1) ? "#region " + args[1] : "#region in-game";
string line;
string trimmed = "";
bool read = false;
int depth = 0;
System.IO.StreamReader file = new System.IO.StreamReader(args[0]);
while ((line = file.ReadLine()) != null)
{
if (!read && line.Contains(startString)) read = true;
else if (read && line.Contains("#region")) depth++;
else if (read && line.Contains("#endregion"))
{
if (depth == 0) break;
else if (depth < 0)
{
Console.WriteLine("There's something wrong with your #regions. Please edit the file.");
Console.ReadLine();
Environment.Exit(0);
}
else depth--;
}
else if (read) trimmed += line.Trim() + "\n";
}
file.Close();
Clipboard.SetText(trimmed);
}
}
}
可以通过添加来使用
"<path>\TrimFileToClipboard.exe" "$(ProjectDir)<classname>.cs"
在项目属性/构建事件中预构建事件命令行。其中<path>
是上述应用程序的路径,<classname>
是您要处理的文件。
也许我应该发布这个部分作为答案,但我不知道这是一个体面的方法还是一个丑陋的黑客。
答案 0 :(得分:1)
不是将代码复制到剪贴板,而是使用这个简单的C#控制台应用程序将其直接保存在游戏中作为已保存的工作室脚本。
我使用VS编辑的SE脚本包含注释\\script-begin
和\\script-end
,以告诉应用程序在哪里查找需要在可编程块中的实际代码。
执行后,脚本将在本地研讨会上提供。这使得使用SE脚本变得非常容易,每当我使用VS进行更改时,我再次运行控制台应用程序并且脚本将在游戏内更新。
internal class Program
{
private static void Main(string[] args)
{
String[] InputLines, outputLines;
Int32 scriptBegin = 0, scriptEnd = 0;
String scriptName = args[0];
String inputPath = "C:\\Users\\hfand\\source\\repos\\se-scripts\\" + scriptName + ".cs";
if (File.Exists(inputPath))
{
InputLines = File.ReadAllLines(inputPath);
for (int i = 0; i < InputLines.Length; i++)
{
if (InputLines[i].Contains("script-begin"))
{
scriptBegin = i + 1;
}
if (InputLines[i].Contains("script-end"))
{
scriptEnd = i - 1;
}
}
outputLines = new List<string>(InputLines).GetRange(scriptBegin, scriptEnd - scriptBegin + 1).ToArray();
for (int i = 0; i < outputLines.Length; i++)
{
if (outputLines[i].Length >= 8)
{
outputLines[i] = outputLines[i].Substring(8);
}
}
String outputPath = "C:\\Users\\hfand\\AppData\\Roaming\\SpaceEngineers\\IngameScripts\\local\\" + scriptName;
if (Directory.Exists(outputPath))
{
File.WriteAllLines(outputPath + "\\Script.cs", outputLines);
}
else
{
Directory.CreateDirectory(outputPath);
File.WriteAllLines(outputPath + "\\Script.cs", outputLines);
}
Console.WriteLine(scriptName + " sincronizado");
}
else
{
Console.WriteLine("Arquivo \"" + inputPath + "\" não encontrado");
}
}
}
以下是VS中的代码应如何显示的示例
using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using VRageMath;
using VRage.Game;
using Sandbox.ModAPI.Interfaces;
using Sandbox.ModAPI.Ingame;
using Sandbox.Game.EntityComponents;
using VRage.Game.Components;
using VRage.Collections;
using VRage.Game.ObjectBuilders.Definitions;
using VRage.Game.ModAPI.Ingame;
using SpaceEngineers.Game.ModAPI.Ingame;
namespace BlankScript
{
public class Program : MyGridProgram
{
//script-begin
public Program()
{
}
public void Save()
{
}
public void Main(string argument, UpdateType updateSource)
{
}
//script-end
}
}
答案 1 :(得分:0)
您可以使用我的Visual Commander扩展编写一个C#命令,该扩展在Visual Studio中以DTE.ActiveWindow.Document.FullName的形式获取活动文件路径,然后在其上运行file.ReadLine()并调用Clipboard.SetText(trimmed)在末尾。请参阅示例Copy current file, line, method示例代码。