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

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

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

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

Я пытался использовать этот инструмент (который нельзя легко изменить) с 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".

  1. Запустить пакетный файл из устаревшего инструмента (его можно свернуть при запуске)
  2. Измените заголовок командного окна на что-то известное Notepad++ и уникальное (вероятно, подойдет имя файла), чтобы его можно было завершить позже.
  3. Запустите Notepad++ из пакетного файла, указав файл в качестве аргумента командной строки.
  4. Автоматически регистрировать функцию Python в качестве обратного вызова для уведомления FILEBEFORECLOSE при запуске
  5. При закрытии файла используйте его имя для восстановления заголовка окна командной строки и используйте его для его закрытия.

Это успешно приводит к закрытию командного окна, но затем 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])

Связанный контент