Abra el archivo en Notepad++ como una pestaña sin cerrar el proceso iniciado

Abra el archivo en Notepad++ como una pestaña sin cerrar el proceso iniciado

Algunas herramientas antiguas están diseñadas para funcionar con un editor de texto externo. Estoy atascado usando una herramienta heredada que hace esto de la siguiente manera:

  1. Crea un archivo temporal con el contenido a editar.
  2. Inicie la aplicación especificada por el usuario agregando la ruta al archivo temporal como argumento.
  3. Espere a que se cierre la aplicación iniciada (probablemente monitorea el PID)
  4. Verifique si el archivo temporal se ha actualizado usando el campo Fecha de modificación y cargue los datos actualizados.

He estado intentando utilizar esta herramienta (que no se puede cambiar fácilmente) con Notepad++. He tenido algunos problemas con esto porque la herramienta solo monitorea el archivo temporal hasta que se cierra la aplicación que inició. Cuando se inicia una nueva instancia del proceso Notepad++, el comportamiento predeterminado es abrir el archivo en cualquier instancia ya abierta de Notepad++ como una pestaña y cerrar el nuevo proceso. Esto hace que la herramienta piense que el editor se cerró inmediatamente y luego pierda cualquier edición que realmente se realice.

Puedo solucionar este problema obligando a Notepad++ a iniciarse siempre en una nueva instancia usando el argumento de línea de comando -multiInst. Me gustaría poder abrir los archivos temporales como pestañas, ya que también estoy usando algunos complementos de Notepad++ que funcionan en pestañas (pero no en instancias).

¿Alguien tiene alguna idea de una solución? Sería fantástico si pudiera hacer que Notepad++ abra un archivo como una pestaña pero aún tenga el proceso iniciado en la memoria mientras el archivo aún está abierto. Supongo que esto sería similar al modelo de un proceso por pestaña que utiliza Chrome. También he considerado iniciar Notepad++ indirectamente a través de un archivo por lotes o similar, pero no sé cómo podría detectar cuándo se cerró la pestaña/archivo en Notepad++.

Respuesta1

Debe proporcionar el PID de un proceso separado a su aplicación heredada para la edición del archivo.

Lamentablemente, todas las formas sencillas de detectar el final de la edición del archivo que conozco no funcionan: Notepad++:

  • No mantenga abiertos los identificadores de archivos.
  • Tener controles de pestañas dibujados personalizados.
  • No guarde la lista de archivos recientes en el registro.

Entonces, sin escribir el complemento npp, que maneja la notificación NPPN_FILECLOSED, no veo otra solución que iniciar Notepad++ a continuación run_npp_cmd:

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

Puede llamar run_npp_cmd C:\path\to\your\data.txtdesde su aplicación heredada y, cuando haya terminado su trabajo, deje ir la instancia de la línea de comandos...

Respuesta2

Creo que se me ocurrió una solución de prueba de concepto, pero es un poco complicada y (actualmente) provoca un bloqueo en Notepad++, por lo que probablemente no sea viable todavía. Pensé en publicarlo de todos modos, ya que otros podrían estar buscando resolver problemas similares.

El complemento betaBloc de notas ++ secuencia de comandos Pythonagrega soporte para secuencias de comandos en Notepad++, incluida la conexión a notificaciones existentes de Notepad++. El complemento incluye un script de inicio que siempre se ejecuta siempre que se seleccione "ATSTARTUP" en las opciones de configuración del complemento.

  1. Inicie un archivo por lotes desde la herramienta heredada (se puede minimizar en el inicio)
  2. Cambie el título de la ventana de comandos a algo conocido por Notepad++ y único (el nombre del archivo probablemente sea suficiente) para poder eliminarlo más adelante.
  3. Inicie Notepad++ desde el archivo por lotes con el archivo como argumento de línea de comando
  4. Registre automáticamente una función de Python como una devolución de llamada en la notificación FILEBEFORECLOSE al inicio
  5. Cuando se cierra un archivo, use el nombre del archivo para reconstruir el título de la ventana del símbolo del sistema y utilícelo para eliminarlo.

Esto hace que la ventana de comandos se cierre con éxito, pero luego Notepad++ se bloquea. Creo que esto es un problema con el complemento de Python. Parece que llamar a console.run() desde una devolución de llamada de notificación causa problemas. Sé que el comando está bien formateado porque funciona sin fallas cuando se ejecuta desde un script activado por el usuario.Este script se ejecuta cada vez que se cierra un archivo y hace que Notepad++ se cuelgue, por lo que no recomiendo que uses esta solución en su estado actual.

Comando para ejecutar desde la herramienta heredada:

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

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

información relacionada