kana / vim-textobj-indent

Vim plugin: Text objects for indented blocks of lines
http://www.vim.org/scripts/script.php?script_id=2484
166 stars 10 forks source link

インデントブロック末尾部での aiについて #7

Closed YoshihiroIto closed 10 years ago

YoshihiroIto commented 10 years ago

[A]位置にカーソルがあるときに vaiでforブロックの中が選択されるのを期待していたのですが、 その外のインデントが選択されていまいます。 [B]位置であれば、forブロックの中が選択されます。

色々試してみたところインデントブロックの最後部が空行だと一つ外のインデントが 範囲になるように思います。 これはそういうものでしょうか? よろしくお願いします。

#include <iostream>

int main()
{
    for (auto i = 0; i != 100; ++i) {

[B]     std::cout << "hello" << i << std::endl;
[A]
    }

    return 0;
}
YoshihiroIto commented 10 years ago

よくよく考えてみれば、問題ない動作でしたので閉じます。失礼しました。

kana commented 10 years ago

ai はカーソル行のインデント量を基準にして対象範囲を決定します。問題の[A]の位置で vai した場合、カーソル行が空行なので基準とすべきインデント量が分かりません。なので後続の行のインデント量を基準としています。結果として問題のテキストだと main 関数の中身全体が対象となります。

このカーソル行が空行の場合に ai が対象とする範囲についてはドキュメントに明記してあります。なのでこれはそういうものです。

例示されたコードと位置だと確かに for ブロックの中身だけが選択されるのではないかという気持ちになります。しかし、

という理由から一貫して後続行のインデント量を基準として採用しています。

また、実用上は例示されたコードのように最後に空行が入ったコードはそう頻繁に遭遇しないと思われますし、「 for ブロックの中身を対象とする」という目的がはっきりしているならば ai よりもむしろ iB の方が適切な場面が多いかと思います。

YoshihiroIto commented 10 years ago

詳細なご返答有難うございます。 カッコ系(?)言語(Cなど)の場合と、インデント(Python)や、キーワード(Vimスクリプト,Rubyなど)でより汎用的に使えるのはインデントかなぐらいの気持ちでした。

ご提案のいただいた通り、カッコ系言語の時はiBに設定すれば大抵問題解決です。 それ以外の時も、ブロックを閉じる前の行で空行を書くコードはあまりないと思われるので問題になることはあまりないですね。