Открыть файл в Notepad ++ как вкладку, не закрывая запущенный процесс

1041
Owen

Некоторые старые инструменты предназначены для работы с внешним текстовым редактором. Я застрял, используя устаревший инструмент, который делает это следующим образом:

  1. Создайте временный файл с содержимым для редактирования.
  2. Запустите указанное пользователем приложение, добавив путь к временному файлу в качестве аргумента.
  3. Дождитесь закрытия запущенного приложения (возможно, отслеживает PID)
  4. Проверьте, обновлен ли временный файл, используя поле «Дата изменения», и загрузите обновленные данные.

Я пытался использовать этот инструмент (который не может быть легко изменен) с Notepad ++. У меня были некоторые проблемы с этим, потому что инструмент только контролирует временный файл, пока приложение, которое это запустило, не закрывается. При запуске нового экземпляра процесса Notepad ++ по умолчанию открывается файл в любом уже открытом экземпляре Notepad ++ в виде вкладки и закрывается новый процесс. Это приводит к тому, что инструмент думает, что редактор был немедленно закрыт, а затем пропускает любые изменения, которые действительно имеют место.

Я могу обойти это, заставляя Notepad ++ всегда запускаться в новом экземпляре, используя аргумент командной строки -multiInst. Я хотел бы иметь возможность открывать временные файлы в виде вкладок, так как я также использую некоторые плагины Notepad ++, которые работают на вкладках (но не на всех экземплярах).

У кого-нибудь есть идеи решения? Было бы здорово, если бы я мог заставить Notepad ++ открывать файл в виде вкладки, но при этом иметь запущенный процесс в памяти, пока файл еще открыт. Я думаю, это будет похоже на один процесс на модель вкладки, который использует Chrome. Я также рассмотрел возможность запуска Notepad ++ косвенно через командный файл или аналогичный файл, но я не знаю, как определить, когда вкладка / файл был закрыт в Notepad ++.

2

2 ответа на вопрос

1
g2mk

You have to provide PID of a separate process to your legacy application for span of file edition.

Unfortunately all easy ways to detect end of file edition I'm aware off don't work - Notepad++:

  • Don't keep file handles opened.
  • Have custom drawn tab controls.
  • Don't save recent files list in registry.

So without writing npp plugin - which handle NPPN_FILECLOSED notification - I don't see solution other than starting Notepad++ by below run_npp_cmd:

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

You can call run_npp_cmd C:\path\to\your\data.txt from your legacy application, and when you done your work you let commandline instance go...

Спасибо за ответ, но, честно говоря, я надеюсь, что есть более точное решение. Было бы довольно легко ошибиться с таким подходом. Командная строка может быть закрыта до закрытия вкладки, или вкладка может быть закрыта, а командная строка оставлена ​​открытой. Owen 8 лет назад 0
@ Оуэн Есть два способа решить вашу проблему. Первое: вы можете изменить PID Notepad ++, как только закончите редактирование файла - к сожалению, насколько я знаю, изменение PID процесса невозможно в Windows. Во-вторых: вы должны предоставить PID отдельного процесса в ваше старое приложение для редактирования файлов - я просто предоставлю вам IMO самый простой способ сделать это. Как и после вашего комментария у меня сложилось впечатление, что вы хотите рыбу, а не научиться ловить рыбу, я просто говорю вам, что вы всегда можете расширить мое решение для ваших нужд: P g2mk 8 лет назад 0
Я ценю вашу помощь в попытке ответить на мой вопрос, но в конце своей первоначальной публикации я заявил, что уже рассматривал возможность косвенного запуска через пакетный файл. Все, на что я надеялся, это любые идеи или предложения, помимо того, что я уже упоминал. Owen 8 лет назад 0
@ Оуэн, ты меня достал - прости. К сожалению, все простые способы, которые я знаю, не работают - Notepad ++ не держит файловые дескрипторы открытыми, имеет настраиваемые элементы управления вкладками, не сохраняет список последних файлов в реестре. Я не вижу решения, кроме написания npp плагина, который обрабатывает уведомление NPPN_FILECLOSED ... Извините еще раз. g2mk 8 лет назад 0
Размещено частичное решение в виде самостоятельного ответа с использованием уведомлений. Спасибо за предложение. Owen 8 лет назад 0
0
Owen

I think I have come up with a proof of concept solution, but it is a little convoluted and (currently) causes a crash in Notepad++ so it probably isn't viable just yet. I thought I would post it anyway as others might be looking at solving similar problems.

The beta plugin Notepad++ Python Script adds supports for scripting in Notepad++ including hooking into existing Notepad++ notifications. The plugin includes a startup script that is always run as long as "ATSTARTUP" is selected in the plugin's configuration options.

  1. Launch a batch file from the legacy tool (it can be minimized at launch)
  2. Change command windows title to something known by Notepad++ and unique (the file name will probably do) so that it can be killed later on
  3. Launch Notepad++ from the batch file with the file as a command line argument
  4. Automatically register a python function as a callback on the FILEBEFORECLOSE notification at startup
  5. When a file is closed use the filename to reconstruct the window title of the command prompt and use that to kill it.

This successfully causes the command window to close but then Notepad++ locks up. I think this is an issue with the python plugin. It seems that calling console.run() from a notification callback causes problems. I know the command is well formated because it works without a crash when run from a user triggered script. This script runs every time a file is closed and it causes Notepad++ to hang so I don't recommend you use this solution in its current state

Command to run from legacy tool:

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 

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

Похожие вопросы