2

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

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

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

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

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

2 ответа2

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 из своего унаследованного приложения, а когда вы выполнили свою работу, вы позволили запускать экземпляр командной строки ...

0

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

Бета-плагин Notepad++ Python Script добавляет поддержку сценариев в 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])

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .