From 8be94aa09cd2a5f3e181dac5c74ffb76ce3fa6f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lollipopkit=F0=9F=8F=B3=EF=B8=8F=E2=80=8D=E2=9A=A7?= =?UTF-8?q?=EF=B8=8F?= <10864310+lollipopkit@users.noreply.github.com> Date: Fri, 26 Jul 2024 23:32:57 +0800 Subject: [PATCH] feat: use `$EDITOR` to edit files (#496) Fixes #489 --- lib/data/store/setting.dart | 4 ++++ lib/l10n/app_de.arb | 1 + lib/l10n/app_en.arb | 1 + lib/l10n/app_es.arb | 1 + lib/l10n/app_fr.arb | 1 + lib/l10n/app_id.arb | 1 + lib/l10n/app_ja.arb | 1 + lib/l10n/app_nl.arb | 1 + lib/l10n/app_pt.arb | 1 + lib/l10n/app_ru.arb | 1 + lib/l10n/app_zh.arb | 1 + lib/l10n/app_zh_tw.arb | 1 + lib/view/page/setting/entry.dart | 37 ++++++++++++++++++++++++++++++++ lib/view/page/storage/sftp.dart | 13 ++++++++++- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 16 files changed, 67 insertions(+), 4 deletions(-) diff --git a/lib/data/store/setting.dart b/lib/data/store/setting.dart index 640808e5..0ebab4a9 100644 --- a/lib/data/store/setting.dart +++ b/lib/data/store/setting.dart @@ -284,6 +284,10 @@ class SettingStore extends PersistentStore { late final letterCache = property('letterCache', false); + /// Set it to `$EDITOR`, `vim` and etc. to use remote system editor in SSH terminal. + /// Set it empty to use local editor GUI. + late final sftpEditor = property('sftpEditor', ''); + // Never show these settings for users // // ------BEGIN------ diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 25040d29..3c02062f 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -264,6 +264,7 @@ "serverTabUnkown": "Unbekannter Status", "setting": "Einstellungen", "sftpDlPrepare": "Verbindung vorbereiten...", + "sftpEditorTip": "Wenn leer, verwenden Sie den im App integrierten Dateieditor. Wenn ein Wert vorhanden ist, wird der Editor des Remote-Servers verwendet, z.B. `vim` (es wird empfohlen, automatisch gemäß `EDITOR` zu ermitteln).", "sftpRmrDirSummary": "Verwenden Sie \"rm -r\", um das Verzeichnis in SFTP zu löschen.", "sftpSSHConnected": "SFTP Verbunden", "sftpShowFoldersFirst": "Ordner zuerst anzeigen", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 69061850..3539189a 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -264,6 +264,7 @@ "serverTabUnkown": "Unknown state", "setting": "Settings", "sftpDlPrepare": "Preparing to connect...", + "sftpEditorTip": "If empty, use the built-in file editor of the app. If a value is present, use the remote server’s editor, e.g., `vim` (recommended to automatically detect according to `EDITOR`).", "sftpRmrDirSummary": "Use `rm -r` to delete a folder in SFTP.", "sftpSSHConnected": "SFTP Connected", "sftpShowFoldersFirst": "Display folders first", diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 06817bc4..75fa0de6 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -264,6 +264,7 @@ "serverTabUnkown": "Estado desconocido", "setting": "Configuración", "sftpDlPrepare": "Preparando para conectar al servidor...", + "sftpEditorTip": "Si está vacío, use el editor de archivos incorporado de la aplicación. Si hay un valor, use el editor del servidor remoto, por ejemplo, `vim` (se recomienda detectar automáticamente según `EDITOR`).", "sftpRmrDirSummary": "Usar `rm -r` en SFTP para eliminar directorios", "sftpSSHConnected": "SFTP conectado...", "sftpShowFoldersFirst": "Mostrar carpetas primero", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index c0f871d2..5530be45 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -264,6 +264,7 @@ "serverTabUnkown": "État inconnu", "setting": "Paramètres", "sftpDlPrepare": "Préparation de la connexion...", + "sftpEditorTip": "Si vide, utilisez l’éditeur de fichiers intégré de l’application. Si une valeur est présente, utilisez l’éditeur du serveur distant, par exemple `vim` (il est recommandé de détecter automatiquement selon `EDITOR`).", "sftpRmrDirSummary": "Utilisez `rm -r` pour supprimer un dossier en SFTP.", "sftpSSHConnected": "SFTP Connecté", "sftpShowFoldersFirst": "Afficher d'abord les dossiers", diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index ca43aaf1..926554f0 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -264,6 +264,7 @@ "serverTabUnkown": "Negara yang tidak diketahui", "setting": "Pengaturan", "sftpDlPrepare": "Bersiap untuk terhubung ...", + "sftpEditorTip": "Jika kosong, gunakan editor file bawaan aplikasi. Jika ada nilai, gunakan editor server jarak jauh, misalnya `vim` (disarankan untuk mendeteksi secara otomatis sesuai `EDITOR`).", "sftpRmrDirSummary": "Gunakan `rm -r` untuk menghapus dir di SFTP", "sftpSSHConnected": "Sftp terhubung", "sftpShowFoldersFirst": "Folder ditampilkan lebih dulu", diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index faa271c7..2a1df99e 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -264,6 +264,7 @@ "serverTabUnkown": "不明な状態", "setting": "設定", "sftpDlPrepare": "サーバーへの接続を準備中...", + "sftpEditorTip": "空の場合は、アプリ内蔵のファイルエディタを使用します。値がある場合は、リモートサーバーのエディタ(例:`vim`)を使用します(`EDITOR` に従って自動検出することをお勧めします)。", "sftpRmrDirSummary": "SFTPで`rm -r`を使用してフォルダーを削除", "sftpSSHConnected": "SFTPに接続されました...", "sftpShowFoldersFirst": "フォルダーを先に表示", diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 2e4d1b51..be62021a 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -264,6 +264,7 @@ "serverTabUnkown": "Onbekende status", "setting": "Instellingen", "sftpDlPrepare": "Voorbereiden om verbinding te maken...", + "sftpEditorTip": "Indien leeg, gebruik de ingebouwde bestandseditor van de app. Indien een waarde aanwezig is, gebruik de editor van de externe server, bijvoorbeeld `vim` (aanbevolen om automatisch te detecteren volgens `EDITOR`).", "sftpRmrDirSummary": "Gebruik `rm -r` om een map te verwijderen in SFTP.", "sftpSSHConnected": "SFTP Verbonden", "sftpShowFoldersFirst": "Mappen eerst weergeven", diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 5af5ced4..ef480c49 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -264,6 +264,7 @@ "serverTabUnkown": "Estado desconhecido", "setting": "Configurações", "sftpDlPrepare": "Preparando para conectar ao servidor...", + "sftpEditorTip": "Se vazio, use o editor de arquivos integrado do aplicativo. Se houver um valor, use o editor do servidor remoto, por exemplo, `vim` (recomendado detectar automaticamente de acordo com `EDITOR`).", "sftpRmrDirSummary": "Usar `rm -r` em SFTP para excluir pastas", "sftpSSHConnected": "SFTP conectado...", "sftpShowFoldersFirst": "Mostrar pastas primeiro", diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 2e8225b3..c487746f 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -264,6 +264,7 @@ "serverTabUnkown": "неизвестно", "setting": "настройки", "sftpDlPrepare": "Подготовка к подключению к серверу...", + "sftpEditorTip": "Если пусто, используйте встроенный редактор файлов приложения. Если значение указано, используйте редактор удаленного сервера, например, `vim` (рекомендуется автоматически определять согласно `EDITOR`).", "sftpRmrDirSummary": "Использовать `rm -r` в SFTP для удаления папок", "sftpSSHConnected": "SFTP подключен...", "sftpShowFoldersFirst": "показывать папки в начале", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 441cd0cf..d8a25810 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -264,6 +264,7 @@ "serverTabUnkown": "未知状态", "setting": "设置", "sftpDlPrepare": "准备连接至服务器...", + "sftpEditorTip": "如果为空, 使用App内置的文件编辑器. 如果有值, 这是用远程服务器的编辑器, 例如 `vim` (建议根据 `EDITOR` 自动获取).", "sftpRmrDirSummary": "在 SFTP 中使用 `rm -r` 来删除文件夹", "sftpSSHConnected": "SFTP 已连接...", "sftpShowFoldersFirst": "文件夹显示在前", diff --git a/lib/l10n/app_zh_tw.arb b/lib/l10n/app_zh_tw.arb index f72f3238..4405a8bd 100644 --- a/lib/l10n/app_zh_tw.arb +++ b/lib/l10n/app_zh_tw.arb @@ -264,6 +264,7 @@ "serverTabUnkown": "未知狀態", "setting": "設置", "sftpDlPrepare": "準備連接至伺服器...", + "sftpEditorTip": "如果為空, 使用App內置的文件編輯器。如果有值, 則使用遠程伺服器的編輯器, 例如 `vim`(建議根據 `EDITOR` 自動獲取)。", "sftpRmrDirSummary": "在 SFTP 中使用 `rm -r` 來刪除文件夾", "sftpSSHConnected": "SFTP 已連接...", "sftpShowFoldersFirst": "資料夾顯示在前", diff --git a/lib/view/page/setting/entry.dart b/lib/view/page/setting/entry.dart index d6d3cf23..6e940561 100644 --- a/lib/view/page/setting/entry.dart +++ b/lib/view/page/setting/entry.dart @@ -691,6 +691,7 @@ class _SettingPageState extends State { Widget _buildSFTP() { return Column( children: [ + _buildSftpEditor(), _buildSftpRmrDir(), _buildSftpOpenLastPath(), _buildSftpShowFoldersFirst(), @@ -1237,4 +1238,40 @@ class _SettingPageState extends State { trailing: StoreSwitch(prop: _setting.letterCache), ); } + + Widget _buildSftpEditor() { + return _setting.sftpEditor.listenable().listenVal( + (val) { + return ListTile( + leading: const Icon(MingCute.edit_fill), + title: TipText(text: l10n.editor, tip: l10n.sftpEditorTip), + trailing: Text( + val.isEmpty ? l10n.inner : val, + style: UIs.text15, + ), + onTap: () async { + final ctrl = TextEditingController(text: val); + void onSave(String s) { + _setting.sftpEditor.put(s); + context.pop(); + } + + await context.showRoundDialog( + title: l10n.choose, + child: Input( + controller: ctrl, + autoFocus: true, + label: l10n.editor, + hint: '\$EDITOR / vim / nano ...', + icon: Icons.edit, + suggestion: false, + onSubmitted: onSave, + ), + actions: Btns.oks(onTap: () => onSave(ctrl.text)), + ); + }, + ); + }, + ); + } } diff --git a/lib/view/page/storage/sftp.dart b/lib/view/page/storage/sftp.dart index b10110c6..0b9ec52e 100644 --- a/lib/view/page/storage/sftp.dart +++ b/lib/view/page/storage/sftp.dart @@ -445,6 +445,18 @@ class _SftpPageState extends State with AfterLayoutMixin { } Future _edit(SftpName name) async { + context.pop(); + + // #489 + final editor = Stores.setting.sftpEditor.fetch(); + if (editor.isNotEmpty) { + // Use single quote to avoid escape + final cmd = "$editor '${_getRemotePath(name)}'"; + await AppRoutes.ssh(spi: widget.spi, initCmd: cmd).go(context); + await _listDir(); + return; + } + final size = name.attr.size; if (size == null || size > Miscs.editorMaxSize) { context.showSnackBar(l10n.fileTooLarge( @@ -454,7 +466,6 @@ class _SftpPageState extends State with AfterLayoutMixin { )); return; } - context.pop(); final remotePath = _getRemotePath(name); final localPath = await _getLocalPath(remotePath); diff --git a/pubspec.lock b/pubspec.lock index 8b3f106c..820959c5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -385,8 +385,8 @@ packages: dependency: "direct main" description: path: "." - ref: "v1.0.88" - resolved-ref: fd87becb3c112edac090903e78d863b5ca93a70e + ref: "v1.0.89" + resolved-ref: "2ea7a87e7f4c1bd68902557799a4e9406e559dcf" url: "https://github.com/lppcg/fl_lib" source: git version: "0.0.1" diff --git a/pubspec.yaml b/pubspec.yaml index ebf99341..99adf3f4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -62,7 +62,7 @@ dependencies: fl_lib: git: url: https://github.com/lppcg/fl_lib - ref: v1.0.88 + ref: v1.0.89 dependency_overrides: # dartssh2: