のら(NORA)のブログ

主にソフトについて備忘録で(手抜き)書いているのです!ご自由に観覧しやがれ、です。

autohotkey2.0勉強中(翻訳)その4-1(スクリプト編その1)

はじめに

翻訳とかあんま得意じゃないんだけどスクリプトの所らへん自分なりにまとめたやつ
その2はこちら
間違いあったらコメくれれば訂正します。というか自分用だし、間違えて覚えてしまうから(´・ω・`)

参考:ahkwiki日本語版様及び公式ヘルプ

スクリプト編その1

  • スクリプトは基本的に1行1命令で構成される
  • スクリプトは一行ずつ読み込まれ、最適化、検証されるため、エラーがあったら通知してくれる
  • 一行は最大16383文字までらしいけどそんな書かない気がするんだけど
  • コマンドは、コマンド名と引数をカンマで区切って記述する
  • コマンド名の直後は、空白文字で区切れば、カンマが省略可(第1引数に空白を指定する場合を除く)
  • コマンドの引数に文字列を指定する場合でも、「"」などで括ったりはせず、そのまま記述する
    • ただし関数等の式を利用する場合は文字列は引用符で囲う必要がある
  • コマンドとは別に「#」で始まるプリプロセッサ指令のようなものがある
    • これは、スクリプトが実行される前の解析の段階で処理されるので、引数に変数の参照を含めることは出来ない
  • 一行に一つのコマンドを書いていくのが基本であるが、単項演算子(+ および -)を除く演算子、あるいはカンマを行頭に置くと、その行は前の行の続きとみなされるようになり、コマンドを分割して記述することが可能

長いスクリプトを分割する方法

  • 分割しても実行の速度は変わらない
  • 主に引数に使用するっぽい

その1

  • “and"、 "or"、||、&&、カンマまたはピリオドで始まる行はそのすぐ上の行と自動的に結合(併合)される
  • ++を除く他のすべての式演算子についても同じ(演算子詳細はまた今度)
  • 行の接続詞のあとにインデントは入れる必要はない
  • 上の行にどの行が属しているかを明示することで明瞭さが向上する可能性がある
  • “AND"と "OR"で始まる行に余分なスペースを入れる必要はなくプログラムがこれを自動的に行ってくれる
  • いずれかの行と行の間または文末に、空白行またはコメントを追加することができる

方法その1の例(長いので折り畳み)

ex1: 2行目がコンマで始まるため、最初の行に2行目が追加される  
FileAppend, This is the text to append.`n   ; A comment is allowed here.  
*,* %A_ProgramFiles%\SomeApplication\LogFile.txt  ; Comment.

ex2:"and"または "or"で始まる例  
if (Color := "Red" or Color := "Green"  or Color := "Blue"   ; Comment.  
*or* Color := "Black" or Color := "Gray" or Color := "White")   ; Comment.  
*and* ProductIsAvailableInColor(Product, Color)   ; Comment.

ex3: その他の例この場合は三項演算子  
ProductIsAvailable := (Color := "Red")  
*?* false  ; We don't have any red products, so don't bother calling the function.  
*:* ProductIsAvailableInColor(Product, Color)

その2

  • 多数の行をマージするために、または行が"方法その1"に適していない場合に使用する必要がある
    この方法はホットストリングの自動置換に特に便利だが、任意のコマンドまたは式で使用することもできる
  • ()で囲み、()内のそれぞれの文末に.をつける
  • 初めの「(」は必ず改行して(から始めなければならない(コマンドのあとに続けて書いてはならない)
  • 途中に)で始まる行を含めたい場合は、`)のようにエスケープする
  • ()で囲った部分は継続セクション(継続節)と言う
  • 下の例2の一番下の行には、最初の行のFileAppendの最後の引数が含まれてるが、この習慣はオプションだとかなんとか
  • このような場合にはカンマがリテラルカンマではなく引数を区切るカンマ(コンマ)として扱われるってさ

方法その2の例

ex1: ()で囲んで各行の末尾に.を入れる例
Var := "  
(  ;ここから  
Line 1 of the text.  
Line 2 of the text. By default, a linefeed (`n) is present between lines.  
)"  ;ここまでは継続セクション


ex2: 継続セクションのあとにオプションがくる場合の例かな?
FileAppend,  ; The comma is required in this case.  
(  ;ここから  
A line of text.  
By default, the hard carriage return (Enter) between the previous line and this one will be   written to the file as a linefeed (`n).  
By default, the tab to the left of this line will also be written to the file (the same is true for spaces).  
By default, variable references such as %Var% are resolved to the variable's contents.
), C:\My File.txt  ;ここまで(C~の前)は継続セクション

継続セクションについて

  • 継続セクション内では「%」記号を用いた変数展開が有効
  • 式(:= 演算子を用いた代入)でも利用が可能だが、引用符の位置に注意が必要。例は↑のex1
  • 継続セクション内にコメントは入れれない、下記に記述するCオプションで指定すれば可能になる
  • エスケープシーケンスはそのまま使える(`オプションが指定されている場合を除く)

継続セクションのオプション

  • 継続セクションの動作は、セクションの開始括弧の右側に次のオプションの1つ以上を含めることで上書きできる
  • 複数のオプションが存在する場合は、それぞれのオプションをスペースで区切りる
ex:複数のオプションを設定する場合(下記のLTrimとJoinはオプション)
(LTrim Join なんちゃらーかんちゃらー

オプション一覧(あとで表にして長ければ折りたたむ)

  • Join 文字 : 各行の間に挿入する文字列を改行(`n)以外に変更する
  • つまりデフォルト(Joinなんちゃらなし)では各行の区切りに改行が用いられる
  • 単にJoinと指定すると、区切り文字無しで連結される
    • 文字 には15文字までの文字列が指定できるこの部分でのみ、`sが半角スペースとみなされる
    • セクション内の最後の行もjoinオプションの文字で終了させるには、セクションの閉じ括弧のすぐ上に空白行を入れればいい
  • LTrim: 各行の行頭の半角スペースやTab文字(\t)を無視する
    • LTrim0: LTrimの無効、個別では使わないかな
  • RTrim0: 行末の末尾の半角スペースやTab文字を無視しないようにする、RTrimはない
  • C: 「;」によるコメントを有効にする。 /*..*/形式のコメントは使用できない
    • 各行の最後に書いても、改行して単独で書いても問題ない
    • Cの代わりにComments、Comment、Commと書いてもいいらしいけどもまあCでいいよね。他人のコード読む際にそんなことあったかなーっていうやつ
  • %: 「%」以下を変数として扱わずリテラルとして扱う
  • `: `n、`t などの特殊文字がそのまま出力されるようになる
  • ,: カンマ( , )が自動的に「`,」としてエスケープされるのを抑止する(コマンドの引数の区切りなどとして扱われるようになる)
  • Q(またはQuotes): 引用符で囲まれた文字列を終了(しきる?)(terminate)する機能を復元します。訳がわかんない(´・ω・`)設定していろいろ試してみたけれどもわけがわからないよ/人◕ ‿‿ ◕人\ これ2で追加されたやつだと思うんだけどまあほとんど使わない無能オプションなの願おう(´・ω・`)
  • ): 継続節(の先頭)ではなく式として再解釈する
    • ただしJoinオプションは除く
    • 多分式が長い場合や継続セクションのオプション(Join)が使いたい場合に有用なのかな
    • 説明わかりにくいし例も例でわけわかめ例や説明いいのあったらいいな
ex:「)」の例、この場合括弧をエスケープする必要なく動作するらしく有用みたいよ  
(x.y)[z]\()  
これって()(x.y)[z]って書くんじゃないの?

コメント

  • 行頭がセミコロン「;」の行はコメント
  • コマンドのあとに半角スペースを空けてセミコロンがあれば、それ以降は行末までコメント(行コメント)
  • /* …… */で囲まれた範囲もコメントになる(複数行コメント)
ex: 
#a::なんちゃら ;コメント   
run,autohotkey.exe ;これ以降はコメント(1行に限る)  
run,autohotkey.exe
/*複数行  
  に  
  わたる  
  コメント  
*/

スクリプト編その2へ続く