![在 Notepad++ 中將檔案作為選項卡打開,無需關閉啟動的進程](https://rvso.com/image/1475794/%E5%9C%A8%20Notepad%2B%2B%20%E4%B8%AD%E5%B0%87%E6%AA%94%E6%A1%88%E4%BD%9C%E7%82%BA%E9%81%B8%E9%A0%85%E5%8D%A1%E6%89%93%E9%96%8B%EF%BC%8C%E7%84%A1%E9%9C%80%E9%97%9C%E9%96%89%E5%95%9F%E5%8B%95%E7%9A%84%E9%80%B2%E7%A8%8B.png)
一些舊工具被設計為與外部文字編輯器一起使用。我一直在使用舊版工具,該工具透過以下方式執行此操作:
- 建立一個臨時文件,其中包含要編輯的內容。
- 啟動使用者指定的應用程序,並新增臨時檔案的路徑作為參數。
- 等待啟動的應用程式關閉(可能監視PID)
- 使用「修改日期」欄位檢查臨時檔案是否已更新,並載入更新的資料。
我一直在嘗試將這個工具(不能輕易更改)與 Notepad++ 一起使用。我遇到了一些問題,因為該工具僅監視臨時文件,直到它啟動的應用程式關閉為止。當啟動 Notepad++ 進程的新實例時,預設行為是在任何已開啟的 Notepad++ 實例中將檔案作為選項卡打開,然後關閉新進程。這會導致工具認為編輯器已立即關閉,然後錯過任何實際發生的編輯。
我可以透過使用 -multiInst 命令列參數強制 Notepad++ 始終在新實例中啟動來解決此問題。我希望能夠將臨時檔案作為選項卡打開,因為我還使用一些跨選項卡(但不能跨實例)工作的 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++ 通知。該插件包含一個啟動腳本,只要在插件的配置選項中選擇“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])