Posted at

秀丸×PowerShellで、エディタを疑似シェル化する

More than 1 year has passed since last update.


秀丸×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

前年に私が書いた記事です。

Excelでもコマンド実行がしたい! - Qiita

記事中でエクセルに言及しましたが、

そのエクセルでシェルスクリプトを使うお話なので、

参考になると思いリンクしました。