Abra o arquivo no Notepad++ como uma guia sem fechar o processo iniciado

Abra o arquivo no Notepad++ como uma guia sem fechar o processo iniciado

Algumas ferramentas antigas foram projetadas para funcionar com um editor de texto externo. Estou preso ao usar uma ferramenta legada que faz isso da seguinte maneira:

  1. Crie um arquivo temporário com o conteúdo a ser editado.
  2. Inicie o aplicativo especificado pelo usuário adicionando o caminho do arquivo temporário como argumento.
  3. Aguarde o fechamento do aplicativo iniciado (provavelmente monitora o PID)
  4. Verifique se o arquivo temporário foi atualizado usando o campo Data de modificação e carregue os dados atualizados.

Tenho tentado usar esta ferramenta (que não pode ser facilmente alterada) com o Notepad++. Tive alguns problemas com isso porque a ferramenta monitora apenas o arquivo temporário até que o aplicativo iniciado seja fechado. Quando uma nova instância do processo Notepad++ é iniciada, o comportamento padrão é abrir o arquivo em qualquer instância já aberta do Notepad++ como uma guia e fechar o novo processo. Isso faz com que a ferramenta pense que o editor foi fechado imediatamente e, em seguida, perca todas as edições que realmente ocorreram.

Consigo contornar isso forçando o Notepad++ a sempre iniciar em uma nova instância usando o argumento de linha de comando -multiInst. Gostaria de poder abrir os arquivos temporários como guias, pois também estou usando alguns plug-ins do Notepad++ que funcionam em guias (mas não em instâncias).

Alguém tem alguma idéia de uma solução? Seria ótimo se eu conseguisse que o Notepad++ abrisse um arquivo como uma guia, mas ainda tivesse o processo iniciado na memória enquanto o arquivo ainda estivesse aberto. Acho que isso seria semelhante ao modelo de processo por guia que o Chrome usa. Também considerei iniciar o Notepad++ indiretamente por meio de um arquivo em lote ou similar, mas não sei como detectar quando a guia/arquivo foi fechada no Notepad++.

Responder1

Você deve fornecer o PID de um processo separado para seu aplicativo legado para a edição do arquivo.

Infelizmente, todas as maneiras fáceis de detectar a edição do final do arquivo que conheço não funcionam - Notepad ++:

  • Não mantenha os identificadores de arquivo abertos.
  • Tenha controles de guias desenhados personalizados.
  • Não salve a lista de arquivos recentes no registro.

Portanto, sem escrever o plugin npp - que lida com a notificação NPPN_FILECLOSED - não vejo outra solução além de iniciar o Notepad ++ abaixo run_npp_cmd:

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

Você pode chamar run_npp_cmd C:\path\to\your\data.txtde seu aplicativo legado e, quando terminar seu trabalho, deixará a instância da linha de comando ir...

Responder2

Acho que encontrei uma solução de prova de conceito, mas é um pouco complicada e (atualmente) causa uma falha no Notepad++, então provavelmente ainda não é viável. Pensei em publicá-lo de qualquer maneira, pois outras pessoas poderiam estar tentando resolver problemas semelhantes.

O plug-in betaScript Python do Bloco de Notas++adiciona suporte para scripts no Notepad++, incluindo conexão com notificações existentes do Notepad++. O plugin inclui um script de inicialização que é sempre executado enquanto "ATSTARTUP" estiver selecionado nas opções de configuração do plugin.

  1. Inicie um arquivo em lote da ferramenta legada (ele pode ser minimizado na inicialização)
  2. Altere o título da janela de comando para algo conhecido pelo Notepad ++ e exclusivo (o nome do arquivo provavelmente servirá) para que possa ser eliminado mais tarde
  3. Inicie o Notepad++ a partir do arquivo em lote com o arquivo como argumento de linha de comando
  4. Registre automaticamente uma função python como um retorno de chamada na notificação FILEBEFORECLOSE na inicialização
  5. Quando um arquivo é fechado, use o nome do arquivo para reconstruir o título da janela do prompt de comando e use-o para eliminá-lo.

Isso faz com que a janela de comando feche, mas o Notepad ++ trava. Acho que isso é um problema com o plugin python. Parece que chamar console.run() de um retorno de chamada de notificação causa problemas. Eu sei que o comando está bem formatado porque funciona sem travar quando executado a partir de um script acionado pelo usuário.Este script é executado sempre que um arquivo é fechado e faz com que o Notepad++ trave, então não recomendo que você use esta solução em seu estado atual

Comando para executar a partir da ferramenta legada:

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

Adicionado a C:\Arquivos de Programas (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])

informação relacionada