teratermマクロをvimで書くときの設定
シンタックスファイル
補完するほどじゃないと思うけど、色がついてくれることで間違いに気づける。
http://hp.vector.co.jp/authors/VA048353/garage.html
上記のサイトで公開されてるものを使わせてもらう。ただ足りない部分もあるので継ぎ足す。
編集したやつ。
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コマンドのエラーメッセージは環境で変わるだろうし、正常な出力結果として曜日をベタ書きにしてるのが、うわって感じがする。