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

2

Algumas ferramentas antigas são projetadas para trabalhar com um editor de texto externo. Estou preso usando 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 incluindo o caminho para o arquivo temporário como um argumento.
  3. Aguarde o encerramento do aplicativo (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.

Eu tenho tentado usar essa ferramenta (que não pode ser facilmente alterada) com o Notepad ++. Eu tive alguns problemas com isso porque a ferramenta monitora apenas o arquivo temporário até que o aplicativo lançado fecha. 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 resulta na ferramenta pensando que o editor foi fechado imediatamente e, em seguida, faltando quaisquer edições que realmente ocorrem.

Eu sou capaz de contornar isso, forçando o Notepad ++ para sempre iniciar em uma nova instância usando o argumento de linha de comando -multiInst. Eu gostaria de ser capaz de abrir os arquivos temporários como abas, como também estou usando alguns plugins do Notepad ++ que funcionam através de abas (mas não entre 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 processo por modelo de guia que o Chrome usa. Eu também considerei lançar o Notepad ++ indiretamente através de um arquivo em lote ou similar, mas eu não sei como eu poderia detectar quando a aba / arquivo foi fechado no Notepad ++.

    
por Owen 04.12.2015 / 17:04

2 respostas

1

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

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

  • Não mantenha as alças de arquivos abertas.
  • Tenha controles de guias 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 de 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 do seu aplicativo legado, e quando você fez o seu trabalho, você deixa a instância da linha de comando ir ...

    
por 04.12.2015 / 19:16
0

Eu acho que criei uma solução de prova de conceito, mas é um pouco complicado e (atualmente) provoca uma falha no Notepad ++, então provavelmente ainda não é viável. Eu pensei que eu iria postar de qualquer maneira, como outros podem estar olhando para resolver problemas semelhantes.

O plugin beta O Notepad ++ Python Script adiciona suporte a scripts no Notepad ++, incluindo a conexão com as notificações existentes do Notepad ++. O plug-in inclui um script de inicialização que é sempre executado, desde que "ATSTARTUP" esteja selecionado nas opções de configuração do plug-in.

  1. Iniciar um arquivo de lote da ferramenta legada (pode ser minimizado na inicialização)
  2. Altere o título das janelas de comando para algo conhecido pelo Notepad ++ e exclusivo (provavelmente, o nome do arquivo) para que possa ser eliminado posteriormente
  3. Inicie o Notepad ++ a partir do arquivo em lote com o arquivo como um argumento de linha de comando
  4. Registra 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 ++ é bloqueado. Eu acho que isso é um problema com o plugin python. Parece que chamar o console.run () de um retorno de chamada de notificação causa problemas. Eu sei que o comando é bem formatado porque funciona sem uma falha quando executado a partir de um script acionado pelo usuário. Esse script é executado toda vez que um arquivo é fechado e faz com que o Notepad ++ seja interrompido, por isso não recomendo que você use essa 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])
    
por 06.12.2015 / 18:41