リンクをすぐにソースに広げます:
NppGistソースとプラグイン自体: NppGist (接続するには、ファイルをNotepad ++フォルダーのpluginsフォルダーに転送します)。
メモ帳++では、プラグインは複数の言語(C ++、Ada、Delphi、.NET)で作成できますが、開発の速度と私はそれをよく知っているため、後者に決めました。
開発には次のものが使用されました。
- NppPlugin.NET-.NETプラットフォーム用のメモ帳++プラグインテンプレート。
- ServiceStack.Text -JSONのシリアライゼーションおよびデシリアライゼーション( 高性能および小型)。
- hurl.itは、GET、POST、DELETEおよびその他のリクエストをコンパイルおよびテストするための便利なオンラインツールです。
- NUnit-ユニットテスト。
Notepad ++でプラグインを書く方法を知りたい人は、catにようこそ。
プラグインの初期化
メモ帳++との相互作用は、Win32メッセージを介して発生します。 しかし、幸いなことに、すべてのメッセージ、クラス、および構造( NppPlugin.NET.v0.5 )を備えた既製のプラグインテンプレートは、すでに.NETで記述されています。 Platform tagetをデフォルトでAny CPUの代わりにx86にインストールする必要があり、また.NET 4.0を使用する必要があることに注意してください。そうしないと、プラグインは機能しません。
プラグインはCommandMenuInitおよびSetToolBarIconメソッドで初期化されます 。 最初のものは、次のようにプラグインメニューに表示されるアイテムを追加します。
PluginBase.SetCommand(OpenCommandId, "Open Gist", OpenGistCommand, new ShortcutKey(false, false, false, Keys.None));
また、特定のコマンドにキーの組み合わせを割り当てることもできます(開発されたプラグインでは使用されません)。
OpenGistCommandメソッドは開発者によって既に説明されており、その中で既に何でもできます。 このコマンドの場合-ウィンドウを開きます。
SetToolBarIconメソッドでは、プラグインコマンドでアイコンをメモ帳++ツールバーに追加できます。
toolbarIcons tbIcons = new toolbarIcons(); tbIcons.hToolbarBmp = tbLoad.GetHbitmap(); IntPtr pTbIcons = Marshal.AllocHGlobal(Marshal.SizeOf(tbIcons)); Marshal.StructureToPtr(tbIcons, pTbIcons, false); Win32.SendMessage(PluginBase.nppData._nppHandle, NppMsg.NPPM_ADDTOOLBARICON, PluginBase._funcItems.Items[OpenCommandId]._cmdID, pTbIcons); Marshal.FreeHGlobal(pTbIcons);
設定の保存と読み込み
プラグインパラメータを保存およびロードするには、次のメソッドを使用します。 行も保存できます。
saveLocally = Convert.ToBoolean(Win32.GetPrivateProfileInt("Settings", "saveLocally", 1, IniFileName)); ... Win32.WritePrivateProfileString("Settings", "SaveLocally", (Convert.ToInt32(saveLocally)).ToString(), Main.IniFileName);
メモ帳++でコマンドを実行する
実際、Notepad ++はScintillaコンポーネントを使用します。これは他のテキストエディターでも使用されます。 したがって、対話用のメッセージはメモ帳++とScintillaに分けられます。 メッセージのすべての可能なコードは、 NppPluginNETHelper.csファイルにリストされています。 Notepad ++メッセージにはNPPMプレフィックスが付いており、ファイル、メニュー、タブ、言語などの操作に関連するコマンドに使用されます。 次に、Scintillaメッセージはテキストエディターに直接関連しています(挿入、削除、ハイライト、視覚スタイル、折りたたみ、スクロールなど)。
メモ帳++イベントフック
メモ帳++でイベントメッセージをインターセプトするには、 UnmanagedExports.csファイルのbeNotifiedメソッドを使用します。 これらのメッセージには、メモ帳++イベント(ファイルを開く、閉じる、タブを切り替える)の場合はNPPN 、Scintillaイベント(テキストを変更する)の場合はSCNが先頭に付きます。 確かに、このプラグインは使用されていません。
Notepad ++コマンドの完全なリストと詳細な説明は、 Messages And Notificationsにあります。 そしてScintillaの場合: ScintillaDoc 。
Notepad ++からUTF8テキストを正しく受信する
何らかの理由で、.NETプラグインシェルでは、UTF8形式のテキストを取得することはできませんが、このエンコードは最も一般的です。 そのため、次のプロパティが追加されました。これにより、履歴を保存するために使用されるロシア語のテキストを含め、正しく読み取ることができました。
public string lpstrTextUtf8 { get { _readNativeStruct(); int len = 0; while (Marshal.ReadByte(_sciTextRange.lpstrText, len) != 0) ++len; if (len == 0) return string.Empty; byte[] buffer = new byte[len]; Marshal.Copy(_sciTextRange.lpstrText, buffer, 0, buffer.Length); return Encoding.UTF8.GetString(buffer); } }
アセンブリを構築する
Notepad ++は、pluginsフォルダーにあるすべての.dllファイルからプラグインをロードします。 さらに、dllからプラグインをロードできなかった場合、次の内容のメッセージが表示されます。プラグインは、現在のバージョンのNotepad ++と互換性がありません 。 したがって、プラグイン自体とともにその依存関係(この場合はJSON)をこのフォルダーにコピーすると、これはあまり正しくありません。 もちろん、フォルダーを使用することもできますが、よりエレガントなソリューション、つまり、すべての依存関係をプラグインアセンブリ自体と組み合わせることを使用しました。 さらに、1つのファイルを配布してコピーする方が便利です。
そのため、プラグインが1つのdllのみを使用するように、サードパーティアセンブリはEmbedded Resourceとしてマークされ、次のように動的に接続されます。
static Main() { AppDomain.CurrentDomain.AssemblyResolve += ResolveEventHandler; } private static Assembly ResolveEventHandler(object sender, ResolveEventArgs args) { string resource = string.Format("{0}.{1}.dll", PluginName, args.Name.Remove(args.Name.IndexOf(','))); Assembly currentAssembly = Assembly.GetExecutingAssembly(); using (Stream stream = currentAssembly.GetManifestResourceStream(resource)) { var bytes = new byte[(int)stream.Length]; stream.Read(bytes, 0, (int)stream.Length); return Assembly.Load(bytes); } }
これがどのように行われるかについての詳細は、CodeProject記事: Load DLL From Embedded Resourceをご覧ください。
もちろん、サードパーティのプログラムを使用してアセンブリを1つに結合することもできます( ILmergeなど)が、各ビルド後に適用する必要があります。
ServiceStack.TextはNuGetアセンブリであり、リポジトリの複製後の最初のビルド中に読み込まれるため、Prebuildイベントを使用してNppGistプロジェクトのルートフォルダーにコピーすることに注意してください。
Github API
GitHub Apiとの対話の実装には、サイトで取得できるAccessTokenを使用することに言及する価値がない限り、興味深いことはありません。 開発したプラグインの匿名履歴はサポートされていません。 使用されるAPIメソッドの完全なリストは、 github gists apiにリストされています。
おわりに
ヒストグラム保存ウィンドウは次のようになります(開始ウィンドウは似ています)。
ただし、最初にアクセストークンを入力する必要があります。
私の記事の後に、Notepad ++のプラグインを誰でも簡単に作成できることを願っています。 必要に応じて、開発に参加してプラグインを使用してください。