![Открыть файл в Notepad++ как вкладку, не закрывая запущенный процесс](https://rvso.com/image/1475794/%D0%9E%D1%82%D0%BA%D1%80%D1%8B%D1%82%D1%8C%20%D1%84%D0%B0%D0%B9%D0%BB%20%D0%B2%20Notepad%2B%2B%20%D0%BA%D0%B0%D0%BA%20%D0%B2%D0%BA%D0%BB%D0%B0%D0%B4%D0%BA%D1%83%2C%20%D0%BD%D0%B5%20%D0%B7%D0%B0%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8F%20%D0%B7%D0%B0%D0%BF%D1%83%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81.png)
Некоторые старые инструменты предназначены для работы с внешним текстовым редактором. Я застрял с использованием устаревшего инструмента, который делает это следующим образом:
- Создайте временный файл с содержимым, которое необходимо отредактировать.
- Запустите указанное пользователем приложение, добавив в качестве аргумента путь к временному файлу.
- Дождитесь закрытия запущенного приложения (вероятно, отслеживает PID)
- Проверьте, был ли обновлен временный файл, используя поле «Дата изменения», и загрузите обновленные данные.
Я пытался использовать этот инструмент (который нельзя легко изменить) с Notepad++. У меня возникли некоторые проблемы с этим, потому что инструмент отслеживает только временный файл, пока запущенное им приложение не закроется. Когда запускается новый экземпляр процесса Notepad++, поведение по умолчанию заключается в открытии файла в любом уже открытом экземпляре Notepad++ как вкладки и закрытии нового процесса. Это приводит к тому, что инструмент думает, что редактор был немедленно закрыт, и затем пропускает любые изменения, которые на самом деле происходят.
Я могу обойти это, заставив Notepad++ всегда запускаться в новом экземпляре с помощью аргумента командной строки -multiInst. Я хотел бы иметь возможность открывать временные файлы как вкладки, так как я также использую некоторые плагины Notepad++, которые работают между вкладками (но не между экземплярами).
Есть ли у кого-нибудь идеи решения? Было бы здорово, если бы я мог заставить Notepad++ открывать файл как вкладку, но при этом иметь запущенный процесс в памяти, пока файл открыт. Я думаю, это было бы похоже на модель «один процесс на вкладку», которую использует Chrome. Я также рассматривал возможность запуска Notepad++ косвенно через пакетный файл или что-то подобное, но я не знаю, как я могу определить, когда вкладка/файл были закрыты в Notepad++.
решение1
Вам необходимо предоставить PID отдельного процесса вашему устаревшему приложению для периода редактирования файла.
К сожалению, все известные мне простые способы определения конца редактирования файла не работают - Notepad++:
- Не оставляйте дескрипторы файлов открытыми.
- Иметь настраиваемые элементы управления вкладками.
- Не сохранять список последних файлов в реестре.
Поэтому без написания плагина npp, который обрабатывает уведомление NPPN_FILECLOSED, я не вижу другого решения, кроме как запустить Notepad++ следующим образом run_npp_cmd
:
@echo off
start C:\your\path\to\notepad++.exe %1
echo Do your work and then let me go
pause
Вы можете вызвать его run_npp_cmd C:\path\to\your\data.txt
из своего устаревшего приложения, а когда закончите работу, отпустите экземпляр командной строки...
решение2
Я думаю, что придумал решение для проверки концепции, но оно немного запутанное и (в настоящее время) вызывает сбой в Notepad++, так что, вероятно, пока нежизнеспособно. Я подумал, что все равно опубликую его, так как другие, возможно, ищут решение похожих проблем.
Бета-плагинСкрипт Python для Notepad++добавляет поддержку скриптов в Notepad++, включая подключение к существующим уведомлениям Notepad++. Плагин включает в себя скрипт запуска, который всегда выполняется, пока в параметрах конфигурации плагина выбрано "ATSTARTUP".
- Запустить пакетный файл из устаревшего инструмента (его можно свернуть при запуске)
- Измените заголовок командного окна на что-то известное Notepad++ и уникальное (вероятно, подойдет имя файла), чтобы его можно было завершить позже.
- Запустите Notepad++ из пакетного файла, указав файл в качестве аргумента командной строки.
- Автоматически регистрировать функцию Python в качестве обратного вызова для уведомления FILEBEFORECLOSE при запуске
- При закрытии файла используйте его имя для восстановления заголовка окна командной строки и используйте его для его закрытия.
Это успешно приводит к закрытию командного окна, но затем Notepad++ блокируется. Я думаю, что это проблема с плагином python. Похоже, что вызов console.run() из обратного вызова уведомления вызывает проблемы. Я знаю, что команда хорошо отформатирована, потому что она работает без сбоев при запуске из скрипта, запущенного пользователем.Этот скрипт запускается каждый раз при закрытии файла и приводит к зависанию Notepad++, поэтому я не рекомендую вам использовать это решение в его текущем состоянии.
Команда для запуска из устаревшего инструмента:
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
Добавлено в 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])