![Abra o arquivo no Notepad++ como uma guia sem fechar o processo iniciado](https://rvso.com/image/1475794/Abra%20o%20arquivo%20no%20Notepad%2B%2B%20como%20uma%20guia%20sem%20fechar%20o%20processo%20iniciado.png)
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:
- Crie um arquivo temporário com o conteúdo a ser editado.
- Inicie o aplicativo especificado pelo usuário adicionando o caminho do arquivo temporário como argumento.
- Aguarde o fechamento do aplicativo iniciado (provavelmente monitora o PID)
- 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.txt
de 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.
- Inicie um arquivo em lote da ferramenta legada (ele pode ser minimizado na inicialização)
- 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
- Inicie o Notepad++ a partir do arquivo em lote com o arquivo como argumento de linha de comando
- Registre automaticamente uma função python como um retorno de chamada na notificação FILEBEFORECLOSE na inicialização
- 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])