3
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PowerShellAdvent Calendar 2017

Day 12

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

Posted at

秀丸×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)
記事中でエクセルに言及しましたが、
そのエクセルでシェルスクリプトを使うお話なので、
参考になると思いリンクしました。

3
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?