何気ない日々の重複を探し出す

日々の所作のなかで大きな重複作業を見つけ出して、"塊"にして自動化のメカニズムを組み入れると、個人レベルでも効率化できることはある。

長年行っていると気が付かないが、なんか同じことを繰り返している動作・・・

まさしくこれじゃないか?コードのなかで意味を持ってしまう文字を普通にそのまま表示させるために、バックスラッシュ( \ )を入れて、エスケープする作業。目視・検索で逐一エスケープしなければならないが、これをやってるときにふと思った。

アンダースコア( _ )、バックスラッシュ( \ )、アスタリスク(*)あたりが筆者の場合、頻繁に遭遇する本文内のこれらの文字の手前に\を挿入たり、変換することで意図通りの表示に直す。以前にも書いた(記事)がタグ周りで<pre>タグが効かないケースも稀に出てくるので、目視でのチェックが必要で一括置換すると、たいてい何かがおかしくなるため厳禁だ。

これは、やってみる価値がありそうだ。やはりテキストエディター上で段落ごとに判断して、選択範囲ごとにアンダースコア( _ )とバックスラッシュ( \ )はエスケープ、アスタリスク( * )は( * )に変換という感じで対応することが多いが、結構な手間である。

選択範囲を手軽に置換するのは便利

秀丸のマクロでツールを作成できそうだ。秀丸のreplaceall replaceallfast文と「特定の範囲内だけで検索したい場合」の例を参考に必要な箇所を変える。

disabledraw;

if(selecting) {
    replaceallfast "検索A", "置換A", inselect2;
    selectinselect;

    replaceallfast "検索B", "置換B", inselect2;
    selectinselect;
}

アンダースコア( _ )は、( \_ )に、バックスラッシュ( \ )は( \\ )にエスケープ、アスタリスク( * )は全角の( * )にそれぞれ置換したいのだから、

disabledraw;

if(selecting) {

    replaceallfast """_""", """\_""", inselect;
    selectinselect;

    replaceallfast """\""", """\\""", inselect;
    selectinselect;

    replaceallfast "*", "*", inselect;
    selectinselect;

}

ここまでで、書いた本文中の文章から拾って試してみよう。

選択範囲ごとにアンダースコア(_)とバックスラッシュ(\)はエスケープ、アスタリスク(*)は(*)に変換という自身で使えるものを作った方がいいのだ。

で上記マクロ実行してみると、

選択範囲ごとにアンダースコア(\\_)とバックスラッシュ(\\)はエスケープ、アスタリスク(*)は(*)に変換という自身で使えるものを作った方がいいのだ。

となった。最初のアンダースコアにバックスラッシュが2つ追加されてしまっている。

これでは意図した動作にならない。保存されないストリーム/バッファのなかで置換するので、最初のreplaceallfastでの置換を二つ目のreplaceallfastでさらに置換してしまっているようだ。

順番を入れ替えてみると・・・

変数を使った別の形などいろいろ検討してみたが、マクロを開いてすぐに変えられるこの形は変えたくない。順番を変えてみよう。

disabledraw;

if(selecting) {

    replaceallfast """\""", """\\""", inselect;
    selectinselect;

    replaceallfast """_""", """\_""", inselect;
    selectinselect;

    replaceallfast "*", "*", inselect;
    selectinselect;

}

こうすれば、バックスラッシュを対象とした置換は1回だけになるはず。個数増の影響も気になるので、例文を倍増して試してみよう。

選択範囲ごとにアンダースコア(_)とバックスラッシュ(\)はエスケープ、アスタリスク(*)は(*)に変換という自身で使えるものを作った方がいいのだ。選択範囲ごとにアンダースコア(_)とバックスラッシュ(\)はエスケープ、アスタリスク(*)は(*)に変換という自身で使えるものを作った方がいいのだ。

これを選択し、順番を変えたマクロを実行すると、

選択範囲ごとにアンダースコア(\_)とバックスラッシュ(\\)はエスケープ、アスタリスク(*)は(*)に変換という自身で使えるものを作った方がいいのだ。選択範囲ごとにアンダースコア(\_)とバックスラッシュ(\\)はエスケープ、アスタリスク(*)は(*)に変換という自身で使えるものを作った方がいいのだ。

しっかり意図通り全部変換できている。なかで変換される文字を把握しながら追加しなければならないので、毎回試さないといけない。しかし、どこに何を加えるかがわかりやすいので、その点は勝る。筆者の場合はこれでよかろう。

使えそうだと思った機能はユーザーメニューに登録する

メニューに登録して、呼びやすくしておくところまでやらないとツールは使わなくなる。秀丸にはショートカットキーでフローティング表示できる自分だけの「ユーザーメニュー」([その他]→[メニュー編集]→[ユーザーメニュー])を設置できる。使う機能を塊で管理できるのでちょっとしたマクロでも頻繁に使うものを入れておくと使い勝手がいい。筆者の場合はCtrl+kを割り当てているいる。

  • [その他]→[メニュー編集]→[ユーザーメニュー]、ここに小さなマクロやお気に入りの機能を集めて設置し、重複しない覚えやすいショートカットキー(筆者の場合はCtrl+k)を割り当てておく

    [その他]→[メニュー編集]→[ユーザーメニュー]、ここに小さなマクロやお気に入りの機能を集めて設置し、重複しない覚えやすいショートカットキー(筆者の場合はCtrl+k)を割り当てておく

  • 秀丸上でCtrl+kを押せば、パッと現れるのでそのまま矢印キーかさらに下層に割り当てたキーを押すと呼び出せる

    秀丸上でCtrl+kを押せば、パッと現れるのでそのまま矢印キーかさらに下層に割り当てたキーを押すと呼び出せる

Ctrl+kが手狭になった筆者は新たにCtrl+uを追加しているので、ここに追加しよう。先のコードをescode.macというファイル名で保存し、[マクロ]→[マクロ登録]で登録する。[その他]→[メニュー編集]→[ユーザーメニュー]に設置したユーザーメニューCtrl+uに先ほどのマクロescode.macを追加する。

  • まずはマクロ登録でさきほど保存したescode.macを登録

    まずはマクロ登録でさきほど保存したescode.macを登録

  • その後、[その他]→[メニュー編集]→[ユーザーメニュー]からユーザーメニューを選びマクロを追加する

    その後、[その他]→[メニュー編集]→[ユーザーメニュー]からユーザーメニューを選びマクロを追加する

こうしておけば、目的のエスケープ群が出現する段落で、選択状態にしCtrl+uを押してユーザーメニューを表示させて、そのままescode.macを選択。

  • 目的のエスケープ群が出現! まとめて選択状態にして

    目的のエスケープ群が出現! まとめて選択状態にして

  • ユーザーメニュー二号機であるCtrl+uからescode.macを選択すると

    ユーザーメニュー二号機であるCtrl+uからescode.macを選択すると

  • 全部エスケープ&置換

    全部エスケープ&置換

先に述べたように、なかにあるreplaceallfastが増えすぎると、思わぬ変換をする可能性もあるが、選択中の段落などで今回のようなまとまった置換処理ができるのは相当に楽である。うまく使えば、大幅に改善される可能性がある。ちょっとした工夫を追加するkことで、結構な短縮を達成できることは、まだまだありそうだ。