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);
/// 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------

View File

@@ -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",

View File

@@ -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 servers 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",

View File

@@ -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",

View File

@@ -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 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.",
"sftpSSHConnected": "SFTP Connecté",
"sftpShowFoldersFirst": "Afficher d'abord les dossiers",

View File

@@ -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",

View File

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

View File

@@ -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",

View File

@@ -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",

View File

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

View File

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

View File

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

View File

@@ -691,6 +691,7 @@ class _SettingPageState extends State<SettingPage> {
Widget _buildSFTP() {
return Column(
children: [
_buildSftpEditor(),
_buildSftpRmrDir(),
_buildSftpOpenLastPath(),
_buildSftpShowFoldersFirst(),
@@ -1237,4 +1238,40 @@ class _SettingPageState extends State<SettingPage> {
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 {
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<SftpPage> with AfterLayoutMixin {
));
return;
}
context.pop();
final remotePath = _getRemotePath(name);
final localPath = await _getLocalPath(remotePath);

View File

@@ -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"

View File

@@ -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: