feat: use $EDITOR to edit files (#496)

Fixes #489
This commit is contained in:
lollipopkit🏳️‍⚧️
2024-07-26 23:32:57 +08:00
committed by GitHub
parent 5db1253ab8
commit 8be94aa09c
16 changed files with 67 additions and 4 deletions

View File

@@ -284,6 +284,10 @@ class SettingStore extends PersistentStore {
late final letterCache = property('letterCache', false); 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 // Never show these settings for users
// //
// ------BEGIN------ // ------BEGIN------

View File

@@ -264,6 +264,7 @@
"serverTabUnkown": "Unbekannter Status", "serverTabUnkown": "Unbekannter Status",
"setting": "Einstellungen", "setting": "Einstellungen",
"sftpDlPrepare": "Verbindung vorbereiten...", "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.", "sftpRmrDirSummary": "Verwenden Sie \"rm -r\", um das Verzeichnis in SFTP zu löschen.",
"sftpSSHConnected": "SFTP Verbunden", "sftpSSHConnected": "SFTP Verbunden",
"sftpShowFoldersFirst": "Ordner zuerst anzeigen", "sftpShowFoldersFirst": "Ordner zuerst anzeigen",

View File

@@ -264,6 +264,7 @@
"serverTabUnkown": "Unknown state", "serverTabUnkown": "Unknown state",
"setting": "Settings", "setting": "Settings",
"sftpDlPrepare": "Preparing to connect...", "sftpDlPrepare": "Preparing to connect...",
"sftpEditorTip": "If empty, use the built-in file editor of the app. If a value is present, use the remote servers editor, e.g., `vim` (recommended to automatically detect according to `EDITOR`).",
"sftpRmrDirSummary": "Use `rm -r` to delete a folder in SFTP.", "sftpRmrDirSummary": "Use `rm -r` to delete a folder in SFTP.",
"sftpSSHConnected": "SFTP Connected", "sftpSSHConnected": "SFTP Connected",
"sftpShowFoldersFirst": "Display folders first", "sftpShowFoldersFirst": "Display folders first",

View File

@@ -264,6 +264,7 @@
"serverTabUnkown": "Estado desconocido", "serverTabUnkown": "Estado desconocido",
"setting": "Configuración", "setting": "Configuración",
"sftpDlPrepare": "Preparando para conectar al servidor...", "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", "sftpRmrDirSummary": "Usar `rm -r` en SFTP para eliminar directorios",
"sftpSSHConnected": "SFTP conectado...", "sftpSSHConnected": "SFTP conectado...",
"sftpShowFoldersFirst": "Mostrar carpetas primero", "sftpShowFoldersFirst": "Mostrar carpetas primero",

View File

@@ -264,6 +264,7 @@
"serverTabUnkown": "État inconnu", "serverTabUnkown": "État inconnu",
"setting": "Paramètres", "setting": "Paramètres",
"sftpDlPrepare": "Préparation de la connexion...", "sftpDlPrepare": "Préparation de la connexion...",
"sftpEditorTip": "Si vide, utilisez léditeur de fichiers intégré de lapplication. 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.", "sftpRmrDirSummary": "Utilisez `rm -r` pour supprimer un dossier en SFTP.",
"sftpSSHConnected": "SFTP Connecté", "sftpSSHConnected": "SFTP Connecté",
"sftpShowFoldersFirst": "Afficher d'abord les dossiers", "sftpShowFoldersFirst": "Afficher d'abord les dossiers",

View File

@@ -264,6 +264,7 @@
"serverTabUnkown": "Negara yang tidak diketahui", "serverTabUnkown": "Negara yang tidak diketahui",
"setting": "Pengaturan", "setting": "Pengaturan",
"sftpDlPrepare": "Bersiap untuk terhubung ...", "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", "sftpRmrDirSummary": "Gunakan `rm -r` untuk menghapus dir di SFTP",
"sftpSSHConnected": "Sftp terhubung", "sftpSSHConnected": "Sftp terhubung",
"sftpShowFoldersFirst": "Folder ditampilkan lebih dulu", "sftpShowFoldersFirst": "Folder ditampilkan lebih dulu",

View File

@@ -264,6 +264,7 @@
"serverTabUnkown": "不明な状態", "serverTabUnkown": "不明な状態",
"setting": "設定", "setting": "設定",
"sftpDlPrepare": "サーバーへの接続を準備中...", "sftpDlPrepare": "サーバーへの接続を準備中...",
"sftpEditorTip": "空の場合は、アプリ内蔵のファイルエディタを使用します。値がある場合は、リモートサーバーのエディタ(例:`vim`)を使用します(`EDITOR` に従って自動検出することをお勧めします)。",
"sftpRmrDirSummary": "SFTPで`rm -r`を使用してフォルダーを削除", "sftpRmrDirSummary": "SFTPで`rm -r`を使用してフォルダーを削除",
"sftpSSHConnected": "SFTPに接続されました...", "sftpSSHConnected": "SFTPに接続されました...",
"sftpShowFoldersFirst": "フォルダーを先に表示", "sftpShowFoldersFirst": "フォルダーを先に表示",

View File

@@ -264,6 +264,7 @@
"serverTabUnkown": "Onbekende status", "serverTabUnkown": "Onbekende status",
"setting": "Instellingen", "setting": "Instellingen",
"sftpDlPrepare": "Voorbereiden om verbinding te maken...", "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.", "sftpRmrDirSummary": "Gebruik `rm -r` om een map te verwijderen in SFTP.",
"sftpSSHConnected": "SFTP Verbonden", "sftpSSHConnected": "SFTP Verbonden",
"sftpShowFoldersFirst": "Mappen eerst weergeven", "sftpShowFoldersFirst": "Mappen eerst weergeven",

View File

@@ -264,6 +264,7 @@
"serverTabUnkown": "Estado desconhecido", "serverTabUnkown": "Estado desconhecido",
"setting": "Configurações", "setting": "Configurações",
"sftpDlPrepare": "Preparando para conectar ao servidor...", "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", "sftpRmrDirSummary": "Usar `rm -r` em SFTP para excluir pastas",
"sftpSSHConnected": "SFTP conectado...", "sftpSSHConnected": "SFTP conectado...",
"sftpShowFoldersFirst": "Mostrar pastas primeiro", "sftpShowFoldersFirst": "Mostrar pastas primeiro",

View File

@@ -264,6 +264,7 @@
"serverTabUnkown": "неизвестно", "serverTabUnkown": "неизвестно",
"setting": "настройки", "setting": "настройки",
"sftpDlPrepare": "Подготовка к подключению к серверу...", "sftpDlPrepare": "Подготовка к подключению к серверу...",
"sftpEditorTip": "Если пусто, используйте встроенный редактор файлов приложения. Если значение указано, используйте редактор удаленного сервера, например, `vim` (рекомендуется автоматически определять согласно `EDITOR`).",
"sftpRmrDirSummary": "Использовать `rm -r` в SFTP для удаления папок", "sftpRmrDirSummary": "Использовать `rm -r` в SFTP для удаления папок",
"sftpSSHConnected": "SFTP подключен...", "sftpSSHConnected": "SFTP подключен...",
"sftpShowFoldersFirst": "показывать папки в начале", "sftpShowFoldersFirst": "показывать папки в начале",

View File

@@ -264,6 +264,7 @@
"serverTabUnkown": "未知状态", "serverTabUnkown": "未知状态",
"setting": "设置", "setting": "设置",
"sftpDlPrepare": "准备连接至服务器...", "sftpDlPrepare": "准备连接至服务器...",
"sftpEditorTip": "如果为空, 使用App内置的文件编辑器. 如果有值, 这是用远程服务器的编辑器, 例如 `vim` (建议根据 `EDITOR` 自动获取).",
"sftpRmrDirSummary": "在 SFTP 中使用 `rm -r` 来删除文件夹", "sftpRmrDirSummary": "在 SFTP 中使用 `rm -r` 来删除文件夹",
"sftpSSHConnected": "SFTP 已连接...", "sftpSSHConnected": "SFTP 已连接...",
"sftpShowFoldersFirst": "文件夹显示在前", "sftpShowFoldersFirst": "文件夹显示在前",

View File

@@ -264,6 +264,7 @@
"serverTabUnkown": "未知狀態", "serverTabUnkown": "未知狀態",
"setting": "設置", "setting": "設置",
"sftpDlPrepare": "準備連接至伺服器...", "sftpDlPrepare": "準備連接至伺服器...",
"sftpEditorTip": "如果為空, 使用App內置的文件編輯器。如果有值, 則使用遠程伺服器的編輯器, 例如 `vim`(建議根據 `EDITOR` 自動獲取)。",
"sftpRmrDirSummary": "在 SFTP 中使用 `rm -r` 來刪除文件夾", "sftpRmrDirSummary": "在 SFTP 中使用 `rm -r` 來刪除文件夾",
"sftpSSHConnected": "SFTP 已連接...", "sftpSSHConnected": "SFTP 已連接...",
"sftpShowFoldersFirst": "資料夾顯示在前", "sftpShowFoldersFirst": "資料夾顯示在前",

View File

@@ -691,6 +691,7 @@ class _SettingPageState extends State<SettingPage> {
Widget _buildSFTP() { Widget _buildSFTP() {
return Column( return Column(
children: [ children: [
_buildSftpEditor(),
_buildSftpRmrDir(), _buildSftpRmrDir(),
_buildSftpOpenLastPath(), _buildSftpOpenLastPath(),
_buildSftpShowFoldersFirst(), _buildSftpShowFoldersFirst(),
@@ -1237,4 +1238,40 @@ class _SettingPageState extends State<SettingPage> {
trailing: StoreSwitch(prop: _setting.letterCache), 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<bool>(
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)),
);
},
);
},
);
}
} }

View File

@@ -445,6 +445,18 @@ class _SftpPageState extends State<SftpPage> with AfterLayoutMixin {
} }
Future<void> _edit(SftpName name) async { Future<void> _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; final size = name.attr.size;
if (size == null || size > Miscs.editorMaxSize) { if (size == null || size > Miscs.editorMaxSize) {
context.showSnackBar(l10n.fileTooLarge( context.showSnackBar(l10n.fileTooLarge(
@@ -454,7 +466,6 @@ class _SftpPageState extends State<SftpPage> with AfterLayoutMixin {
)); ));
return; return;
} }
context.pop();
final remotePath = _getRemotePath(name); final remotePath = _getRemotePath(name);
final localPath = await _getLocalPath(remotePath); final localPath = await _getLocalPath(remotePath);

View File

@@ -385,8 +385,8 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
path: "." path: "."
ref: "v1.0.88" ref: "v1.0.89"
resolved-ref: fd87becb3c112edac090903e78d863b5ca93a70e resolved-ref: "2ea7a87e7f4c1bd68902557799a4e9406e559dcf"
url: "https://github.com/lppcg/fl_lib" url: "https://github.com/lppcg/fl_lib"
source: git source: git
version: "0.0.1" version: "0.0.1"

View File

@@ -62,7 +62,7 @@ dependencies:
fl_lib: fl_lib:
git: git:
url: https://github.com/lppcg/fl_lib url: https://github.com/lppcg/fl_lib
ref: v1.0.88 ref: v1.0.89
dependency_overrides: dependency_overrides:
# dartssh2: # dartssh2: