일부 오래된 도구는 외부 텍스트 편집기에서 작동하도록 설계되었습니다. 다음과 같은 방식으로 이 작업을 수행하는 레거시 도구를 사용하여 막혔습니다.
- 편집할 내용이 포함된 임시 파일을 만듭니다.
- 임시 파일에 대한 경로를 인수로 추가하여 사용자 지정 응용 프로그램을 시작합니다.
- 실행된 애플리케이션이 닫힐 때까지 기다립니다(아마도 PID를 모니터링함).
- 수정된 날짜 필드를 사용하여 임시 파일이 업데이트되었는지 확인하고 업데이트된 데이터를 로드합니다.
저는 이 도구(쉽게 변경할 수 없음)를 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"이 선택되어 있는 한 항상 실행되는 시작 스크립트가 포함되어 있습니다.
- 레거시 도구에서 배치 파일 실행(실행 시 최소화 가능)
- 나중에 종료될 수 있도록 명령 창 제목을 Notepad++에 알려진 고유한 이름(파일 이름일 것임)으로 변경합니다.
- 파일을 명령줄 인수로 사용하여 배치 파일에서 Notepad++를 실행합니다.
- 시작 시 FILEBEFORECLOSE 알림에 대한 콜백으로 Python 함수를 자동으로 등록합니다.
- 파일이 닫히면 파일 이름을 사용하여 명령 프롬프트의 창 제목을 재구성하고 이를 사용하여 종료합니다.
이로 인해 명령 창이 성공적으로 닫히지만 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])