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

# 秀丸×PowerShellで、エディタを疑似シェル化する
## まえがき
[PowerShell Advent Calendar 2017 - Qiita](https://qiita.com/advent-calendar/2017/powershell)

「PowerShell Advent Calendar 2017」（上記参照）に、参加させて頂いております。

今回、本記事のタイトルにあるように、**秀丸**と**PowerShell**を使うことで、
**「エディタを疑似シェル化する」**ことを解説していきます。
秀丸でのPowerShellの使い方と、なぜそうするのかも説明します。

先にメリットを少しだけ言っておくと、**テキストエディタの操作感**と、
**シェルスクリプトの記述力**の相乗効果が得られます。
それでは、未知の世界をのぞいて行きましょう。


***
## PowerShell
[Windows PowerShell でのスクリプティング（Microsoft）](https://technet.microsoft.com/ja-jp/scriptcenter/dd742419)
[なぜ、PowerShellを使うのか？ - Qiita](https://qiita.com/lldev2/items/5e37d67d180faf36afdd)

**PowerShell**は、**Windows**の**シェルスクリプト**言語（環境）です。
PowerShell(以下Posh)自体の説明は、上記のMS公式ページのリンクと、
前年に私が書いたページで代えさせて頂きます。


***
## 秀丸
[秀丸エディタ公式サイト（ダウンロード先）](http://hide.maruo.co.jp/software/hidemaru.html)
[秀丸ヘルプサイト](http://hidemaruo.mydns.jp:81/helpsite/index.html)
[hmPS (秀丸マクロ用 PowerShell)](http://xn--pckzexbx21r8q9b.net/?page=nobu_tool_hm_powershell)

**「秀丸」**は**（Windows用）テキストエディタ**です。
秀丸自体の説明は、上記の公式サイトに譲ります。

本記事で取り上げる部分だけ、かいつまんで言うと、
「hmPS」というライブラリ（DLL）を呼ぶだけで、
**秀丸でPowerShellを（拡張マクロとして）使える**、ということです。
（ただし、組み込みPowershellになるため、制限が一部あるらしい）


***
## 秀丸×PowerShell
```powershell
#PS = loaddll( hidemarudir + @"\hmPS" );
#_ = dllfuncw( #PS, "DoString", R"PS(


)PS"
);
freedll(#PS);
```

公式サイトでも説明されていますが、
秀丸でPoshを使うには、上のサンプルコードの中に書くのが約束事です。
コピペになるので、以下では省略しますが、動かすときには必要です。

```powershell
Invoke-WebRequest -Uri "http://example.com" -OutFile "D:\data\test\dl.txt"
```

上のサンプルコードは、実際に動かすときには、前述のサンプルコードで上下を包んでいます。
また、例なので、URIとファイル出力先は、実際に使用するものに変更してください。

さて、サンプルコード中の「Invoke-WebRequest」は、
「wget」に相当するようなコマンドレットで、ウェブからデータを取得します。
これが秀丸で動くので、テキストエディタでクローラーを作ることも可能です。


## エディタの疑似シェル化
```powershell
$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)
記事中でエクセルに言及しましたが、
そのエクセルでシェルスクリプトを使うお話なので、
参考になると思いリンクしました。