Jelajahi Sumber

added hotkeys to save session output

Eugene Pankov 5 tahun lalu
induk
melakukan
b3f17b84ff
1 mengubah file dengan 90 tambahan dan 20 penghapusan
  1. 90 20
      terminus-terminal/src/features/debug.ts

+ 90 - 20
terminus-terminal/src/features/debug.ts

@@ -15,55 +15,125 @@ export class DebugDecorator extends TerminalDecorator {
     }
 
     attach (terminal: TerminalTabComponent): void {
+        let sessionOutputBuffer = ''
+        const bufferLength = 8192
+
+        this.subscribeUntilDetached(terminal, terminal.session.output$.subscribe(data => {
+            sessionOutputBuffer += data
+            if (sessionOutputBuffer.length > bufferLength) {
+                sessionOutputBuffer = sessionOutputBuffer.substring(sessionOutputBuffer.length - bufferLength)
+            }
+        }))
+
         terminal.content.nativeElement.addEventListener('keyup', e => {
+            // Ctrl-Shift-Alt-1
             if (e.which === 49 && e.ctrlKey && e.shiftKey && e.altKey) {
-                this.doSaveOutput(terminal)
+                this.doSaveState(terminal)
             }
+            // Ctrl-Shift-Alt-2
             if (e.which === 50 && e.ctrlKey && e.shiftKey && e.altKey) {
-                this.doLoadInput(terminal)
+                this.doLoadState(terminal)
             }
+            // Ctrl-Shift-Alt-3
             if (e.which === 51 && e.ctrlKey && e.shiftKey && e.altKey) {
-                this.doCopyOutput(terminal)
+                this.doCopyState(terminal)
             }
+            // Ctrl-Shift-Alt-4
             if (e.which === 52 && e.ctrlKey && e.shiftKey && e.altKey) {
+                this.doPasteState(terminal)
+            }
+            // Ctrl-Shift-Alt-5
+            if (e.which === 53 && e.ctrlKey && e.shiftKey && e.altKey) {
+                this.doSaveOutput(sessionOutputBuffer)
+            }
+            // Ctrl-Shift-Alt-6
+            if (e.which === 54 && e.ctrlKey && e.shiftKey && e.altKey) {
+                this.doLoadOutput(terminal)
+            }
+            // Ctrl-Shift-Alt-7
+            if (e.which === 55 && e.ctrlKey && e.shiftKey && e.altKey) {
+                this.doCopyOutput(sessionOutputBuffer)
+            }
+            // Ctrl-Shift-Alt-8
+            if (e.which === 56 && e.ctrlKey && e.shiftKey && e.altKey) {
                 this.doPasteOutput(terminal)
             }
         })
     }
 
-    async doSaveOutput (terminal: TerminalTabComponent) {
+    async loadFile (): Promise<string|null> {
+        const result = await this.electron.dialog.showOpenDialog(
+            this.hostApp.getWindow(),
+            {
+                buttonLabel: 'Load',
+                properties: ['openFile', 'treatPackageAsDirectory'],
+            },
+        )
+        if (result.filePaths.length) {
+            return fs.readFileSync(result.filePaths[0], { encoding: 'utf-8' })
+        }
+        return null
+    }
+
+    async saveFile (content: string, name: string) {
         const result = await this.electron.dialog.showSaveDialog(
             this.hostApp.getWindow(),
             {
-                defaultPath: 'output.txt',
+                defaultPath: name,
             },
         )
         if (result.filePath) {
-            fs.writeFileSync(result.filePath, terminal.frontend.saveState())
+            fs.writeFileSync(result.filePath, content)
         }
     }
 
-    async doCopyOutput (terminal: TerminalTabComponent) {
+    doSaveState (terminal: TerminalTabComponent) {
+        this.saveFile(terminal.frontend.saveState(), 'state.txt')
+    }
+
+    async doCopyState (terminal: TerminalTabComponent) {
         const data = '```' + JSON.stringify(terminal.frontend.saveState()) + '```'
         this.electron.clipboard.writeText(data)
     }
 
-    async doLoadInput (terminal: TerminalTabComponent) {
-        const result = await this.electron.dialog.showOpenDialog(
-            this.hostApp.getWindow(),
-            {
-                buttonLabel: 'Load',
-                properties: ['openFile', 'treatPackageAsDirectory'],
-            },
-        )
-        if (result.filePaths.length) {
-            const data = fs.readFileSync(result.filePaths[0])
-            terminal.frontend.restoreState(data)
+    async doLoadState (terminal: TerminalTabComponent) {
+        const data = await this.loadFile()
+        terminal.frontend.restoreState(data)
+    }
+
+    async doPasteState (terminal: TerminalTabComponent) {
+        let data = this.electron.clipboard.readText()
+        if (data) {
+            if (data.startsWith('`')) {
+                data = data.substring(3, data.length - 3)
+            }
+            terminal.frontend.restoreState(JSON.parse(data))
+        }
+    }
+
+    doSaveOutput (buffer: string) {
+        this.saveFile(buffer, 'output.txt')
+    }
+
+    async doCopyOutput (buffer: string) {
+        const data = '```' + JSON.stringify(buffer) + '```'
+        this.electron.clipboard.writeText(data)
+    }
+
+    async doLoadOutput (terminal: TerminalTabComponent) {
+        const data = await this.loadFile()
+        if (data) {
+            terminal.frontend.write(data)
         }
     }
 
     async doPasteOutput (terminal: TerminalTabComponent) {
-        const data = JSON.parse(this.electron.clipboard.readText())
-        terminal.frontend.restoreState(data)
+        let data = this.electron.clipboard.readText()
+        if (data) {
+            if (data.startsWith('`')) {
+                data = data.substring(3, data.length - 3)
+            }
+            terminal.frontend.write(JSON.parse(data))
+        }
     }
 }