Öffnen Sie die Datei in Notepad ++ als Registerkarte, ohne den gestarteten Prozess zu schließen

1120
Owen

Einige alte Tools sind für die Arbeit mit einem externen Texteditor konzipiert. Ich verwende ein altes Werkzeug, das dies auf folgende Weise tut:

  1. Erstellen Sie eine temporäre Datei mit dem zu bearbeitenden Inhalt.
  2. Starten Sie die vom Benutzer angegebene Anwendung, und fügen Sie der temporären Datei den Pfad als Argument hinzu.
  3. Warten Sie, bis die gestartete Anwendung geschlossen wird (überwacht wahrscheinlich die PID)
  4. Prüfen Sie, ob die temporäre Datei mit dem Feld "Datumsänderung" aktualisiert wurde, und laden Sie die aktualisierten Daten.

Ich habe versucht, dieses Tool (das nicht einfach geändert werden kann) mit Notepad ++ zu verwenden. Ich hatte einige Probleme damit, da das Tool nur die temporäre Datei überwacht, bis die von ihm gestartete Anwendung geschlossen wird. Wenn eine neue Instanz des Notepad ++ - Prozesses gestartet wird, wird standardmäßig die Datei in einer bereits geöffneten Notepad ++ - Instanz als Registerkarte geöffnet und der neue Prozess geschlossen. Dies führt dazu, dass das Tool denkt, dass der Editor sofort geschlossen wurde, und dass dann alle tatsächlich vorgenommenen Änderungen fehlen.

Ich bin in der Lage, dies zu umgehen, indem ich Notepad ++ zwinge, immer in einer neuen Instanz mit dem Befehlszeilenargument -multiInst zu starten. Ich möchte in der Lage sein, die temporären Dateien als Registerkarten zu öffnen, da ich auch einige Notepad ++ - Plugins verwende, die über Registerkarten hinweg funktionieren (jedoch nicht zwischen Instanzen).

Hat jemand irgendwelche Ideen für eine Lösung? Es wäre großartig, wenn ich Notepad ++ dazu bringen könnte, eine Datei als Registerkarte zu öffnen, aber der gestartete Prozess noch im Speicher ist, während die Datei noch geöffnet ist. Ich denke, das wäre ähnlich wie bei einem Prozess, den Chrome pro Modell verwendet. Ich habe auch überlegt, Notepad ++ indirekt über eine Batchdatei oder ähnliches zu starten, aber ich weiß nicht, wie ich erkennen konnte, wann die Registerkarte / Datei in Notepad ++ geschlossen wurde.

2

2 Antworten auf die Frage

1
g2mk

Sie müssen Ihrer älteren Anwendung die PID eines separaten Prozesses für die gesamte Dateibearbeitung zur Verfügung stellen.

Leider funktionieren alle einfachen Methoden zum Erkennen des Endes der Dateiausgabe nicht - Notepad ++:

  • Halten Sie die Datei-Handles nicht geöffnet.
  • Benutzerdefinierte Registersteuerelemente haben.
  • Speichern Sie die Liste der zuletzt verwendeten Dateien nicht in der Registrierung.

Ohne das npp-Plugin zu schreiben, das die Benachrichtigung über NPPN_FILECLOSED abwickelt, sehe ich keine andere Lösung als Notepad ++ von unten zu starten run_npp_cmd:

@echo off start C:\your\path\to\notepad++.exe %1 echo Do your work and then let me go pause 

Sie können run_npp_cmd C:\path\to\your\data.txtvon Ihrer älteren Anwendung aus anrufen, und wenn Sie Ihre Arbeit erledigt haben, lassen Sie die Befehlszeileninstanz los.

Vielen Dank für die Antwort, aber um ehrlich zu sein, hoffe ich, dass es eine bessere Lösung gibt. Mit diesem Ansatz wäre es leicht, einen Fehler zu machen. Die Eingabeaufforderung kann geschlossen werden, bevor die Registerkarte geschlossen wird, oder die Registerkarte kann geschlossen werden und die Eingabeaufforderung bleibt geöffnet. Owen vor 8 Jahren 0
@Owen Es gibt zwei Möglichkeiten, um Ihr Problem zu lösen. Erstens: Sie können eine Notepad ++ - PID ändern, sobald Sie die Bearbeitung einer Datei beendet haben - leider ist, soweit ich weiß, eine Änderung der Prozess-PID unter Windows nicht möglich. Zweitens: Sie müssen Ihrer Legacy-Anwendung die PID eines separaten Prozesses für die gesamte Dateibearbeitung zur Verfügung stellen - ich gebe Ihnen einfach die einfachste Möglichkeit, dies zu tun. Da ich nach Ihrem Kommentar den Eindruck habe, dass Sie einen Fisch wollen und nicht gelernt haben, wie man angeln kann, sage ich Ihnen nur, dass Sie meine Lösung immer auf Ihre Bedürfnisse ausdehnen können: P g2mk vor 8 Jahren 0
Ich danke Ihnen für Ihre Hilfe bei der Beantwortung meiner Frage, aber ich habe am Ende meines ursprünglichen Beitrags angegeben, dass ich bereits erwogen habe, den Start indirekt über eine Batch-Datei zu starten. Alles, worauf ich gehofft hatte, waren Ideen und Vorschläge, die über das hinausgingen, was ich bereits erwähnt hatte. Owen vor 8 Jahren 0
@Owen Du hast mich - Entschuldigung. Unglücklicherweise funktionieren alle einfachen Methoden nicht - Notepad ++ lässt die Dateizugriffstasten nicht geöffnet, verfügt über benutzerdefinierte Tab-Steuerelemente und speichert die Liste der zuletzt verwendeten Dateien nicht in der Registrierung. Ich sehe keine andere Lösung als das Schreiben eines npp-Plugins, das die NPPN_FILECLOSED-Benachrichtigung behandelt ... Entschuldigung noch einmal. g2mk vor 8 Jahren 0
Eine Teillösung als Eigenantwort mit Benachrichtigungen bereitgestellt. Danke für den Vorschlag. Owen vor 8 Jahren 0
0
Owen

Ich denke, ich habe eine Proof-of-Concept-Lösung gefunden, die jedoch etwas kompliziert ist und (derzeit) einen Absturz in Notepad ++ verursacht. Sie ist also wahrscheinlich noch nicht realisierbar. Ich dachte, ich würde es trotzdem posten, da andere vielleicht ähnliche Probleme lösen.

Das Beta-Plugin Notepad ++ Python Script fügt Unterstützung für die Skripterstellung in Notepad ++ hinzu, einschließlich des Einbaus in vorhandene Notepad ++ - Benachrichtigungen. Das Plugin enthält ein Startskript, das immer ausgeführt wird, solange in den Konfigurationsoptionen des Plugins "ATSTARTUP" ausgewählt ist.

  1. Starten Sie eine Batchdatei aus dem alten Tool (diese kann beim Start minimiert werden).
  2. Ändern Sie den Befehlsfenstertitel in etwas, das von Notepad ++ bekannt und eindeutig ist (der Dateiname wird dies wahrscheinlich tun), damit er später abgebrochen werden kann
  3. Starten Sie Notepad ++ aus der Stapeldatei mit der Datei als Befehlszeilenargument
  4. Registrieren Sie beim Start automatisch eine Python-Funktion als Rückruf in der FILEBEFORECLOSE-Benachrichtigung
  5. Wenn eine Datei geschlossen wird, verwenden Sie den Dateinamen, um den Fenstertitel der Eingabeaufforderung zu rekonstruieren, und verwenden Sie diesen, um die Datei zu beenden.

Dadurch wird das Befehlsfenster erfolgreich geschlossen, Notepad ++ wird jedoch gesperrt. Ich denke, das ist ein Problem mit dem Python-Plugin. Es scheint, dass der Aufruf von console.run () von einem Benachrichtigungsrückruf aus Probleme verursacht. Ich weiß, dass der Befehl gut formatiert ist, da er ohne Absturz ausgeführt wird, wenn er von einem vom Benutzer ausgelösten Skript ausgeführt wird. Dieses Skript wird jedes Mal ausgeführt, wenn eine Datei geschlossen wird, wodurch Notepad ++ hängen bleibt. Ich empfehle Ihnen daher nicht, diese Lösung in ihrem aktuellen Status zu verwenden

Befehl zum Ausführen des alten Tools:

start /min nppblock.bat 

notepadpp_blocker.bat:

@echo off FOR %%i IN (%1) DO ( set filename=%~nx1 ) title=nppblock_%filename% echo Waiting for %filename% to be closed in Notepad++ "C:\Program Files (x86)\Notepad++\notepad++.exe" %1 pause 

Zu C: \ Programme (x86) \ Notepad ++ \ plugins \ PythonScript \ scripts \ startup.py hinzugefügt:

import os.path def fileBeforeCloseCallback(args): filename = os.path.basename(notepad.getBufferFilename(args["bufferID"])); killcmd = 'taskkill /f /fi "WINDOWTITLE eq nppblock_' + filename + '" /im cmd.exe' console.run(killcmd)  notepad.callback(fileBeforeCloseCallback, [NOTIFICATION.FILEBEFORECLOSE])