Closed YoshihiroIto closed 10 years ago
よくよく考えてみれば、問題ない動作でしたので閉じます。失礼しました。
ai
はカーソル行のインデント量を基準にして対象範囲を決定します。問題の[A]の位置で vai
した場合、カーソル行が空行なので基準とすべきインデント量が分かりません。なので後続の行のインデント量を基準としています。結果として問題のテキストだと main
関数の中身全体が対象となります。
このカーソル行が空行の場合に ai
が対象とする範囲についてはドキュメントに明記してあります。なのでこれはそういうものです。
例示されたコードと位置だと確かに for
ブロックの中身だけが選択されるのではないかという気持ちになります。しかし、
a...
系は基本的に「カーソル位置が空白なら後続のものを対象とする」という振る舞いになっており、 ai
もこれに倣っています。先行するものを基準として採用すると一貫性が損なわれます。という理由から一貫して後続行のインデント量を基準として採用しています。
また、実用上は例示されたコードのように最後に空行が入ったコードはそう頻繁に遭遇しないと思われますし、「 for
ブロックの中身を対象とする」という目的がはっきりしているならば ai
よりもむしろ iB
の方が適切な場面が多いかと思います。
詳細なご返答有難うございます。 カッコ系(?)言語(Cなど)の場合と、インデント(Python)や、キーワード(Vimスクリプト,Rubyなど)でより汎用的に使えるのはインデントかなぐらいの気持ちでした。
ご提案のいただいた通り、カッコ系言語の時はiBに設定すれば大抵問題解決です。 それ以外の時も、ブロックを閉じる前の行で空行を書くコードはあまりないと思われるので問題になることはあまりないですね。
[A]位置にカーソルがあるときに vaiでforブロックの中が選択されるのを期待していたのですが、 その外のインデントが選択されていまいます。 [B]位置であれば、forブロックの中が選択されます。
色々試してみたところインデントブロックの最後部が空行だと一つ外のインデントが 範囲になるように思います。 これはそういうものでしょうか? よろしくお願いします。