diff --git a/EasyLoU/MainForm.Designer.cs b/EasyLoU/MainForm.Designer.cs index cba6484..25f2e5f 100755 --- a/EasyLoU/MainForm.Designer.cs +++ b/EasyLoU/MainForm.Designer.cs @@ -908,7 +908,6 @@ private void InitializeComponent() // TimerReadClientStatus // this.TimerReadClientStatus.Enabled = true; - this.TimerReadClientStatus.Interval = 1000; this.TimerReadClientStatus.Tick += new System.EventHandler(this.TimerReadClientStatus_Tick); // // MainSplit @@ -1097,6 +1096,7 @@ private void InitializeComponent() this.Margin = new System.Windows.Forms.Padding(2); this.Name = "MainForm"; this.Text = "EasyLoU"; + this.Activated += new System.EventHandler(this.MainForm_Activated); this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing); this.menuStrip1.ResumeLayout(false); this.menuStrip1.PerformLayout(); @@ -1234,4 +1234,3 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripButton pinToolStripButton; } } - diff --git a/EasyLoU/MainForm.cs b/EasyLoU/MainForm.cs index d04eecd..42aeb51 100755 --- a/EasyLoU/MainForm.cs +++ b/EasyLoU/MainForm.cs @@ -10,7 +10,9 @@ using System.IO; using System.Linq; using System.Reflection; +using System.Security.Cryptography; using System.Text; +using System.Threading; using System.Windows.Forms; namespace EasyLoU @@ -384,7 +386,8 @@ private void DoOpen() DoNew(); ScriptsTab.SelectedTab.Text = fileName; TextEditorControlEx ScriptTextArea = ((TextEditorControlEx)ScriptsTab.SelectedTab.Controls.Find("ScriptTextArea", true)[0]); - ScriptTextArea.Tag = filePath; + string sha1 = CalcSha1(filePath); + ScriptTextArea.Tag = new Tuple(filePath, sha1); ScriptTextArea.LoadFile(filePath); } } @@ -395,15 +398,198 @@ private void DoOpen() } + private static string CalcSha1(string filePath) + { + try + { + using (FileStream fs = new FileStream(filePath, FileMode.Open)) + using (BufferedStream bs = new BufferedStream(fs)) + { + using (SHA1Managed sha1 = new SHA1Managed()) + { + byte[] hash = sha1.ComputeHash(bs); + StringBuilder formatted = new StringBuilder(2 * hash.Length); + foreach (byte b in hash) + { + formatted.AppendFormat("{0:X2}", b); + } + return formatted.ToString(); + } + } + } catch (Exception ex) + { + return ""; + } + } + + private bool IsFileChanged(int TabIndex) + { + TabPage ScriptPage = ScriptsTab.TabPages[TabIndex]; + TextEditorControlEx ScriptTextArea = ((TextEditorControlEx)ScriptPage.Controls.Find("ScriptTextArea", true)[0]); + + if (ScriptTextArea.Tag != null && ScriptTextArea.Tag.ToString() != "new") + { + if (ScriptTextArea.Tag is Tuple Tag && Tag.Item1 != "" && File.Exists(Tag.Item1)) + { + string filePath = Tag.Item1; + string oldSha1 = Tag.Item2; + string newSha1 = CalcSha1(filePath); + if (oldSha1 != newSha1) + { + return true; + } + } + } + return false; + } + + private void AskForReload(int TabIndex) + { + TabPage ScriptPage = ScriptsTab.TabPages[TabIndex]; + TextEditorControlEx ScriptTextArea = ((TextEditorControlEx)ScriptPage.Controls.Find("ScriptTextArea", true)[0]); + if (ScriptTextArea.Tag != null && ScriptTextArea.Tag.ToString() != "new") + { + if (ScriptTextArea.Tag is Tuple Tag && Tag.Item1 != "" && File.Exists(Tag.Item1)) + { + string filePath = Tag.Item1; + string oldSha1 = Tag.Item2; + string newSha1 = CalcSha1(filePath); + if (oldSha1 != newSha1) + { + ScriptDebuggers.TryGetValue(ScriptPage.Tag.ToString(), out ScriptDebugger Debugger); + DialogResult confirmResult; + if (Debugger != null && (Debugger.Status == ScriptDebugger.DebuggerStatus.Paused || Debugger.Status == ScriptDebugger.DebuggerStatus.Running)) + { + confirmResult = MessageBoxEx.Show(MainForm.TheMainForm, $"{ScriptTextArea.FileName} changed on disk. Stop it and reload it from disk?", "Confirm stop and reload", MessageBoxButtons.YesNo); + } + else + { + confirmResult = MessageBoxEx.Show(MainForm.TheMainForm, $"{ScriptTextArea.FileName} changed on disk. Reload it from disk?", "Confirm reload", MessageBoxButtons.YesNo); + } + if (confirmResult == DialogResult.Yes) + { + if (Debugger != null) + { + Debugger.Stop(); + } + RefreshToolStripStatus(); + + ScriptTextArea.LoadFile(ScriptTextArea.FileName); + ScriptTextArea.Tag = new Tuple(filePath, newSha1); + } + } + } + } + } + + private bool CheckAnyFileChanged() + { + bool FileChanged = false; + + int SelectedTabIndex = ScriptsTab.SelectedIndex; + for (int TabIndex = 0; TabIndex < ScriptsTab.TabCount - 1; TabIndex++) + { + try + { + if (IsFileChanged(TabIndex)) + { + ScriptsTab.SelectedIndex = TabIndex; + AskForReload(TabIndex); + } + } catch (Exception ex) + { + + } + } + ScriptsTab.SelectedIndex = SelectedTabIndex; + + return FileChanged; + } + + private delegate void LoadFileThreadSafeDelegate(TextEditorControlEx control, string propertyName, string propertyValue); + public static void LoadFileThreadSafe(TextEditorControlEx control, string propertyName, string propertyValue) + { + if (control.InvokeRequired) + { + control.Invoke(new LoadFileThreadSafeDelegate(LoadFileThreadSafe), new object[] { control, propertyName, propertyValue }); + } + else + { + do + { + Thread.Sleep(100); + } + while (IsFileLocked(control.FileName)); + + control.LoadFile(control.FileName); + } + } + + private static bool IsFileLocked(String filePath) + { + FileInfo file = new FileInfo(filePath); + FileStream stream = null; + + try + { + stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.None); + } + catch (IOException) + { + return true; + } + finally + { + if (stream != null) + stream.Close(); + } + + return false; + } + private void DoReopen() { - MessageBoxEx.Show(MainForm.TheMainForm, "Not implemented!"); + int SelectedTabIndex = ScriptsTab.SelectedIndex; + TabPage ScriptPage = ScriptsTab.TabPages[SelectedTabIndex]; + TextEditorControlEx ScriptTextArea = ((TextEditorControlEx)ScriptPage.Controls.Find("ScriptTextArea", true)[0]); + + if (ScriptTextArea.Tag != null && ScriptTextArea.Tag.ToString() != "new") + { + if (ScriptTextArea.Tag is Tuple Tag && Tag.Item1 != "" && File.Exists(Tag.Item1)) + { + ScriptDebuggers.TryGetValue(ScriptPage.Tag.ToString(), out ScriptDebugger Debugger); + DialogResult confirmResult; + if (Debugger != null && (Debugger.Status == ScriptDebugger.DebuggerStatus.Paused || Debugger.Status == ScriptDebugger.DebuggerStatus.Running)) + { + confirmResult = MessageBoxEx.Show(MainForm.TheMainForm, $"Are you sure you want to stop and reload {ScriptTextArea.FileName}?", "Confirm stop and reload", MessageBoxButtons.YesNo); + } + else + { + confirmResult = MessageBoxEx.Show(MainForm.TheMainForm, $"Are you sure you want to reload {ScriptTextArea.FileName}?", "Confirm reload", MessageBoxButtons.YesNo); + } + if (confirmResult == DialogResult.Yes) + { + if (Debugger != null) + { + Debugger.Stop(); + } + RefreshToolStripStatus(); + + string filePath = Tag.Item1; + string sha1 = CalcSha1(filePath); + ScriptTextArea.Tag = new Tuple(filePath, sha1); + ScriptTextArea.LoadFile(ScriptTextArea.FileName); + ScriptTextArea.Document.UndoStack.ClearAll(); + RefreshChangedStatus(); + } + } + } } private void DoSave() { TextEditorControlEx ScriptTextArea = ((TextEditorControlEx)ScriptsTab.SelectedTab.Controls.Find("ScriptTextArea", true)[0]); - if ("new" == ScriptTextArea.Tag.ToString()) + if (ScriptTextArea.Tag != null && "new" == ScriptTextArea.Tag.ToString()) { DoSaveAs(); } @@ -411,9 +597,16 @@ private void DoSave() { try { - ScriptTextArea.SaveFile(ScriptTextArea.Tag.ToString()); - ScriptTextArea.Document.UndoStack.ClearAll(); - RefreshChangedStatus(); + if (ScriptTextArea.Tag is Tuple Tag && Tag.Item1 != "" && File.Exists(Tag.Item1)) + { + string filePath = Tag.Item1; + string oldSha1 = Tag.Item2; + ScriptTextArea.SaveFile(Tag.Item1); + string newSha1 = CalcSha1(Tag.Item1); + ScriptTextArea.Tag = new Tuple(Tag.Item1, newSha1); + ScriptTextArea.Document.UndoStack.ClearAll(); + RefreshChangedStatus(); + } } catch (Exception ex) { @@ -432,11 +625,15 @@ private void DoSaveAs() saveFileDialog.FileNames.Length > 0) { String filePath = saveFileDialog.FileName; + String directryName = Path.GetDirectoryName(filePath); String fileName = Path.GetFileName(filePath); TextEditorControlEx ScriptTextArea = ((TextEditorControlEx)ScriptsTab.SelectedTab.Controls.Find("ScriptTextArea", true)[0]); - ScriptTextArea.Tag = filePath; ScriptTextArea.SaveFile(filePath); + string newSha1 = CalcSha1(filePath); + ScriptTextArea.Tag = new Tuple(filePath, newSha1); ScriptsTab.SelectedTab.Text = fileName; + ScriptTextArea.Document.UndoStack.ClearAll(); + RefreshChangedStatus(); } } catch (Exception ex) @@ -1406,14 +1603,21 @@ private void closeAllScriptsButThisToolStripMenuItem_Click(object sender, EventA private void ScriptsTab_MouseClick(object sender, MouseEventArgs e) { - if (e.Button == MouseButtons.Right) + for (int TabIndex = 0; TabIndex < ScriptsTab.TabCount - 1; ++TabIndex) { - for (int TabIndex = 0; TabIndex < ScriptsTab.TabCount - 1; ++TabIndex) + if (ScriptsTab.GetTabRect(TabIndex).Contains(e.Location)) { - if (ScriptsTab.GetTabRect(TabIndex).Contains(e.Location)) + if (e.Button == MouseButtons.Right) { ScriptsTab.SelectedIndex = TabIndex; ScriptsTabContextMenu.Show(Cursor.Position); + } else if (e.Button == MouseButtons.Left) + { + if (IsFileChanged(TabIndex)) + { + ScriptsTab.SelectedIndex = TabIndex; + AskForReload(TabIndex); + } } } } @@ -1482,6 +1686,43 @@ public void PrintOutput(String guid, String s) } } + public delegate void PrintGlobalOutputDelegate(String s); + public void PrintGlobalOutput(String s) + { + Control[] ScriptOutputs = Controls.Find("ScriptOutput", true); + foreach (TextBox ScriptOutput in ScriptOutputs) + { + if (ScriptOutput != null) + { + if (ScriptOutput.Text.Length > 1024 * 1024 * 100) + { + PrintGlobalThreadSafe(ScriptOutput, "Text", ScriptOutput.Text.Remove(0, 1024 * 1024 * 1)); + } + PrintGlobalThreadSafe(ScriptOutput, "AppendText", s + Environment.NewLine); + } + } + } + + private delegate void PrintGlobalThreadSafeDelegate(TextBox control, string propertyName, string propertyValue); + public static void PrintGlobalThreadSafe(TextBox control, string propertyName, string propertyValue) + { + if (control.InvokeRequired) + { + control.Invoke(new PrintGlobalThreadSafeDelegate(PrintGlobalThreadSafe), new object[] { control, propertyName, propertyValue }); + } + else + { + if(propertyName == "Text") + { + control.Text = propertyValue; + } + if (propertyName == "AppendText") + { + control.AppendText(propertyValue); + } + } + } + public delegate void WriteOutputDelegate(String guid, String s); public void WriteOutput(String guid, String s) { @@ -1588,5 +1829,17 @@ private void pinToolStripButton_Click(object sender, EventArgs e) this.onTopToggle = false; } } + + public delegate void SetTimerReadClientStatusIntervalDelegate(int value); + public void SetTimerReadClientStatusInterval(int value) + { + this.TimerReadClientStatus.Interval = value; + MainForm.TheMainForm.Invoke(new MainForm.ResetTimerReadClientStatusDelegate(MainForm.TheMainForm.ResetTimerReadClientStatus)); + } + + private void MainForm_Activated(object sender, EventArgs e) + { + CheckAnyFileChanged(); + } } } diff --git a/EasyLoU/MainForm.resx b/EasyLoU/MainForm.resx index 663f653..ecf5d20 100755 --- a/EasyLoU/MainForm.resx +++ b/EasyLoU/MainForm.resx @@ -442,15 +442,15 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHdSURBVDhPhZFRT9pQGIb9D/sH3pj9lt2YeGGWhbmFEKls - QEXUFhyzroziHC2looYW7AaKlhGCgspQsxiXmOji2PYbmhgvll3t6t2xsMyLI3uT5+bkfE/e852BVGRy - VHzOXMkci21NQt2Q+1JdS/5KR8Ohgb8R/RNXC8wTCN4x1HMp/Diu/Je6nkLc57vnCNQI23k1/hhy2IeK - lsC3QwuXrTIumkUqnfY2Dt5pEALMfUcghQNDMhfcVDj2qKjEf3faWzgur6C2IlE52zGxt67+E9zO+mLM - vmxtOpdOqwaVi70SGgWFLigkY/Z5s+Q0aBgpKp9rBeyQHQgBN11wVjdxWMpiV39L5eSDjtraGwgMRZBP - zNmn1TxpsIqP7zUqJxUd1WySLtDjEfuTlSNVZViqSKVdXIaVSdAF2diUfbSxihb5pmZeodImzysrIqI0 - gUYEB6YGKy3CfM07WGocN2e3KS0JROCiCOZC9q4uk2X1x0y+QNRNEah80C6IPHLz0zCEGRgLs1SyURbi - M/dWjHk62BvtRprw2NMPh8G7RpyFfdnfuJPzRhEa5//aG+0mEfR+z3B+LEdY6KTBvpnpS4YPXfdGu5n3 - PHoghZjrpUkvbkjPBu5kMTz+86XHNfYHaJMx1Ji5LP8AAAAASUVORK5CYII= + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHaSURBVDhPhZFRT9pQGIb9D/6D3Sz+lt0s2cWyGOYWwkbF + CZXhLOCYdWWlmaOlFNTQglVQtIwQFFSGmsW4xEQXx7bf0MR4sexqV++OBTMvDuxNnpuT8z15z3eGkpGp + h8IEcylzLLa0BOqGPJDqsvQ7FQ0Fh24ivBi/nGeegPeOoZ5L4udR5b/U9STiPt+wI1AjbOft88eQQz5U + NBHfDyxctMo4bxapdNpb2F/VwPuZEUeQCPnvylxgQ+HYwzUl/qfT3sRReRG1xQSV020TuyvqP8HtFKSY + fdHacC6dVA0q57slNApKf8FZs+Q0aBhJKl9qBWyTHfB+N11wWjdxUMpiR/9A5fijjtrye/AMRZAXZ+2T + ap40WMKnNY3KcUVHNSvRBXo8Yn+2cqSqDEsVqLSLGVhpkS7IxF7ah+tLaJFvauYVKm3yvLIiIEoTaESw + b2qwUgLMd2EHS43j+uw2pQWeCFwUwWzQ3tFlsqzBmNJrRN0UgRoO2AUhjNzcNAz+FYz5GSrZKAthwr0Z + Y57e6Y12k2A89vSj+wi7HjgL+7q33pezRhEaN/mtN9qNGPD+SHOTyERY6KTBnpkeSJoLXvVGu5nzjN4T + g8zVwpQX16Rm/H2RQs9+vfG4xv4CVI4xyTu2SV4AAAAASUVORK5CYII= diff --git a/EasyLoU/ScriptDebugger.cs b/EasyLoU/ScriptDebugger.cs index c2b2e64..7c5d901 100755 --- a/EasyLoU/ScriptDebugger.cs +++ b/EasyLoU/ScriptDebugger.cs @@ -1,4 +1,4 @@ -using LoU; +using LoU; using MoonSharp.Interpreter; using MoonSharp.Interpreter.Debugging; using MoonSharp.Interpreter.Loaders; @@ -29,6 +29,7 @@ public enum DebuggerStatus private Thread ScriptThread; private Script Script; private List m_Dynamics = new List(); + private Dictionary PreviousKeyPresses; public object varsLock = new object(); public Dictionary vars = new Dictionary(); @@ -38,7 +39,8 @@ public ScriptDebugger(MainForm MainForm, String Guid, String Name) this.MainForm = MainForm; this.Guid = Guid; this.Name = Name; - } + PreviousKeyPresses = new Dictionary(); + } void WaitForTarget(int? millisecondsTimeout = 5000) { @@ -60,6 +62,41 @@ void WaitForTarget(int? millisecondsTimeout = 5000) return; } + DynValue IsHotKeyDown(string key) + { + if (MainForm.ClientStatus?.Miscellaneous.HOTKEYS == null) + { + return DynValue.NewBoolean(false); + } + + foreach (ClientStatus.HOTKEYStruct hotkey in MainForm.ClientStatus?.Miscellaneous.HOTKEYS) + { + if(hotkey.KEY == key) + { + return DynValue.NewBoolean(hotkey.VALUE); + } + } + return DynValue.NewBoolean(false); + } + + DynValue OnHotKey(string key) + { + bool oldValue = PreviousKeyPresses.ContainsKey(key) && PreviousKeyPresses[key]; + bool newValue = IsHotKeyDown(key).Boolean; + + if (newValue != oldValue) { + PreviousKeyPresses[key] = newValue; + return DynValue.NewBoolean(newValue); + } + + return DynValue.NewBoolean(false); + } + + void SetSpeed(int value) + { + this.MainForm.Invoke(new MainForm.SetTimerReadClientStatusIntervalDelegate(this.MainForm.SetTimerReadClientStatusInterval), new object[] { 1000 / value }); + } + void Sleep(int millisecondsTimeout) { System.Threading.Thread.Sleep(millisecondsTimeout); @@ -80,12 +117,18 @@ void Clear() this.MainForm.Invoke(new MainForm.ClearOutputDelegate(this.MainForm.ClearOutput), new object[] { this.Guid }); } - static DynValue CallBack(ScriptExecutionContext ctx, CallbackArguments args) + DynValue CallBack(ScriptExecutionContext ctx, CallbackArguments args) { var name = ctx.m_Callback.Name; + var arguments = args.GetArray(); - // do stuff + //Also set the update speed on the client if we're changing in the game. + if (name == "SetSpeed" && arguments.Length > 0 && arguments[0].Type == DataType.Number) + { + this.SetSpeed((int) arguments[0].Number); + } + ClientCommand Command = new ClientCommand((LoU.CommandType)Enum.Parse(typeof(LoU.CommandType), name)); for (int i = 0; i < arguments.Length; i++) { @@ -267,6 +310,9 @@ public void Play(String script, String path) this.Script.Globals[s.ToString()] = DynValue.NewCallback(CallBack, s.ToString()); } this.Script.Globals["WaitForTarget"] = (Action)WaitForTarget; // Override: this is implemented client side + this.Script.Globals["IsHotKeyDown"] = (Func)IsHotKeyDown; // Override: this is implemented client side + this.Script.Globals["OnHotKey"] = (Func)OnHotKey; // Override: this is implemented client side + // LOU status variables UserData.RegisterType(); @@ -278,6 +324,7 @@ public void Play(String script, String path) UserData.RegisterType(); UserData.RegisterType(); UserData.RegisterType(); + UserData.RegisterType(); this.Script.Globals.MetaTable = new Table(this.Script); this.Script.Globals.MetaTable["__index"] = (Func)VarCallBack; diff --git a/EasyLoU/Settings.Designer.cs b/EasyLoU/Settings.Designer.cs index f8ffce2..37fe581 100644 --- a/EasyLoU/Settings.Designer.cs +++ b/EasyLoU/Settings.Designer.cs @@ -88,8 +88,8 @@ private void InitializeComponent() this.SettingsTableLayoutPanel.Controls.Add(this.StopScriptHotkeyLabel, 0, 1); this.SettingsTableLayoutPanel.Controls.Add(this.StartScriptHotkeyAltModifierCheckBox, 2, 0); this.SettingsTableLayoutPanel.Controls.Add(this.StopAllScriptsHotkeyAltModifierCheckBox, 2, 2); - this.SettingsTableLayoutPanel.Controls.Add(this.SettingsOkButton, 5, 3); - this.SettingsTableLayoutPanel.Controls.Add(this.SettingsCancelButton, 4, 3); + this.SettingsTableLayoutPanel.Controls.Add(this.SettingsOkButton, 5, 4); + this.SettingsTableLayoutPanel.Controls.Add(this.SettingsCancelButton, 4, 4); this.SettingsTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; this.SettingsTableLayoutPanel.Location = new System.Drawing.Point(0, 0); this.SettingsTableLayoutPanel.Name = "SettingsTableLayoutPanel"; @@ -98,6 +98,7 @@ private void InitializeComponent() this.SettingsTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 34F)); this.SettingsTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 34F)); this.SettingsTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.SettingsTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); this.SettingsTableLayoutPanel.Size = new System.Drawing.Size(634, 157); this.SettingsTableLayoutPanel.TabIndex = 1; // diff --git a/EasyLoU/Settings.cs b/EasyLoU/Settings.cs index 381ac59..53c0b1e 100644 --- a/EasyLoU/Settings.cs +++ b/EasyLoU/Settings.cs @@ -1,4 +1,4 @@ -using Microsoft.Win32; +using Microsoft.Win32; using System; using System.Collections.Generic; using System.ComponentModel; @@ -47,6 +47,7 @@ public static void LoadSettings() StopAllScriptsHotkey = (Keys)Enum.Parse(typeof(Keys), (string)EasyLoUKey.GetValue("StopAllScriptsHotkey", "None")); StopAllScriptsHotkeyModifiers = (int)EasyLoUKey.GetValue("StopAllScriptsHotkeyModifiers", KeyModifiers.None); + } public static void SaveSettings() @@ -170,5 +171,27 @@ private void SettingsCancelButton_Click(object sender, EventArgs e) { this.Close(); } + + public static Boolean getAutoReloadFromDisk() + { + RegistryKey SoftwareKey = Registry.CurrentUser.OpenSubKey("Software", true); + + RegistryKey EasyLoUKey = SoftwareKey.OpenSubKey("EasyLoU", true); + if (EasyLoUKey == null) + { + EasyLoUKey = SoftwareKey.CreateSubKey("EasyLoU", true); + } + + var AutoReloadFromDiskValue = EasyLoUKey.GetValue("AutoReloadFromDisk", false); + + if (AutoReloadFromDiskValue == null) + { + return false; + } + else + { + return Convert.ToBoolean(AutoReloadFromDiskValue); + } + } } } diff --git a/ICSharpCode.TextEditorEx/Resources/Lua-Mode.xshd b/ICSharpCode.TextEditorEx/Resources/Lua-Mode.xshd index 3849e97..2ce3482 100755 --- a/ICSharpCode.TextEditorEx/Resources/Lua-Mode.xshd +++ b/ICSharpCode.TextEditorEx/Resources/Lua-Mode.xshd @@ -102,6 +102,8 @@ italic="false" color="Green"> + + @@ -123,6 +125,8 @@ + + @@ -134,8 +138,12 @@ + + + + @@ -173,6 +181,8 @@ + + @@ -183,6 +193,8 @@ + + @@ -197,6 +209,7 @@ + @@ -224,7 +237,7 @@ - + + + + + diff --git a/LoU b/LoU index e752438..869f1e4 160000 --- a/LoU +++ b/LoU @@ -1 +1 @@ -Subproject commit e752438d0fd4052edcfd6a73705bf641f796239d +Subproject commit 869f1e479c7a44bab8ee716b50f40327382b41e5