はるなぴログ

WEBサイト作成技術研究

秀丸マクロのrunexを使ってPandocでマークダウン記法の変換をしよう!

秀丸エディタをインストールしていますか?

秀丸マクロではrunex文を使って外部コマンドを実行することができます。これは超便利!

前回の記事で紹介したPandocを秀丸マクロに組み込み、マークダウン記法で書いているブログ記事を簡単にHTMLファイルに変換する方法をご紹介します。

f:id:hal7pi:20181216083847j:plain

秀丸マクロのrunex文

秀丸で外部コマンドを実行できる文としてはrun文、runsync文,runsync2文 などがあります。

この他にrunex文というものもあり、こちらではパラメータで細かく動作を指定することができ、同期/非同期を細かく指定して標準入出力を扱うことが可能になります。

runex文のオプション指定

それではrunex文のオプション指定を見てみましょう。

runex ファイル名, 同期フラグ,
 標準入力フラグ, 標準入力ファイル名,
 標準出力フラグ, 標準出力ファイル名,
 標準エラー出力フラグ, 標準エラー出力ファイル名,
 フォルダフラグ, フォルダ名,
 表示フラグ,
 非描画フラグ,
 エンコード,
 拡張フラグ;

公式のマクロヘルプの説明はこんな感じですが、これだと分かりにくいので、実際にはるなぴが作ったマクロを例に説明します。

マクロの一部として書いたrunex文は以下のとおりです。作成した秀丸マクロ全体は後ほどご紹介します。

runex "pandoc --toc --data-dir=C:\\Users\\Username\\Documents\\Pandoc --template=default --no-highlight -f markdown_github-fenced_code_blocks-fenced_code_attributes+backtick_code_blocks-autolink_bare_uris+strikeout+auto_identifiers-ascii_identifiers-hard_line_breaks+raw_html+emoji+yaml_metadata_block+raw_tex+tex_math_single_backslash -t html -s -c C:\\Users\\Username\\Documents\\Pandoc\\2018-02-12-style.css " + $filename
, 1    //sync 0:async, 1:sync
, 0, ""    //stdin 0:none, 1:auto, 2:<file, 3:(reserved), 4:current content, 5:selection
, 2, $html_filename //stdout 0:none, 1:auto, 2:>file, 3:>>file, 4:new, 5:insert, 6:replace, 7:>output pane, 8:>>output pane
, 1, ""    //stderr 0:none, 1:auto or >>stdout, 2-8:same as stdout's param
, 0, ""    //folder 0:none, 1:current, 2:specify, 3:(reserved), 4:exe's
, 1        //show 0:auto, 1:show, 2:hide, 3-13:ShellExecute()'s SW_
, 0        //draw 0:draw, 1:no draw when stdout redirected
, 6        //encode 0:ansi, 2:utf-16, 6:utf-8
, 0        //extended flags
;

ファイル名(文字列)

実行する外部ファイル名を指定します。

%文字を使ってファイル名を指定することも可能です。

  • %f フルパスのファイル名
  • %d フォルダ名
  • %b フォルダを除いたファイル名
  • %% %自体を表示

はるなぴの作った秀丸マクロでは前回説明したPandocのコマンドを書きます。

Pandocのオプション指定については前回の記事をご参照ください。

www.halu7.com

同期フラグ(数値)

同期フラグ(数値)を指定します。

, 1    //sync 0:async, 1:sync

同期フラグを1にしておくことでrunex文の出力が終わるまで秀丸マクロは待機します。出力完了後はマクロを続行します。

同期フラグを0にするとrunex文の実行が終了するとマクロも終了します。

ここではrunex文の後にも秀丸マクロの実行を続けたいので1を指定します。

標準入力フラグ(数値)、標準入力ファイル名

標準入力フラグ(数値)と標準入力ファイル名を指定します。

, 0, ""    //stdin 0:none, 1:auto, 2:<file, 3:(reserved), 4:current content, 5:selection

はるなぴが作った秀丸マクロでは、Pandocのコマンドの一部としてファイル名を指定するので、ここは指定せず0としておきます。

, 2, "filename.md"

のようにして入力ファイル名を指定することも可能です。

標準出力フラグ(数値)、標準出力ファイル名

標準出力フラグ(数値)と標準出力ファイル名をオプション指定します。

, 2, $html_filename //stdout 0:none, 1:auto, 2:>file, 3:>>file, 4:new, 5:insert, 6:replace, 7:>output pane, 8:>>output pane

作成した秀丸マクロでは入力したマークダウンファイルのファイル名を拡張子だけをhtmlに変えて出力します。

ですので2を指定します。ファイル名は上の例のように変数を用いることも可能です。

3は追記、4は新規ファイルです。

標準エラー出力フラグ(数値)と標準エラー出力ファイル名

, 1, ""    //stderr 0:none, 1:auto or >>stdout, 2-8:same as stdout's param

標準エラー出力を見ることができるのでマクロのデバッグが簡単にできます。

標準出力フラグ同様にファイルに書き出すことも可能です。追記させる場合は3を指定し、ファイル名も記述します。

作業フォルダフラグ(数値)とフォルダ名(文字列)

, 0, ""    //folder 0:none, 1:current, 2:specify, 3:(reserved), 4:exe's

作業フォルダを指定する場合は2とします。今回は0としています。

表示フラグ(数値)

, 1        //show 0:auto, 1:show, 2:hide, 3-13:ShellExecute()'s SW_

ウィンドウを表示するかどうかを指定します。autoを指定するとGUIかCUIを自動で判別しGUIの場合にはウィンドウを開きます。

はるなぴのマクロでは新しいウィンドウを開きたいので1を指定します。

非描画フラグ(数値)

, 0        //draw 0:draw, 1:no draw when stdout redirected

1を指定すると標準出力や標準エラー出力をリダイレクトする場合、完了するまで秀丸エディタに描画をしないようにします。

エンコード(数値)

標準入出力のエンコード指定をします。

, 6        //encode 0:ansi, 2:utf-16, 6:utf-8

UTF-8ですので6を指定します。

拡張フラグ(数値)(V8.73以降)

, 0        //extended flags

1を指定するとファイル名指定のところで%を解釈しないようになります。つまり%文字がそのままファイル名に使えるようになるということです。

秀丸マクロを使ったPandocによるマークダウン記法のHTMLファイルへの変換

それでは作成した秀丸マクロを見てみましょう。

setcompatiblemode 0x0F;
begingroupundo;
    $filename = basename2;
//    message "現在のファイル名は、 " + $filename + "です";
    #filename_length = strlen($filename);
//    message "ファイル名の長さは拡張子も含み、 " + str(#filename_length) + "字です";
    #period_position = strstr($filename,".");
//    message "#period_positionは、 " + str(#period_position) + "です";
    $filename_wo_extension = leftstr($filename,#period_position);
//    message "$filename_wo_positonは、 " + $filename_wo_extension + "です";
    $file_extension = rightstr($filename,#filename_length - #period_position - 1);
//    message "filename_extensionは、 " + $file_extension + "です";
    if ($file_extension!="md") {
        message "マークダウンファイルではないようです。";
        goto Label1;
        } else {
        $html_filename = $filename_wo_extension + ".html";
//        message "$html_filenameは、 " + $html_filename + "です";
        runex "pandoc --toc --data-dir=C:\\Users\\aika\\Documents\\Pandoc --template=default --no-highlight -f markdown_github-fenced_code_blocks-fenced_code_attributes+backtick_code_blocks-autolink_bare_uris+strikeout+auto_identifiers-ascii_identifiers-hard_line_breaks+raw_html+emoji+yaml_metadata_block+raw_tex+tex_math_single_backslash -t html -s -c C:\\Users\\aika\\Documents\\Pandoc\\2018-02-12-style.css " + $filename
        , 1    //sync 0:async, 1:sync
        , 0, ""    //stdin 0:none, 1:auto, 2:<file, 3:(reserved), 4:current content, 5:selection
        , 2, $html_filename //stdout 0:none, 1:auto, 2:>file, 3:>>file, 4:new, 5:insert, 6:replace, 7:>output pane, 8:>>output pane
        , 1, ""    //stderr 0:none, 1:auto or >>stdout, 2-8:same as stdout's param
        , 0, ""    //folder 0:none, 1:current, 2:specify, 3:(reserved), 4:exe's
        , 1        //show 0:auto, 1:show, 2:hide, 3-13:ShellExecute()'s SW_
        , 0        //draw 0:draw, 1:no draw when stdout redirected
        , 6        //encode 0:ansi, 2:utf-16, 6:utf-8
        , 0        //extended flags
        ;
// $html_filenameが既に開いていたら(閉じずに)そのウィンドウを一番手前に持ってきて内容を書き換える
        #window_number = findhidemaru($html_filename);    // まずウィンドウ番号を取得
        if (#window_number != -1) {     // $html_filenameのウィンドウが見つかった
        #window_handle = hidemaruhandle(#window_number);        // ウィンドウハンドルを取得
        setactivehidemaru #window_handle;       // そのウィンドウを手前にする
        reopen;
    } else {
    openfile $html_filename;
    }
    #markdown_window_number = findhidemaru($filename);
    #markdown_window_handle = hidemaruhandle(#markdown_window_number);
    setactivehidemaru #markdown_window_handle;
    }
Label1:
endgroupundo;

一行ごとにコメント文を入れています。

このコメントを外すとmessage文により秀丸マクロが正しく動いているかどうかを簡単に確認できます。

こうやって一行一行を少しずつ確認しながら秀丸マクロを作っていけば最終的には正しく動くマクロを確実に作ることができます。

できあがった暁にはmessage部分をコメントにすれば、マクロがどのように動作しているかを理解する助けにもなります。

秀丸マクロを作成する方法として非常にお勧めです。

Pandocによるマークダウンファイル変換マクロの使い方

まず初めにPandocがインストールされていることが大前提です。

Pandocのインストール方法はこちらの記事をご参照ください。

www.halu7.com

マクロの使い方は以下のとおりです。

  1. 秀丸エディタを起動します。
  2. ブログ記事をマークダウン記法で書きます。
  3. ファイル名の拡張子をmdとして保存します。
  4. メニューのマクロからマクロ実行します。
  5. 秀丸の別タブで変換されたHTMLファイルが開きます。

まとめ

秀丸エディタのrunex文を使用して外部コマンドをマクロから実行する方法について説明しました。

秀丸エディタを使ってブログ記事を自分好みのマークダウン記法で書き、それをPandocを使ったマクロを用いて簡単にHTMLファイルに変換することができます。

Pandocに限らずこのようなマクロを使えばテキストファイルを自在に操ることができますね!