秀丸×PowerShellで、エディタを疑似シェル化する
まえがき
PowerShell Advent Calendar 2017 - Qiita
「PowerShell Advent Calendar 2017」(上記参照)に、参加させて頂いております。
今回、本記事のタイトルにあるように、秀丸とPowerShellを使うことで、
**「エディタを疑似シェル化する」**ことを解説していきます。
秀丸でのPowerShellの使い方と、なぜそうするのかも説明します。
先にメリットを少しだけ言っておくと、テキストエディタの操作感と、
シェルスクリプトの記述力の相乗効果が得られます。
それでは、未知の世界をのぞいて行きましょう。
PowerShell
Windows PowerShell でのスクリプティング(Microsoft)
なぜ、PowerShellを使うのか? - Qiita
PowerShellは、Windowsのシェルスクリプト言語(環境)です。
PowerShell(以下Posh)自体の説明は、上記のMS公式ページのリンクと、
前年に私が書いたページで代えさせて頂きます。
秀丸
秀丸エディタ公式サイト(ダウンロード先)
秀丸ヘルプサイト
hmPS (秀丸マクロ用 PowerShell)
「秀丸」は(Windows用)テキストエディタです。
秀丸自体の説明は、上記の公式サイトに譲ります。
本記事で取り上げる部分だけ、かいつまんで言うと、
「hmPS」というライブラリ(DLL)を呼ぶだけで、
秀丸でPowerShellを(拡張マクロとして)使える、ということです。
(ただし、組み込みPowershellになるため、制限が一部あるらしい)
秀丸×PowerShell
#PS = loaddll( hidemarudir + @"\hmPS" );
#_ = dllfuncw( #PS, "DoString", R"PS(
)PS"
);
freedll(#PS);
公式サイトでも説明されていますが、
秀丸でPoshを使うには、上のサンプルコードの中に書くのが約束事です。
コピペになるので、以下では省略しますが、動かすときには必要です。
Invoke-WebRequest -Uri "http://example.com" -OutFile "D:\data\test\dl.txt"
上のサンプルコードは、実際に動かすときには、前述のサンプルコードで上下を包んでいます。
また、例なので、URIとファイル出力先は、実際に使用するものに変更してください。
さて、サンプルコード中の「Invoke-WebRequest」は、
「wget」に相当するようなコマンドレットで、ウェブからデータを取得します。
これが秀丸で動くので、テキストエディタでクローラーを作ることも可能です。
エディタの疑似シェル化
$str = $hm::Edit::LineText
$val = Invoke-Expression $str
$wsobj = new-object -comobject wscript.shell
$result = $wsobj.popup($val)
「疑似シェル化」というからには、もっとPoshと直結した例を出しましょう。
上サンプルコード中、1行目の「$hm::Edit::LineText」は、
秀丸の上でカーソルがある行の文字列を取得します。
2行目の「Invoke-Expression」は、他言語のevalに相当するもので、
文字列を評価して、Poshへの命令として解釈できます。要するに直接実行できます。
なお、eval系の命令は、セキュリティに注意して使ってください。
3、4行目、コード中に「wscript」という文字があるように、WSHを利用して、
ポップアップのウィンドウで、文字列の評価結果を表示しています。
たとえば「1+2+3+4+5」とエディタに書いておいて、
マクロを実行すると、計算した「15」が表示されます。
前述の「Invoke-WebRequest」の文を書いておけば、Webからダウンロードします。
だから、実質的に疑似シェルとして使える、と言っても良いでしょう。
もちろん、実際に実用的に使うときは、ファイルを読み込んだり、
選択範囲やクリップボードから文字列を取得したり、
GUIを足したり、いろいろ複雑になっていくと思います。
ここでは、ほんのさわりのエッセンスだけ紹介しました。
疑似シェル化のメリットは何か?
シェルスクリプトの記述性とエディタの操作性
さて、HowからWhyの話に移ります。
テキストエディタで疑似シェル化できるとして、
なぜ、そんなことをするのか。何がしたいのか? という話です。
冒頭でも少し触れましたが、
メリットは記述性と操作性の両立です。
すなわち、シェルスクリプトの記述性と、
テキストエディタの操作性が合わさり、最強に見える。
Poshの操作性を高める
もう少し詳しく言うと、こうです。
Poshは便利ですが、もっと柔軟な操作性が欲しいときがあります。
とくに、テキストを編集する操作が欲しくなります。
というのは、テキストファイルなどからコピペしてくることが多くて、
そのときにコピペなどの操作が微妙にやりづらいんですね。
細かい話をすれば、Windows10ではPoshでコピペしやすくなった、
とか細かい改善はあるようです。しかし、テキストエディタなら、
テキストを操作する仕組みが、いろいろ最初からそろっているので、
やはり、テキストエディタを使うメリットはあると思います。
秀丸マクロの記述性を高める
一方、秀丸側の事情としては、マクロの記述性を高めたいのです。
秀丸の(標準)マクロについて、印象をざっくり言うと、
昔のBASICみたいな手続き的な言語です。
率直に言って、読み書きしにくい、レガシーな言語になっています。
その点、Poshは新しいモダンな言語なので、OOPでもFPでも、そこそこ書けます。
.NET Frameworkが使えるのも大きいです。hmPSを通じて、秀丸からでも使えます。
だから、秀丸×Poshと結びつくことで、
Win-Winの関係になるわけです。Windowsだけに(笑)。
他の方法との違い
LL化するやり方
べつに、やり方はひとつではないでしょう。
たとえば、C#からPoshを呼んでもいいわけです。
WPFなどでGUIを作れば、疑似シェル化みたいな、同じようなことはできるでしょう。
そちらの方が、最終的な自由度は高いと思います。
しかし、一からGUIを作るのはやはり大変です。
最初からテキストエディタのGUIがあって、そこにマクロで追加する方が楽です。
何かをチェックボックスで選択するような、
GUIをフル活用するようなタイプには、向かないでしょうが。
あるいは、エディタのシェル化ということでは、Emacsですでに行われてきました。
やはり、自由度は高いと思いますが、使い方が非常に難解になります。
EmacsとLispよりも、秀丸とPoshの方が、どうみても簡単でしょう。
要するに、秀丸とPoshだと、LL化できるのがメリットです。
ライトなのが私の好みなので、この組み合わせを今回選んだわけです。
秀丸マクロ拡張言語
それからじつは、秀丸側から見ると、
マクロを拡張する言語は、Poshだけではありません。
C#、JavaScript(ES6)、(Iron)Python、IronRubyなど、
最近ではモダンな言語をいろいろ選べるようになっています。
べつにPoshだけにこだわらず、
他言語が得意なマクロは他言語で書いて、
組み合わせて使えるのも、秀丸拡張マクロのメリットです。
秀丸側からは、選択肢が豊富な方が当然メリットが大きいですが、
そこであえて、Poshを選ぶ意味は何でしょうか?
それは一言で言うと、「OSとの近さ」だと思います。
どの言語でも、だいたい同じようなことはできるけれど、
やはりOSに近い部分では、Poshが一番簡潔になります。
疑似シェル化で開けてくる世界
ここまで、話が飛躍し過ぎないように禁欲してきましたが、
最後に、主観的に、希望的観測も交えて、
疑似シェル化でどんな世界を開拓したいのか、という展望を語りたいと思います。
ライフル式、ショットガン式
たとえると、疑似シェルのイメージとしては、
ショットガン(ショットシェル)なんですよね。
もちろん、実銃じゃなくて、ゲームの話ですけど。
「バイオハザード」のようなゲームをプレイすると、
ゾンビなど大量の敵に囲まれたときに、
ショットガンをぶっぱなすと、楽に切り抜けられます。
一方、(スナイパー)ライフルのような武器だと、
遠くまで精密射撃できるけれど、きちんと構えて狙う必要があります。
ショットガンだと、狙わなくても、適当に空中に向けて撃っても当たるので、楽です。
さて、このたとえで何が言いたいかというと、
たとえば一万行のコードで一個のアプリなら、
静的言語のC#(とVisual Stuido)とかで、GUIも作り込んだり、
カッチリした作り方をするのは良いと思います。
でも、百行のコードで百個のツールがあるような場合、
ショットガン式にバラバラに使える仕組みが欲しくなります。
それが、今回の疑似シェルの目的です。
Poshは自動化向きの言語ですが、半自動化で人手に逃がした方が、
実装コストとの兼ね合いでコスパが良い場合も出てきます。
そういう場合に、疑似シェルが欲しくなります。
細かいプログラムを多数実行すると、GUIを付けることや、
操作のオーバーヘッドが大きいからです。
エクセルとVBAとの比較
前年の前回記事との関連で言えば、エクセルとVBAはすごく普及しています。
大きな本屋に行くと、IT関連の売り場では、エクセルとVBAの本がたくさんありますよね?
なぜ、そんな普及したのか。もちろんまず、ビジネスでデファクトスタンダードだからです。
しかしさらになぜ、デファクトになったかといえば、
最初から表計算のGUIが付いているから、
他のプログラミング言語で一からGUIを作るより、早いし分かりやすいんだと思います。
なので、秀丸とPoshで、最初からGUI付きになって、
分かりやすくならないか、ということも考えているわけです。
もっとも、この組み合わせが流行るかどうかは、また別の話ですが、
何がしたいのか、という意図は今まで述べてきたようなことです。
最初は異質な組み合わせに思えるかもしれませんが、
秀丸のエディタの操作力が加わることで、
Poshのパワーをさらに引き出せるのではないか、と私は思っています。
参照記事
[なぜ、PowerShellを使うのか? - Qiita]
(https://qiita.com/lldev2/items/5e37d67d180faf36afdd)
前年に私が書いた記事です。
[Excelでもコマンド実行がしたい! - Qiita]
(https://qiita.com/nmrmsys/items/0c814efcf4461e45f758)
記事中でエクセルに言及しましたが、
そのエクセルでシェルスクリプトを使うお話なので、
参考になると思いリンクしました。