Vim の textobj プラグインをまとめた
この記事は Vim Advent Calendar 2012 229日目の記事になります。
最近やっと textobj を利用し始めた情弱な Vimmer なんですが、どんな textobj があるのか知らなかったので調べられる範囲でまとめてみました。
基本的に kana さんの vim-textobj-user を使用しているプラグインを上げてあります。
ご覧の通り量が多いので typo などがあったらごめんなさい(・ω<)
[textobj 一覧]
プラグイン | 範囲 | マッピング | 備考 |
---|---|---|---|
user | |||
entire | バッファ全体 | ae, ie | |
line | カーソル行 | al, il | 参照 |
function | 関数内 | af, if | |
syntax | シンタックス | ay, iy | |
jabraces | 「foo」 or 【bar】など | ajb, ijb | |
lastpat | 最後に検索されたパターン | a/, i/ | |
indent | カーソル位置と同じインデント | al, il | 参照 |
fold | fold | az, iz | |
diff | diff(1) | adf, idf | |
datetime | 日付と時刻 | ada, ida | |
underscore | アンダースコアの間 | a_, i_ | |
django-template | django_template | adb, idb | |
between | 任意の区切り文字の間 | af, if | 参照 |
comment | コメント | ac, ic | |
function-javascript | JavaScript の関数内 | af, if | |
function-perl | Perl の関数内 | af, if | |
textobj-lastpaste | 直前に変更またはヤンクされたテキスト | af, if | |
textobj-mbboundary.vim | ASCII文字とマルチバイト文字の境界を区切り | am, im | |
textobj-nonblankchars.vim | 日本語に対応している WORD | am, im | |
xml-attribute | XML の属性 | axa, ixa | |
php | phpタグに囲まれた部分 | aP, iP | 参照 |
space | 連続したスペース | aS, iS | 参照 |
url | URL | au, iu | |
wiw | snake_case 上の word | a,w, i,w | 参照 |
lastinserted | テキストオブジェクトとして最後に挿入された範囲 | au, iu | |
continuous-line | 行継続を用いている行 | av, iv | |
ruby | Ruby のブロック | arr, irr | 参照 |
xbrackets | x() や x<> など | axb, ixb | 参照 |
textobj-motionmotion.vim | 任意の2つの motion の間 | am, im | |
enclosedsyntax | Perl や Ruby の正規表現 | aq, iq | 参照 |
headwordofline | 行の先頭の word | ah, ih | |
latex | LaTeX | ae, ie | |
parameter | 関数の引数 | a, , i, | 参照 |
cell | 前後のスペースを取り除いたカーソル行 | ac, ic | |
context | 別の filetype のコンテキスト | icx | 参照 |
multiblock | 任意の複数の括弧のいずれか | asb, isb | 参照 |
indblock | インデントの空白行 | ao, io | |
dash | ダッシュ記号の間 | a-, i- | |
python | Python | af, if | |
ifdef | #ifdef | a#, i# | |
html-textobjects | HTML | ahf, ihf | |
keyvalue | ハッシュの key と value | dak, dik, dav, div | 参照 |
※マッピングは一部のみ記載
全部インストールして試したわけではないので間違っている記述があれば教えてもらえると助かります。
[neobundle.vim]
" textobj のベース NeoBundle "kana/vim-textobj-user" " バッファ全体 " ae, ie NeoBundle "kana/vim-textobj-entire" " カーソル行 " al, il NeoBundle "kana/vim-textobj-line" " 関数内 " af, if NeoBundle "kana/vim-textobj-function" " シンタックス " ay, iy NeoBundle "kana/vim-textobj-syntax" " 「foo」 or 【bar】など " ajb, ijb NeoBundle "kana/vim-textobj-jabraces" " 最後に検索されたパターン " a/, i/ NeoBundle "kana/vim-textobj-lastpat" " カーソル位置と同じインデント " al, il NeoBundle "kana/vim-textobj-indent" " fold " az, iz NeoBundle "kana/vim-textobj-fold" " diff(1) " adf, idf NeoBundle "kana/vim-textobj-syntax" " 日付と時刻 " ada, ida NeoBundle "kana/vim-textobj-datetime" " アンダースコアの間 " NeoBundle "kana/vim-textobj-syntax" " django_template " adb, idb NeoBundle "kana/vim-textobj-django-template" " 任意の区切り文字 " af, if NeoBundle "thinca/vim-textobj-between" " コメント " ac, ic NeoBundle "thinca/vim-textobj-comment" " JavaScript の関数内 " af, if NeoBundle "thinca/vim-textobj-function-javascript" " Perl の関数内 " af, if NeoBundle "thinca/vim-textobj-function-perl" " 直前に変更またはヤンクされたテキスト " ip NeoBundle "gilligan/textobj-lastpaste" " ASCII文字とマルチバイト文字の境界を区切り " am, im NeoBundle "deton/textobj-mbboundary.vim" " XML の属性 " axa, ixa NeoBundle "akiyan/vim-textobj-xml-attribute" " phpタグに囲まれた部分 " aP, iP NeoBundle "akiyan/vim-textobj-php" " 連続したスペース " aS, iS NeoBundle "saihoooooooo/vim-textobj-space" " URL " au, iu NeoBundle "mattn/vim-textobj-url" " snake_case 上の word " a,w, i,w NeoBundle "h1mesuke/textobj-wiw" " テキストオブジェクトとして最後に挿入された範囲 " au, iu NeoBundle "rhysd/vim-textobj-lastinserted" " 行継続を用いている行 " av, iv NeoBundle "rhysd/vim-textobj-continuous-line" " Ruby のブロック " arr, brr NeoBundle "rhysd/vim-textobj-ruby" " x() や x<> など " axb, ixb NeoBundle "https://bitbucket.org/anyakichi/vim-textobj-xbrackets" " 任意の2つの motion の間 " am, im NeoBundle "hchbaw/textobj-motionmotion.vim" " Perl や Ruby の正規表現 " aq, iq NeoBundle "deris/vim-textobj-enclosedsyntax" " 行の先頭の word " ah, ih NeoBundle "deris/vim-textobj-headwordofline" " LaTeX " ae, ie NeoBundle "rbonvall/vim-textobj-latex" " 関数の引数 " a, i, NeoBundle "sgur/vim-textobj-parameter" " 前後のスペースを取り除いたカーソル行 " ac, ic NeoBundle "mattn/vim-textobj-cell" " 別の filetype のコンテキスト " icx NeoBundle "osyo-manga/vim-textobj-context" " 任意の複数の括弧のいずれか " asb, isb NeoBundle "osyo-manga/vim-textobj-multiblock" " インデントの空白行 " ao, io NeoBundle "glts/vim-textobj-indblock" " ダッシュ記号の間 " a-, i- NeoBundle "RyanMcG/vim-textobj-dash" " Python " af, if NeoBundle "bps/vim-textobj-python" " #ifdef " a#, i# NeoBundle "anyakichi/vim-textobj-ifdef2 " HTML " ahf, ihf NeoBundle "mjbrownie/html-textobjects" " ハッシュの key と value " dak, dik, dav, div NeoBundle "vimtaku/vim-textobj-keyvalue"
[範囲]
個人的にわかりづらかった textobj の範囲をわかりやすくしてみました。
: カーソル位置
: 範囲
" vim-textobj-wiw
" i,w
word_neocomplete_word
" vim-textobj-indent
" ii
if
homu
mami
madoend
" vim-textobj-datetime
" ida
time2013-07-17now
time17:36now
" vim-textobj-multiblock
" asb
pre(multiblock)suf
pre'multiblock'suf
pre"multiblock"suf
" vim-textobj-lastinserted
" iv
homu
mado
\mami
saya
" textobj-xbrackets.vim
" ix)
printf("%f\n", (sqrt(value) + 1));
" ax)
printf("%f\n", (sqrt(value) + 1));" vim-textobj-parameter
" a,
printf("homu%f\n", (sqrt(value) + 1));
" i,
printf("homu%f\n", (sqrt(value) + 1));
" vim-textobj-indblock
" io
if
homu
mami
mado
end
と、いう感じで textobj をまとめてみました。
kana さんの vim-textobj-user を使用すると textobj がサクッとつくれるというのもあってだいぶ量が多いです。
Vim 本体で組み込まれているものも合わせるとどれぐらいの量になるのか…。
textobj は Vim を使用する上でとても便利な機能なのでこれからも効率よく使っていきたいですね。