From 2250ed40387956fb79c3ac310b1dca2174d461a5 Mon Sep 17 00:00:00 2001 From: walterlv Date: Tue, 10 Sep 2024 19:08:30 +0800 Subject: [PATCH 001/111] Add blueprint. --- README.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/README.md b/README.md index f53b0a2..ccc348d 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,43 @@ # Walterlv Terminal 名字还没取。等做好了能用了再取名字吧! + +## 蓝图 + +### 界面 + +1. 标签页和分栏 + - 用户可以在终端中打开多个标签页,每个标签页可以分栏显示多个终端。 + - 通过拖拽标签页,用户可以调整标签页的顺序,也可以将标签页拖成分栏。暂不支持多窗口。 + +### 特色功能 + +1. 自动设置的安全连接 + - 首次使用密码成功登录后,如果用户同意,将自动生成公私钥对,然后将公钥上传到服务器,后续登录时使用私钥登录。 +2. 使用主密码保护连接 + - 在此终端中新建的 SSH 配置,如果用户要求保存密码或私钥,将使用主密码加密保存。后续启动终端并试图连接已加密的配置时,将要求输入主密码解密。 +3. 自动文件夹同步 + - 允许用户指定一个本地文件夹(允许路径不存在)与 SSH 远程文件夹(允许路径不存在)同步,在 SSH 连接期间将自动同步文件夹。对于每一个 SSH 配置,都有一个同步文件夹列表。文件同步使用 SFTP 实现。 + - 允许设置同步方向:本地到远程、远程到本地。如果反向出现了文件更改,将给用户一个可以将文件反向同步回来的快速操作。暂不支持双向同步。 + - 同步中自动发现可执行文件(通过文件头),并在同步后自动设置远程可执行权限。 + - 界面上会显示所有的同步文件夹列表,并对每组同步直观显示其同步状态(同步中、已同步、路径不存在、同步失败、存在反向更改等)。 +4. 首次连接指引 + - 试图连接到未开启 SSH 服务的主机(即所输入的主机地址无法连接)时,将给出一个指引,告诉用户如何在目标主机上开启 SSH 服务。 +5. 跨机器的配置 + - 面对新的 SSH 主机,用户可以选择从已有的 SSH 配置中复制配置,然后在新主机中重演初始化配置,使其快速适配自己的操作习惯。(例如公钥、同步文件夹、命令组等) +6. 模板化的命令组 + - 预设一系列常用的模板命令组,用户可直接执行,无需手动输入;并且在执行过程中,用户可以观看到命令的执行过程,以及命令的输出,方便学习这些命令。 + - 预设一些常用命令的教程,用户在使用对应命令时,会自动显示这些命令的常用参数解释和用法示例。 + - 所有预设的模板命令组和命令教程在 GitHub 上以单独的仓库维护,用户可以通过提交 PR 来增加新的命令组和命令教程。 + - 用户可添加自己的 Git 仓库,以获取自己的模板命令组和命令教程。 + - 用户可在终端中添加自己的命令组和命令教程。 + - 用户可将自己常用的模板命令组和命令教程加入收藏夹,以便快速查看和执行。 + - 对于用户已输入的命令,用户可查看此命令所对应的教程。 +7. 后台快速命令 + - 当有多个标签页打开时,通常用户是主用一个辅用其他。可以将其他标签页里反复执行的命令设置为快速后台命令,这样当用户在主标签页中工作时,可以在拥有快速后台命令的标签页上看到快速命令执行按钮,点击或快捷键即可执行。执行过程中可通过小窗预览命令执行过程和输出,执行完成或失败后有明显的提示。这样,用户便可以几乎全程不打开其他标签页,就可以完成大部分工作。 +8. 连接任意主机 + - 可以做一个用于在远程主机上运行的程序,一旦运行起来,即便不使用 SSH 连接,也可以在本终端中使用全部功能。这样,无论是未开启 SSH 服务的 Linux 主机,还是随便的 Windows 主机、Mac 主机,都可以使用本终端。 +9. AI + - 用户点击 AI 解读按钮,可对已执行的或正在键入的命令进行解读,给出命令的解释、用法示例、常见错误等。 + - 用户输入命令的过程中,AI 可以给出命令的自动补全建议。 + - 用户点击 AI 命令按钮,可将命令输入框变为自然语言输入框,用户可以输入自然语言,AI 将其翻译为命令,并给出解释。用户确认后即可执行命令。 From 4fd95f32242597c43527f04ec719a55456364d92 Mon Sep 17 00:00:00 2001 From: walterlv Date: Tue, 10 Sep 2024 19:08:44 +0800 Subject: [PATCH 002/111] Add SSH.NET --- Directory.Packages.props | 1 + src/Walterlv.Terminal/Walterlv.Terminal.csproj | 1 + 2 files changed, 2 insertions(+) diff --git a/Directory.Packages.props b/Directory.Packages.props index 26b1dc2..42b8f67 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -7,5 +7,6 @@ + diff --git a/src/Walterlv.Terminal/Walterlv.Terminal.csproj b/src/Walterlv.Terminal/Walterlv.Terminal.csproj index b0287ef..2133afc 100644 --- a/src/Walterlv.Terminal/Walterlv.Terminal.csproj +++ b/src/Walterlv.Terminal/Walterlv.Terminal.csproj @@ -15,6 +15,7 @@ + From 3435c7512f87601090a323d1aef7e907d1526223 Mon Sep 17 00:00:00 2001 From: walterlv Date: Thu, 26 Sep 2024 16:30:39 +0800 Subject: [PATCH 003/111] Add basic UI layout. --- src/Walterlv.Terminal/Views/MainView.axaml | 50 ++++++++++++++++++---- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/src/Walterlv.Terminal/Views/MainView.axaml b/src/Walterlv.Terminal/Views/MainView.axaml index 8af38a1..a5081ff 100644 --- a/src/Walterlv.Terminal/Views/MainView.axaml +++ b/src/Walterlv.Terminal/Views/MainView.axaml @@ -3,18 +3,52 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="Walterlv.Terminal.Views.MainView"> + x:Class="Walterlv.Terminal.Views.MainView" + UseLayoutRounding="True"> - - + + #00000000 + #7F000000 + - - + + + - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From bafe205682a9f25ca5e9ccbc5fbc1085013cce85 Mon Sep 17 00:00:00 2001 From: walterlv Date: Thu, 14 Nov 2024 15:46:57 +0800 Subject: [PATCH 004/111] =?UTF-8?q?=E5=8A=A0=E4=B8=8A=E5=85=89=E5=BD=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Walterlv.Terminal/App.axaml | 2 +- src/Walterlv.Terminal/MainWindow.axaml | 13 +++++- src/Walterlv.Terminal/MainWindow.axaml.cs | 33 +++++++++++++++ src/Walterlv.Terminal/Views/MainView.axaml | 47 ++++++++++++++-------- 4 files changed, 76 insertions(+), 19 deletions(-) diff --git a/src/Walterlv.Terminal/App.axaml b/src/Walterlv.Terminal/App.axaml index c3bc14a..2752b7f 100644 --- a/src/Walterlv.Terminal/App.axaml +++ b/src/Walterlv.Terminal/App.axaml @@ -1,7 +1,7 @@ + RequestedThemeVariant="Light"> diff --git a/src/Walterlv.Terminal/MainWindow.axaml b/src/Walterlv.Terminal/MainWindow.axaml index e28bc79..2b9a65b 100644 --- a/src/Walterlv.Terminal/MainWindow.axaml +++ b/src/Walterlv.Terminal/MainWindow.axaml @@ -10,11 +10,22 @@ Background="{x:Null}" TransparencyLevelHint="Mica" ExtendClientAreaChromeHints="PreferSystemChrome" ExtendClientAreaToDecorationsHint="True" - ExtendClientAreaTitleBarHeightHint="40"> + ExtendClientAreaTitleBarHeightHint="40" + Width="1280" Height="960" WindowStartupLocation="CenterScreen"> + + + + + + + + + + diff --git a/src/Walterlv.Terminal/MainWindow.axaml.cs b/src/Walterlv.Terminal/MainWindow.axaml.cs index fec0c56..fb62b1e 100644 --- a/src/Walterlv.Terminal/MainWindow.axaml.cs +++ b/src/Walterlv.Terminal/MainWindow.axaml.cs @@ -1,4 +1,6 @@ +using Avalonia; using Avalonia.Controls; +using Avalonia.Media; namespace Walterlv.Terminal; @@ -7,5 +9,36 @@ public partial class MainWindow : Window public MainWindow() { InitializeComponent(); + InitializeWindowSize(); + + SunshineBorder.SizeChanged += OnSizeChanged; + } + + private void OnSizeChanged(object? sender, SizeChangedEventArgs e) + { + var min = Math.Min(e.NewSize.Width, e.NewSize.Height); + var brush = (LinearGradientBrush)SunshineBorder.Background!; + brush.EndPoint = new RelativePoint(min / 2, min, RelativeUnit.Absolute); + } + + private void InitializeWindowSize() + { + var designWidth = Width; + var designHeight = Height; + + var screen = Screens.ScreenFromWindow(this); + if (screen is null) + { + Width = designWidth; + Height = designHeight; + return; + } + + var desiredHeight = screen.WorkingArea.Height / screen.Scaling * 0.75; + var height = Math.Min(designHeight, desiredHeight); + var width = height * 4 / 3; + + Width = width; + Height = height; } } diff --git a/src/Walterlv.Terminal/Views/MainView.axaml b/src/Walterlv.Terminal/Views/MainView.axaml index a5081ff..e755542 100644 --- a/src/Walterlv.Terminal/Views/MainView.axaml +++ b/src/Walterlv.Terminal/Views/MainView.axaml @@ -7,8 +7,9 @@ UseLayoutRounding="True"> - #00000000 - #7F000000 + #7FCCCCCC + #7FCCCCCC + #FF333333 @@ -18,37 +19,49 @@ - + - + + + + - - + + - + - + - - - - - - - - - + + + + + + + + + + + + + From baff6361f6d109dc0b4d2cceb442137f4f791c9f Mon Sep 17 00:00:00 2001 From: walterlv Date: Mon, 2 Dec 2024 11:09:33 +0800 Subject: [PATCH 005/111] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E5=92=8C=E6=96=87=E4=BB=B6=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Walterlv.Terminal/Views/MainView.axaml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Walterlv.Terminal/Views/MainView.axaml b/src/Walterlv.Terminal/Views/MainView.axaml index e755542..757ce6e 100644 --- a/src/Walterlv.Terminal/Views/MainView.axaml +++ b/src/Walterlv.Terminal/Views/MainView.axaml @@ -17,6 +17,14 @@ + @@ -26,7 +34,10 @@ - + + + + From d4c9178d16cc27feadeff8684d6f8fcdd4c64324 Mon Sep 17 00:00:00 2001 From: walterlv Date: Sun, 15 Dec 2024 11:58:39 +0800 Subject: [PATCH 006/111] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=B9=B6=E4=B8=8D?= =?UTF-8?q?=E5=A5=BD=E7=9C=8B=E7=9A=84=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Walterlv.Terminal/App.axaml | 2 +- src/Walterlv.Terminal/MainWindow.axaml | 10 ---------- src/Walterlv.Terminal/MainWindow.axaml.cs | 11 ----------- src/Walterlv.Terminal/Views/MainView.axaml | 21 ++------------------- 4 files changed, 3 insertions(+), 41 deletions(-) diff --git a/src/Walterlv.Terminal/App.axaml b/src/Walterlv.Terminal/App.axaml index 2752b7f..c3bc14a 100644 --- a/src/Walterlv.Terminal/App.axaml +++ b/src/Walterlv.Terminal/App.axaml @@ -1,7 +1,7 @@ + RequestedThemeVariant="Dark"> diff --git a/src/Walterlv.Terminal/MainWindow.axaml b/src/Walterlv.Terminal/MainWindow.axaml index 2b9a65b..95492cc 100644 --- a/src/Walterlv.Terminal/MainWindow.axaml +++ b/src/Walterlv.Terminal/MainWindow.axaml @@ -17,15 +17,5 @@ - - - - - - - - - - diff --git a/src/Walterlv.Terminal/MainWindow.axaml.cs b/src/Walterlv.Terminal/MainWindow.axaml.cs index fb62b1e..9823404 100644 --- a/src/Walterlv.Terminal/MainWindow.axaml.cs +++ b/src/Walterlv.Terminal/MainWindow.axaml.cs @@ -1,6 +1,4 @@ -using Avalonia; using Avalonia.Controls; -using Avalonia.Media; namespace Walterlv.Terminal; @@ -10,15 +8,6 @@ public MainWindow() { InitializeComponent(); InitializeWindowSize(); - - SunshineBorder.SizeChanged += OnSizeChanged; - } - - private void OnSizeChanged(object? sender, SizeChangedEventArgs e) - { - var min = Math.Min(e.NewSize.Width, e.NewSize.Height); - var brush = (LinearGradientBrush)SunshineBorder.Background!; - brush.EndPoint = new RelativePoint(min / 2, min, RelativeUnit.Absolute); } private void InitializeWindowSize() diff --git a/src/Walterlv.Terminal/Views/MainView.axaml b/src/Walterlv.Terminal/Views/MainView.axaml index 757ce6e..ae2fb2b 100644 --- a/src/Walterlv.Terminal/Views/MainView.axaml +++ b/src/Walterlv.Terminal/Views/MainView.axaml @@ -7,8 +7,8 @@ UseLayoutRounding="True"> - #7FCCCCCC - #7FCCCCCC + #0F666666 + #1F666666 #FF333333 @@ -56,23 +56,6 @@ - - - - - - - - - - - - - From e03d9d5b1db5399987f586bc6f0c136de7c02f02 Mon Sep 17 00:00:00 2001 From: walterlv Date: Sun, 15 Dec 2024 11:58:50 +0800 Subject: [PATCH 007/111] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Directory.Packages.props | 1 + src/Walterlv.Terminal/Walterlv.Terminal.csproj | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/Directory.Packages.props b/Directory.Packages.props index 42b8f67..231eebe 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -7,6 +7,7 @@ + diff --git a/src/Walterlv.Terminal/Walterlv.Terminal.csproj b/src/Walterlv.Terminal/Walterlv.Terminal.csproj index 2133afc..fd12439 100644 --- a/src/Walterlv.Terminal/Walterlv.Terminal.csproj +++ b/src/Walterlv.Terminal/Walterlv.Terminal.csproj @@ -15,7 +15,12 @@ + + + + + From 65c7b6ce12aa043d6c82d35fabe889b37b54b70f Mon Sep 17 00:00:00 2001 From: walterlv Date: Fri, 3 Jan 2025 10:39:59 +0800 Subject: [PATCH 008/111] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=93=BE=E6=8E=A5?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E8=AF=BB=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Configurations/ConfigurationManager.cs | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/Walterlv.Terminal/Configurations/ConfigurationManager.cs diff --git a/src/Walterlv.Terminal/Configurations/ConfigurationManager.cs b/src/Walterlv.Terminal/Configurations/ConfigurationManager.cs new file mode 100644 index 0000000..f01dcff --- /dev/null +++ b/src/Walterlv.Terminal/Configurations/ConfigurationManager.cs @@ -0,0 +1,22 @@ +using Tomlet; + +namespace Walterlv.Terminal.Configurations; + +public class ConfigurationManager +{ + private readonly string _configurationPath; + + public ConfigurationManager() + { + _configurationPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "terminal.toml"); + } + + public void Reload() + { + if (!File.Exists(_configurationPath)) + { + return; + } + + } +} From d888e7bc536b62f835fd3f58c2121bc165094cd5 Mon Sep 17 00:00:00 2001 From: walterlv Date: Fri, 3 Jan 2025 11:26:49 +0800 Subject: [PATCH 009/111] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Walterlv.Terminal/App.axaml | 20 ++++-- .../Views/ConnectionListPage.axaml | 63 +++++++++++++++++++ .../Views/ConnectionListPage.axaml.cs | 14 +++++ src/Walterlv.Terminal/Views/MainView.axaml | 38 ++--------- 4 files changed, 98 insertions(+), 37 deletions(-) create mode 100644 src/Walterlv.Terminal/Views/ConnectionListPage.axaml create mode 100644 src/Walterlv.Terminal/Views/ConnectionListPage.axaml.cs diff --git a/src/Walterlv.Terminal/App.axaml b/src/Walterlv.Terminal/App.axaml index c3bc14a..6d4b572 100644 --- a/src/Walterlv.Terminal/App.axaml +++ b/src/Walterlv.Terminal/App.axaml @@ -2,10 +2,22 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="Walterlv.Terminal.App" RequestedThemeVariant="Dark"> - - - - + + #0F666666 + #1F666666 + #FF333333 + + + + + + + diff --git a/src/Walterlv.Terminal/Views/ConnectionListPage.axaml b/src/Walterlv.Terminal/Views/ConnectionListPage.axaml new file mode 100644 index 0000000..46496b2 --- /dev/null +++ b/src/Walterlv.Terminal/Views/ConnectionListPage.axaml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + +