web-dev-qa-db-ja.com

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

一部の古いツールは、外部のテキストエディタで動作するように設計されています。私はこれを次のように行うレガシーツールを使用して立ち往生しています:

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

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

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

誰かが解決策のアイデアを持っていますか? Notepad ++でファイルをタブとして開くことができても、ファイルが開いている間は起動されたプロセスをメモリに保持できれば素晴らしいと思います。これは、タブモデルごとに1つのプロセスに似ていると思いますChrome使用します。バッチファイルなどを介して間接的にNotepad ++を起動することも検討しましたが、いつ検出できるかわかりません。タブ/ファイルはNotepad ++で閉じられました。

2
Owen

ファイルエディションのスパンについては、レガシーアプリケーションに別のプロセスのPIDを提供する必要があります。

残念ながら、私が知っているファイルエディションの終わりを検出するすべての簡単な方法は機能しません-Notepad ++:

  • ファイルハンドルを開いたままにしないでください。
  • カスタム描画されたタブコントロールがあります。
  • 最近のファイルリストをレジストリに保存しないでください。

したがって、NPPN_FILECLOSED通知を処理するnppプラグインを記述せずに、run_npp_cmdの下でNotepad ++を起動する以外の解決策は見当たりません。

@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を呼び出すことができ、作業が完了したら、コマンドラインインスタンスを解放します...

1
g2mk

概念実証ソリューションを思いついたと思いますが、それは少し複雑で、(現在)Notepad ++でクラッシュを引き起こすため、おそらくまだ実行可能ではありません。他の人が同様の問題の解決を検討しているかもしれないので、とにかくそれを投稿すると思いました。

ベータプラグイン Notepad ++ Python Script は、既存の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])
0
Owen