diff --git a/Terminal.Gui/Drivers/AnsiResponseParser/Keyboard/CsiCursorPattern.cs b/Terminal.Gui/Drivers/AnsiResponseParser/Keyboard/CsiCursorPattern.cs
index 0255e7394..744658a76 100644
--- a/Terminal.Gui/Drivers/AnsiResponseParser/Keyboard/CsiCursorPattern.cs
+++ b/Terminal.Gui/Drivers/AnsiResponseParser/Keyboard/CsiCursorPattern.cs
@@ -7,11 +7,11 @@ namespace Terminal.Gui.Drivers;
/// Detects ansi escape sequences in strings that have been read from
/// the terminal (see ).
/// Handles navigation CSI key parsing such as \x1b[A (Cursor up)
-/// and \x1b[1;5A (Cursor up with Ctrl)
+/// and \x1b[1;5A (Cursor/Function with modifier(s))
///
public class CsiCursorPattern : AnsiKeyboardParserPattern
{
- private readonly Regex _pattern = new (@"^\u001b\[(?:1;(\d+))?([A-DHF])$");
+ private readonly Regex _pattern = new (@"^\u001b\[(?:1;(\d+))?([A-DFHPQRS])$");
private readonly Dictionary _cursorMap = new ()
{
@@ -20,7 +20,13 @@ public class CsiCursorPattern : AnsiKeyboardParserPattern
{ 'C', Key.CursorRight },
{ 'D', Key.CursorLeft },
{ 'H', Key.Home },
- { 'F', Key.End }
+ { 'F', Key.End },
+
+ // F1–F4 as per xterm VT100-style CSI sequences
+ { 'P', Key.F1 },
+ { 'Q', Key.F2 },
+ { 'R', Key.F3 },
+ { 'S', Key.F4 }
};
///
diff --git a/Tests/UnitTests/ConsoleDrivers/AnsiKeyboardParserTests.cs b/Tests/UnitTests/ConsoleDrivers/AnsiKeyboardParserTests.cs
index d7bcedd18..4e178bdc6 100644
--- a/Tests/UnitTests/ConsoleDrivers/AnsiKeyboardParserTests.cs
+++ b/Tests/UnitTests/ConsoleDrivers/AnsiKeyboardParserTests.cs
@@ -100,11 +100,10 @@ public class AnsiKeyboardParserTests
yield return new object [] { "\u001b[24~", Key.F12 };
// Function keys with modifiers
- /* Not currently supported
yield return new object [] { "\u001b[1;2P", Key.F1.WithShift };
yield return new object [] { "\u001b[1;3Q", Key.F2.WithAlt };
yield return new object [] { "\u001b[1;5R", Key.F3.WithCtrl };
- */
+
}
// Consolidated test for all keyboard events (e.g., arrow keys)