幼馴染にイオナズンを覚えさせて嫁にした話。～秀丸エディタのペースト機能を拡張してみた～


この記事はファーストサーバのAdvent Calenderの11日目用に書き下ろした記事です
http://qiita.com/advent-calendar/2015/firstserver

タイトルも内容もQiitaの思想にそぐわないかもしれませんが、
お祭りだし大丈夫でしょうと割り切っています。

とはいえ、最近はエクセルとテキストエディタぐらいしか使っていないので、
トガった技術は持ち合わせておりません。
大好きな「秀丸」と「秀マクロ」のお話しをゆる～く投稿しようと思います。

# はじめに

巷にはテキストエディターが星の数ほど出回っています。

* sublimeText
* atom
* vim
* Notepad++
etc…

そんな中、インターネット黎明期から存在している老舗エディタ「秀丸エディタ」の存在は言うに及ばず、革新的なエディターが蔓延るこの時代に、テキストファイルの関連付けは未だ「秀丸」という御仁も多いでしょう。

乗り換えない理由としては
* 普通に使いやすいから
* 日本語文章が扱いやすい
* 正規表現を覚えなおすのが手間
* マクロが無いと仕事にならない
* 4000円払ったのでもったいない

といったところから

「秀丸とは初めてプログラム書いたときからの古い付き合いで…それこそ一緒に成長した**幼馴染**みたいな関係だから」と宣う小生のようなユーザもいるでしょう。

そんな折、ふとしたきっかけで「SublimeText」を使う機会がありました。

秀丸の古臭いUIと異なり、SublimeTextはなんか今っぽくてかっこいいです。

関西弁で言うところのシュッとしてます。

秀丸と幼馴染である小生は、

「エディターはUIじゃねーよ！機能が大事よ！！」

と一時は擁護しましたが、SublimeTextにはナイスな機能がいくつか実装されていました。

その１つが**「コピーした文字を複数行に亘ってペーストする機能」**です。

* ![sublime.gif](https://qiita-image-store.s3.amazonaws.com/0/71261/08bae0ac-92d3-6765-634a-7cd08fa74d3b.gif)

インポート用のCSVを作るシーンなどでは垂涎な機能ですが、幼馴染の秀丸は当機能をもっていません。

対するsublimeTextは、強力な機能を所持しているうえ、容姿も良いです。

わかりやすく言うと**「イオナズンが使えるフローラ」**です。

こうなると話は別で、今後どちらと付き合うべきかで、小生の心は揺らぎました。

幼馴染か…

イオナズンか…

何日か悩んだ挙句、ある時画期的なアイデアが浮かびました。

**「あれ？幼馴染にイオナズン覚えさせたらええんじゃない？」**

ということで、前置きが非常に長くなりましたが、「秀丸に『コピーした文字を複数行に亘ってペーストする機能』を実装する」方法を紹介します。

# 要件定義
『一行を複数行に亘ってペーストする機能』の要件としては
* 通常のペースト同様Ctr＋Vで機能する
* 単行の文字列がクリップボードにある場合のみ機能する
* 矩形選択時の場合のみ機能する
* 矩形選択以外の場合は通常ペーストとする

としました

あとお作法的に
* 「元に戻す」で貼り付け前の状態に戻せる

あとはひたすらコーディングです

# できたソースがこちら
* イオナズン.mac

```
//クリップボードに文字列が格納されていることを確認
if(anyclipboard){
    //yes文字列です
    //矩形選択か確認
    if(rectselecting){
        //yes矩形選択です
        //クリップボード文字列を配列に格納
        beginclipboardread;
        $strClip1 = getclipboard; //クリップボードのテキスト1行目
        $strClip2 = getclipboard; //クリップボードのテキスト2行目
        //クリップボードには単行の文字列が格納されていることを確認
        if($strClip2 == "" ){
            //yesクリップボードの文字列は単行です
            //カーソル位置退避
            #a = seltopy;
            #end =selendy;
            #seltopx =seltopx;
            #selendx =selendx;
            //まとめてやり直し開始
            begingroupundo;
            //矩形選択した分だけ貼り付けを繰り返す
            while( #a <= #end ) {
                moveto #seltopx, #a;
                beginsel;
                moveto #selendx, #a;
                paste;
                #a= #a+1;
            }
            //まとめてやり直し終了
            endgroupundo;
            //ここで強制終了
            endmacro;
        }
    }
    //条件に合わない場合は通常貼り付け
    paste;
}else{
//no非文字列です
    message "文字列じゃないです";
    //文字以外は終了
    endmacro;
}
```

プライベート利用用なのでバージョン制御等は記載していませんが、よほど古いバージョンでなければ稼働するでしょう。

さらに「ctrl+V」で上記マクロを呼び出せるようにします。

# 秀丸の設定
1. メニューの[マクロ(M)]より[マクロの登録(E)]を選択し、適当な箱に上記マクロを登録する。(ここではマクロ11を使用)

 ![hide1.gif](https://qiita-image-store.s3.amazonaws.com/0/71261/4a14787a-acb0-597d-2a22-b697f2333b4b.gif)

2. メニューの[その他(O)]より[キー割り当て(K)]を選択し、「Ctrl+V」のコマンドを登録したマクロ(ここではマクロ11)に設定する

![hide2.gif](https://qiita-image-store.s3.amazonaws.com/0/71261/41f3f8a9-3310-afbe-a921-0d7132a9c733.gif)

# 唱えてみる
 マクロの記述・秀丸の設定が正しければこんな感じで動きます。  
  (ちなみに矩形選択はctrl押しながらカーソル選択でできます)  
![hidemarukai.gif](https://qiita-image-store.s3.amazonaws.com/0/71261/771b8f57-5c0f-ca87-3b74-83b689ad14ed.gif)

# 最後に
秀丸は足りない機能は自作して補えるところがいいですね。
他にもいろいろなマクロを自作しているのでコレを機に公開していこうかと思います。

あとよくよく考えてみるとドラクエ５はやった記憶がありませんでした。

# 訂正(20160603)  
 よくよく調べると `Shift+Ctrl+カーソル選択`で「矩形複数選択」なる機能があるとのこと(V8.40以降)、これで複数個所のペーストは実現できますね。