시작된 프로세스를 닫지 않고 Notepad++에서 탭으로 파일 열기

시작된 프로세스를 닫지 않고 Notepad++에서 탭으로 파일 열기

일부 오래된 도구는 외부 텍스트 편집기에서 작동하도록 설계되었습니다. 다음과 같은 방식으로 이 작업을 수행하는 레거시 도구를 사용하여 막혔습니다.

  1. 편집할 내용이 포함된 임시 파일을 만듭니다.
  2. 임시 파일에 대한 경로를 인수로 추가하여 사용자 지정 응용 프로그램을 시작합니다.
  3. 실행된 애플리케이션이 닫힐 때까지 기다립니다(아마도 PID를 모니터링함).
  4. 수정된 날짜 필드를 사용하여 임시 파일이 업데이트되었는지 확인하고 업데이트된 데이터를 로드합니다.

저는 이 도구(쉽게 변경할 수 없음)를 Notepad++와 함께 사용하려고 노력해 왔습니다. 이 도구는 실행된 응용 프로그램이 닫힐 때까지 임시 파일만 모니터링하기 때문에 몇 가지 문제가 있었습니다. Notepad++ 프로세스의 새 인스턴스가 시작되면 기본 동작은 이미 열려 있는 Notepad++ 인스턴스에서 파일을 탭으로 열고 새 프로세스를 닫는 것입니다. 이로 인해 도구에서는 편집기가 즉시 닫혔다고 생각하고 실제로 발생하는 편집 내용이 누락됩니다.

-multiInst 명령줄 인수를 사용하여 Notepad++가 항상 새 인스턴스에서 시작되도록 하여 이 문제를 해결할 수 있습니다. 탭 전체에서 작동하지만 인스턴스 전체에서는 작동하지 않는 일부 Notepad++ 플러그인도 사용하고 있으므로 임시 파일을 탭으로 열 수 있기를 원합니다.

누구든지 해결책에 대한 아이디어를 얻었습니까? Notepad++에서 파일을 탭으로 열 수 있지만 파일이 열려 있는 동안 메모리에 프로세스가 계속 실행될 수 있다면 좋을 것입니다. 나는 이것이 Chrome이 사용하는 탭당 하나의 프로세스 모델과 유사하다고 생각합니다. 배치 파일 등을 통해 간접적으로 Notepad++를 시작하는 것도 고려했지만 Notepad++에서 탭/파일이 닫혔을 때 이를 어떻게 감지할 수 있는지 모르겠습니다.

답변1

파일 편집 범위에 대해 레거시 애플리케이션에 별도 프로세스의 PID를 제공해야 합니다.

불행하게도 내가 알고 있는 파일 편집의 끝을 감지하는 모든 쉬운 방법은 작동하지 않습니다. - Notepad++:

  • 파일 핸들을 열어두지 마십시오.
  • 사용자 정의 그려진 탭 컨트롤이 있습니다.
  • 최근 파일 목록을 레지스트리에 저장하지 마세요.

따라서 NPPN_FILECLOSED 알림을 처리하는 npp 플러그인을 작성하지 않고 아래에서 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++의 스크립팅 지원을 추가합니다. 플러그인에는 플러그인 구성 옵션에서 "ATSTARTUP"이 선택되어 있는 한 항상 실행되는 시작 스크립트가 포함되어 있습니다.

  1. 레거시 도구에서 배치 파일 실행(실행 시 최소화 가능)
  2. 나중에 종료될 수 있도록 명령 창 제목을 Notepad++에 알려진 고유한 이름(파일 이름일 것임)으로 변경합니다.
  3. 파일을 명령줄 인수로 사용하여 배치 파일에서 Notepad++를 실행합니다.
  4. 시작 시 FILEBEFORECLOSE 알림에 대한 콜백으로 Python 함수를 자동으로 등록합니다.
  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])

관련 정보