teratermマクロをvimで書くときの設定

シンタックスファイル

補完するほどじゃないと思うけど、色がついてくれることで間違いに気づける。

http://hp.vector.co.jp/authors/VA048353/garage.html
上記のサイトで公開されてるものを使わせてもらう。ただ足りない部分もあるので継ぎ足す。

  • 新しいTTLコマンド
  • 文中コメント
  • ブロックコメント
  • 文字列リテラルをASCIIコードで表現する記法

編集したやつ。
https://gist.github.com/3154584

--- ttl.vim.orig	Sat Jul 21 12:22:09 2012
+++ ttl.vim	Sat Jul 21 13:29:34 2012
@@ -4,14 +4,21 @@
 if version < 600
     syntax clear
 elseif exists("b:current_syntax")
-    finishendif
+    finish
+endif
 
-syn keyword ttlStatement    goto call end include return call execcmnd exit pause
+syn keyword ttlStatement    goto call end include return call execcmnd exit pause mpause
 syn keyword ttlRepeat       for next while endwhile
+syn keyword ttlRepeat       do loop break untile enduntil
 syn keyword ttlConditional  if then elseif else endif
 
 syn keyword ttlOperator     and not or xor
-syn keyword ttlArgument     inputstr param2 param3 result timeout 
+
+" system variables
+syn keyword ttlArgument     param1 param2 param3 param4 param5 param6 param7 param8 param9 paramcnt
+syn keyword ttlArgument     groupmatchstr1 groupmatchstr2 groupmatchstr3 groupmatchstr4 groupmatchstr5
+syn keyword ttlArgument     groupmatchstr6 groupmatchstr7 groupmatchstr8 groupmatchstr9 matchstr
+syn keyword ttlArgument     result timeout mtimeout inputstr 
 
 syn match ttlOperator       "\s[-+\*/%]\s"
 syn match ttlOperator       "="
@@ -19,13 +26,16 @@
 
 syn match ttlString         "\"[^"]*\""
 syn match ttlString         "\'[^']*\'"
+syn match ttlString         "#1[0-1][0-9]\|#1[2][0-7]\|#[1-9][0-9]\|#[1-9]"
+syn match ttlString         "#$[0-7]\x"
 
-syn match ttlLabel	    "^\s*:\s*\h\w*\>"
+syn match ttlLabel          "^\s*:\s*\h\w*\>"
 syn match ttlLabel          "\<\(goto\|call\)\s\+:\h\w*\>"
-syn match ttlLabel	    "\<goto\s\+\h\w*\>"
-syn match ttlLabel	    ":\h\w*\>"
+syn match ttlLabel          "\<goto\s\+\h\w*\>"
+syn match ttlLabel          ":\h\w*\>"
 
-syn match ttlComment        "^[ \t]*;.*$"
+syn match ttlComment        ";.*$"
+syn region  ttlComment      start="/\*"  end="\*/"
 
 syn keyword ttlImplicit     bplusrecv bplussend changedir clearscreen closett
 syn keyword ttlImplicit     connect disconnect enablekeyb flushrecv gettitle
@@ -49,6 +59,23 @@
 
 syn keyword ttlImplicit     beep closesbox exec getdate getenv gettime inputbox messagebox
 syn keyword ttlImplicit     setdate setdlgpos setexitcode settime show statusbox yesnobox
+
+" new ttl commands
+syn keyword ttlImplicit     callmenu cygconnect dispstr gethostname loginfo scprecv scpsend 
+syn keyword ttlImplicit     sendbroadcast sendlnbroadcast sendmulticast setbaud setdebug setdtr
+syn keyword ttlImplicit     setmulticastname setrts wait4all waitn waitregex ymodemrecv ymodemsend
+
+syn keyword ttlImplicit     expandenv sprintf sprintf2 strinsert strjoin strmatch strremove
+syn keyword ttlImplicit     strreplace strspecial strsplit strtrim tolower toupper
+
+syn keyword ttlImplicit     basename dirname filelock fileread filestat filetruncate fileunlock
+syn keyword ttlImplicit     foldercreate folderdelete foldersearch getfileattr setfileattr
+
+syn keyword ttlImplicit     ispassword setpassword
+
+syn keyword ttlImplicit     clipb2var crc32 crc32file filenamebox getspecialfolder getttdir getver 
+syn keyword ttlImplicit     ifdefined intdim random rotateleft rotateright setenv strdim var2clipb
+
 
 if version >= 508 || !exists("did_ttl_syntax_inits")
     if version < 508

vimrc

filetypeの設定とか。

autocmd BufWinEnter,BufNewFile *.ttl setlocal filetype=ttl
" for NERD_commenter
autocmd Filetype ttl setlocal commentstring=;\ %s
" for quickrun
let g:quickrun_config['ttl'] = {'command': 'ttpmacro' }

サブルーチン

あとは設定ではなくて、teratermマクロを書くときにこうしたよという話。
teratermマクロにはサブルーチンがあるのだけど、引数や戻り値がないので使い勝手が悪い。かといって、まとめられる処理をベタ書きにするのも地獄なので、予め入力と出力用の変数を決めておいて、サブルーチン呼び出し前にそれらを初期化し、サブルーチン内で出力用変数に値を入れるようにすると、まあまあすっきりする。cobolっぽい。プリフィクスにIN_とかOUT_とかつけるルールにするとまあ見やすいかも。cobolぽく。

日付の計算

今のところTTLコマンドには日時に関するものはあまりなくて、一日前の日付なんか取得できない。なので、サーバにログインした後、日付を計算するコマンドを発行してから、その結果を受け取る。具体的には、sendlnでdateコマンドをログイン先のシェルに実行させて、その出力をwaitlnで受け取る。

sendln 'date "%a %Y%m%d" -d "20120721 1 days"'
waitln 'invalid' 'Sun' 'Mon' 'Tue' 'Wed' 'Thu' 'Fri' 'Sat'
messagebox inputstr 'test'

確認してないけど(!)こんな感じ。dateコマンドのエラーメッセージは環境で変わるだろうし、正常な出力結果として曜日をベタ書きにしてるのが、うわって感じがする。

はまったところ

  • 文字列変数は255文字まで! 長いコマンドを作成して、一度に終わらせようと思っても255文字以降は変数に格納されない。
  • 文字列の比較は=演算子ではできない! strcompareコマンドを実行後、システム変数resultの値を確認すること。
  • もうひとつあった。文字コードSJISじゃないと実行できなかった。マクロの文字コードについて、リファレンスに注意書きがないので、もしかしたら何か別の原因なのかもしれないけど。