Datei in Notepad++ als Tab öffnen, ohne den gestarteten Prozess zu schließen

Datei in Notepad++ als Tab öffnen, ohne den gestarteten Prozess zu schließen

Einige alte Tools sind für die Verwendung mit einem externen Texteditor konzipiert. Ich bin auf ein älteres Tool angewiesen, das dies folgendermaßen macht:

  1. Erstellen Sie eine temporäre Datei mit dem zu bearbeitenden Inhalt.
  2. Starten Sie die vom Benutzer angegebene Anwendung und fügen Sie den Pfad zur temporären Datei als Argument hinzu.
  3. Warten Sie, bis die gestartete Anwendung geschlossen wird (überwacht wahrscheinlich den PID)
  4. Überprüfen Sie im Feld „Änderungsdatum“, ob die temporäre Datei 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 damit einige Probleme, da das Tool die temporäre Datei nur überwacht, bis die gestartete Anwendung geschlossen wird. Wenn eine neue Instanz des Notepad++-Prozesses gestartet wird, besteht das Standardverhalten darin, die Datei in einer bereits geöffneten Instanz von Notepad++ als Registerkarte zu öffnen und den neuen Prozess zu schließen. Dies führt dazu, dass das Tool denkt, der Editor sei sofort geschlossen worden, und dann alle tatsächlich vorgenommenen Änderungen verpasst.

Ich kann dies umgehen, indem ich Notepad++ mit dem Befehlszeilenargument -multiInst dazu zwinge, immer in einer neuen Instanz zu starten. Ich möchte die temporären Dateien als Tabs öffnen können, da ich auch einige Notepad++-Plugins verwende, die tabübergreifend (aber nicht instanzübergreifend) funktionieren.

Hat jemand eine Idee für eine Lösung? Es wäre toll, wenn ich Notepad++ dazu bringen könnte, eine Datei als Tab zu öffnen, aber den gestarteten Prozess trotzdem im Speicher zu haben, während die Datei noch geöffnet ist. Ich schätze, das wäre ähnlich dem Modell mit einem Prozess pro Tab, das Chrome verwendet. Ich habe auch erwogen, Notepad++ indirekt über eine Batchdatei oder Ähnliches zu starten, aber ich weiß nicht, wie ich erkennen könnte, wann der Tab/die Datei in Notepad++ geschlossen wurde.

Antwort1

Sie müssen Ihrer Legacy-Anwendung für den Umfang der Dateibearbeitung die PID eines separaten Prozesses bereitstellen.

Leider funktionieren alle mir bekannten einfachen Möglichkeiten zum Erkennen des Dateiende-Bearbeitungsendes nicht – Notepad++:

  • Lassen Sie die Dateihandles nicht geöffnet.
  • Lassen Sie benutzerdefinierte Registerkartensteuerelemente zeichnen.
  • Die Liste der zuletzt verwendeten Dateien wird nicht in der Registrierung gespeichert.

Ohne das Schreiben eines NPP-Plugins, das die NPPN_FILECLOSED-Benachrichtigung verarbeitet, sehe ich keine andere Lösung, als Notepad++ wie folgt 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 von Ihrer Legacy-Anwendung aus aufrufen run_npp_cmd C:\path\to\your\data.txtund wenn Sie Ihre Arbeit erledigt haben, lassen Sie die Befehlszeilen-Instanz los ...

Antwort2

Ich glaube, ich habe eine Proof-of-Concept-Lösung gefunden, aber sie ist ein wenig kompliziert und verursacht (aktuell) einen Absturz in Notepad++, sodass sie wahrscheinlich noch nicht praktikabel ist. Ich dachte, ich poste sie trotzdem, da andere vielleicht nach einer Lösung für ähnliche Probleme suchen.

Das Beta-PluginNotepad++ Python-Skriptfügt Unterstützung für Skripting in Notepad++ hinzu, einschließlich der Einbindung 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 Legacy-Tool (sie kann beim Start minimiert werden).
  2. Ändern Sie den Titel des Befehlsfensters in einen für Notepad++ bekannten und eindeutigen Namen (der Dateiname reicht wahrscheinlich aus), damit es später beendet werden kann.
  3. Starten Sie Notepad++ aus der Batchdatei mit der Datei als Befehlszeilenargument
  4. Automatische Registrierung einer Python-Funktion als Rückruf für die FILEBEFORECLOSE-Benachrichtigung beim Start
  5. Wenn eine Datei geschlossen wird, verwenden Sie den Dateinamen, um den Fenstertitel der Eingabeaufforderung zu rekonstruieren und beenden Sie die Datei damit.

Dadurch wird das Befehlsfenster erfolgreich geschlossen, aber dann hängt sich Notepad++ auf. Ich denke, das ist ein Problem mit dem Python-Plugin. Es scheint, dass der Aufruf von console.run() aus einem Benachrichtigungs-Callback Probleme verursacht. Ich weiß, dass der Befehl gut formatiert ist, weil er ohne Absturz funktioniert, wenn er aus einem vom Benutzer ausgelösten Skript ausgeführt wird.Dieses Skript wird jedes Mal ausgeführt, wenn eine Datei geschlossen wird, und führt dazu, dass Notepad++ hängen bleibt. Daher empfehle ich nicht, diese Lösung in ihrem aktuellen Zustand zu verwenden.

Vom Legacy-Tool auszuführender Befehl:

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

Hinzugefügt zu C:\Program Files (x86)\Notepad++\plugins\PythonScript\scripts\startup.py:

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])

verwandte Informationen