Hatena::ブログ(Diary)

C++でゲームプログラミング

2013-07-17

[]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 PerlRuby正規表現 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
    mado
end


" 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 を使用する上でとても便利な機能なのでこれからも効率よく使っていきたいですね。

tyrutyru 2013/07/17 23:50 ちなみにtextobj-lastpatは今ではデフォルトでgnというtextobjがVim本体に入ってます。(いつからかは忘れた)
gnは自動でカーソルも進めてくれるので、

/置き換えたい単語
dgn

とすると.(ドット)で次の「置き換えたい単語」を次々と消していってくれます。(textobj-lastpatもそういう挙動だったかは忘れた)

osyo-mangaosyo-manga 2013/07/17 23:53 ほうほう、そうなんですか。
コメントありがとうございます。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証