起動したプロセスを閉じずに、Notepad++ でファイルをタブとして開く

起動したプロセスを閉じずに、Notepad++ でファイルをタブとして開く

古いツールの中には、外部のテキスト エディターで動作するように設計されているものもあります。私は、次のようにしてこれを実行する従来のツールを使用しています。

  1. 編集するコンテンツを含む一時ファイルを作成します。
  2. 一時ファイルへのパスを引数として追加して、ユーザーが指定したアプリケーションを起動します。
  3. 起動したアプリケーションが終了するまで待ちます(おそらくPIDを監視します)
  4. 「変更日」フィールドを使用して一時ファイルが更新されたかどうかを確認し、更新されたデータをロードします。

私は、このツール (簡単に変更できない) を Notepad++ で使用しようとしています。ツールは、起動したアプリケーションが終了するまで一時ファイルのみを監視するため、問題が発生しました。Notepad++ プロセスの新しいインスタンスが起動されると、デフォルトの動作では、既に開いている Notepad++ インスタンスでファイルをタブとして開き、新しいプロセスを閉じます。その結果、ツールはエディターがすぐに閉じられたと認識し、実際に行われた編集が失われます。

-multiInst コマンドライン引数を使用して、Notepad++ を常に新しいインスタンスで起動するように強制することで、この問題を回避できます。タブ間で動作する (インスタンス間では動作しない) Notepad++ プラグインもいくつか使用しているため、一時ファイルをタブとして開くことができるようにしたいと思います。

解決策のアイデアをお持ちの方はいらっしゃいますか? Notepad++ でファイルをタブとして開き、ファイルが開いている間は起動したプロセスをメモリ内に保持できればすばらしいと思います。これは、Chrome が使用するタブごとに 1 つのプロセス モデルに似ていると思います。バッチ ファイルなどを使用して間接的に 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++ でクラッシュが発生するため、現時点ではおそらく実行可能ではありません。他の人も同様の問題を解決しようとしているかもしれないので、とにかく投稿しようと思いました。

ベータ版プラグイン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])

関連情報