neocomplete.vimのfile_includeを使いこなす
この記事はVim Advent Calendar 2013の42日目の記事になります。
Neocomplete.vimのfile_includeを使いこなす
さて、今回の記事ではneocompleteのfile_includeを使いこなしてみます。
file_includeとは、ファイルパスを補完してくれるアレです。file補完との違いは、特定のキーワードや変換を含んだ補完が出来る点です。
- キーワード(
require
や#include
)があると補完が始まり - 指定されたパスの中から候補を探し、変換して表示します。(例:
system.os
)
内部では、path, include, includeexprなどが使われています。(pathの参考 -> Vim中級者を脱する Path編)
neocompleteを拡張する
file_includeを拡張する際には、neocompleteの設定をしてあげる必要があります。それぞれ、次のように5つ変数をファイルタイプ毎に設定します。
指定しなければ、デフォルトの部分の変数が使用されます
" Liquidで画像pathを補完する
" デフォルト &l:path(検索対象のディレクトリ`,`区切り)
let g:neocomplete#sources#include#paths.liquid =
\ '/Users/alpaca-tc/projects/alpaca-tc.github.io/source'
" デフォルト &l:include(正規表現にマッチしたら補完を開始)
let g:neocomplete#sources#include#patterns.liquid =
\ '\({\s*%\(\s\+\w\+\)\+\(\s*\|\s\+[a-zA-Z0-9_#\?\!]\+\)\@=\|{\s*{\(\s\+\w\+\)\+\(\s*\|\s\+[a-zA-Z0-9_#\?\!]\+\)\@=\)'
" デフォルト &l:includeexpr(ファイルパスを出力する際に変換する)
let g:neocomplete#sources#include#exprs.liquid =
\ 'substitute(v:fname, "^/", "", "")'
" デフォルト '.'(区切り文字の指定)
let g:neocomplete#sources#file_include#delimiters.liquid = '/'
" デフォルト [](補完するファイル拡張子フィルター)
let g:neocomplete#sources#file_include#exts.liquid =
\ ['png', 'jpg', 'gif', 'jpeg', 'ico']
解説いる?
先ほどのコードを読めば、だいたい分かると思います。(あなたがVimmerなら!)
もし、マイナーな言語でfile_include補完があった方が便利ならば、拡張してみてくださいー。
あるいは、&l:include, &l:includeexprなどで対応出来ているかもしれませんが。neocomplete.vim自体に設定が少ないのはそういうことです、(よね...?)
個人的には、フレームワーク毎にfile_includeが使いたい所存です。
Railsのimage_pathを補完してみる
最後です。
Railsでimage_pathを入力する際に、typoが多いので補完で対応してみます。
こんな感じで色々対応出来るはずなので、誰か本格的なRails用カスタマイズを作ってみてくれたらうれしいです!
" Rails.vimが必須
function! s:setup_include_file_for_rails()
if !exists('b:rails_root') || !exists('g:neocomplete#sources#include#paths')
return
endif
let g:neocomplete#sources#include#patterns.haml =
\ '^\s*\<\%(image_path\|image_tag\)\>'
let g:neocomplete#sources#include#paths.haml =
\ b:rails_root . '/app/assets/images'
let g:neocomplete#sources#include#exprs.haml =
\ "substitute(substitute(v:fname,'::','/','g'),'$','','')"
let g:neocomplete#sources#file_include#exts.haml =
\ ['png', 'jpg', 'gif', 'jpeg', 'ico']
let g:neocomplete#sources#file_include#delimiters.haml = '/'
endfunction
command! RailsView call s:setup_include_file_for_rails()
うっほい!
Shougoさんいつもありがとうございます。本当に。
ちなみに、tpopeさんはこんな感じの事を剛腕で捩じ伏せて実現しています。Vimガチ勢怖い...。
Vim Advent Calendar 45
前日は@osyo_mangaさんのtextobj の両端へ移動する operator つくったでした。
は!またosyoさんということは...!? と思っていたら、やはりVim Advent Calendarの今後の投稿者が居ませんでした;(
このブログを見ているあなた!(特にここまで読み切ったVim狂)
どうせVimmerしか居ない事は分かっています。ぜひ書いてください -> osyoさんに「記事書きたいですー」とリプライ飛ばしましょうー!