Vimでファイルを開く方法(基本編)

この記事はVim Advent Calendar 2016の4日目の記事です。

Vimでファイルを開くのに

プラグインを使っている人はたくさんいると思います。
これらのプラグインは大変便利なインターフェースを提供してくれているのですが、 依存しすぎてしまうと標準機能でファイルを開く方法を忘れてしまうかもしれません。

...さすがにそんなVimmerはいないと思いますが、ファイルを開く

をおさらいしてみましょう。

コマンドで開く

以下のコマンド*1の引数としてファイル名を指定します。

コマンド 説明
:e[dit] 現在のバッファでファイルを開く
:sp[lit] 水平分割してファイルを開く
:vs[plit] 垂直分割してファイルを開く
:tabe[dit] 新しいタブページを作成してファイルを開く

このとき、

  • <Tab>(または<CTRL-I>)でファイル名の補完
    • 動作はwildmode(:help wildmode)で変更可能
  • <CTRL-D>で入力にマッチするファイル名の一覧表示

をすることができます。

また、対象のファイル名を探すのに

  • ***などのワイルドカード(:help wildcard)
  • :p:hなどのファイル名修飾子(:help filename-modifiers)

を用いることもできます。

" <CTRL-D>で一覧を表示し、
:e */index<CTRL-D>
public/index.html  src/index.css      src/index.js

" <Tab>を押すと最初の候補が選択される
:e */index<Tab>
:e public/index.html

" もう1度<Tab>を押すと次の候補が選択される
:e public/index.html<Tab>
:e src/index.css
  • /usr/lib/golang/src/配下のreader.goを探す
:e /usr/lib/golang/src/**/reader.go<CTRL-D>
/usr/lib/golang/src/archive/tar/reader.go
/usr/lib/golang/src/archive/zip/reader.go
/usr/lib/golang/src/bytes/reader.go
/usr/lib/golang/src/compress/lzw/reader.go
/usr/lib/golang/src/compress/zlib/reader.go
/usr/lib/golang/src/debug/elf/reader.go
/usr/lib/golang/src/encoding/csv/reader.go
/usr/lib/golang/src/go/doc/reader.go
/usr/lib/golang/src/image/gif/reader.go
/usr/lib/golang/src/image/jpeg/reader.go
/usr/lib/golang/src/image/png/reader.go
/usr/lib/golang/src/mime/quotedprintable/reader.go
/usr/lib/golang/src/net/textproto/reader.go
/usr/lib/golang/src/strings/reader.go
/usr/lib/golang/src/testing/iotest/reader.go
" カレントディレクトリが/rootの状態で
:pwd
/root

" swagger-codegen/samples/server/petstore/go-api-server/main.goを開いている時
:echo expand('%:p')
/root/swagger-codegen/samples/server/petstore/go-api-server/main.go

" 最初の:hで"/main.go"、次の:hで"/go-api-server"が除去される
:e %:h:h/**/pom.xml<CTRL-D>
swagger-codegen/samples/server/petstore/java-inflector/pom.xml
swagger-codegen/samples/server/petstore/java-msf4j/pom.xml
swagger-codegen/samples/server/petstore/jaxrs/jersey1/pom.xml
swagger-codegen/samples/server/petstore/jaxrs/jersey2/pom.xml
swagger-codegen/samples/server/petstore/jaxrs-cxf/pom.xml
swagger-codegen/samples/server/petstore/jaxrs-cxf-cdi/pom.xml
swagger-codegen/samples/server/petstore/jaxrs-resteasy/default/pom.xml
swagger-codegen/samples/server/petstore/jaxrs-resteasy/joda/pom.xml
swagger-codegen/samples/server/petstore/jaxrs-spec/pom.xml
swagger-codegen/samples/server/petstore/scalatra/pom.xml
swagger-codegen/samples/server/petstore/spring-mvc/pom.xml
swagger-codegen/samples/server/petstore/spring-mvc-j8-async/pom.xml
swagger-codegen/samples/server/petstore/springboot/pom.xml
swagger-codegen/samples/server/petstore/undertow/pom.xml

キーマッピングで開く

ファイル名がある場所にカーソルを移動し、以下のキー*2を入力します。

キー 説明
gf 現在のバッファでファイルを開く
CTRL-W f 水平分割してファイルを開く
CTRL-W CTRL-F
CTRL-W gf 新しいタブページを作成してファイルを開く

現在開いているバッファにファイル名があれば良いですが、無い場合は:r!lsfindなどの外部コマンドを用いてファイル一覧を作成してしまいましょう。

" 新しいバッファにカレントディレクトリのファイル一覧を作成
:new | r! ls

なお、:newでバッファを作成した場合、デフォルトではgfでファイルを開く際にエラー(E37)になってしまいます。
その場合、

  • set hidden ... ウィンドウ内に表示されなくなる際にバッファを隠す

    • 全てのバッファが対象
    • Vim終了時に未保存バッファが残っているとエラーになる
  • set bufhidden=hide ... ウィンドウ内に表示されなくなる際にバッファを隠す

    • カレントバッファのみが対象
    • Vim終了時に当該バッファが未保存だとエラーになる
  • set buftype=nofile ... バッファを書き込まれる予定のないバッファにする

    • カレントバッファのみが対象
    • Vim終了時に当該バッファが未保存でもエラーにならない

などの設定でバッファを保存せずに切り替えられるようにしてあげる必要があります。

また、ファイル一覧に大量のファイルが表示されてしまった場合

  • /{pattern}で検索したり、
  • :g/{pattern}/dでフィルタしてあげると

目的のファイルが探しやすくなります。

:new | r! find . -type f
" Windowsの場合
:new | r! dir . /b /s /a-d
  • 現在開いているファイルがあるディレクトリ配下のファイル一覧を作成
" findの引数は実行前に<Tab>で展開しておく
:new | r! find %:p:h<Tab> -type f
" Windowsの場合
:new | r! dir %:p:h<Tab> /b /s /a-d
  • ファイル一覧を作成するユーザコマンドの定義

上記のコマンドを毎回入力するのが面倒な場合、.vimrcに以下のようなコマンドを追加しておくと便利です。

" 新しいscratchバッファ(:help special-buffers 参照)を作成する
command! -bar NewScratch new | setlocal buftype=nofile bufhidden=hide noswapfile

" :NewScratchで作成したバッファにfindコマンドの出力内容を挿入する
" FIX: <args>は""で囲まないとスペースの入ったパスが正しく処理できない(derisさん、ありがとうございます)
command! -nargs=1 -complete=dir Files NewScratch | r! find "<args>" -type f
" Windowsの場合
" FIX: <args>は""で囲まないとスペースの入ったパスが正しく処理できない(derisさん、ありがとうございます)
" command! -nargs=1 -complete=dir Files NewScratch | r! dir "<args>" /b /a-d /s

" %:p:hを引数として:Filesを実行する(<args>には%:p:hが展開された状態で渡される)
command! FilesBuffer Files %:p:h

" .を引数として:Filesを実行する
command! FilesCurrent Files .

まとめ

Vimの標準の機能でファイルを開く方法を紹介しました。

単にファイルを開くだけなら十分ですが、インタラクティブ性や非同期性が必要な場面になると物足りないところがあるかもしれません。
そういった時には組み込み関数と合わせて使ってみたり、プラグインを活用すると良いと思います。

*1:詳細は :help edit-a-file, :help opening-window, :help tab-page-commands 参照

*2:詳細は :help window-tag 参照

VimConf 2016 に行ってきた

VimConf 2016に行ってきた。

発表メモ

Introduction to Vim 8.0 by Ken Takata
  • 最近Vimに入った機能の中でjob, timer, packagesは使ったけど *1 *2 Partial, lambda, closureはまだ触っていないので試してみたい
  • 日本人VimmerVim本体に多くのパッチを送っているのは知っていたけど改めて数字で見てみると予想以上にすごかった
  • Vimのテストが充実してきたおかげで新機能の使用例としても参考にできてありがたい
Vim as the MAIN text editor by bird_nitryn
  • 自分もVimに乗り換えた時は同じようにメインエディタにして使いまくった
  • 最近はVimmerを育てる機会の方が多いので参考にしたい
Denite.nvim ~The next generation of unite~ by Shougo
  • unite.vimを使っていてパフォーマンス的な不満は特になかったけどデモに触発されてMacVimでDenite.nvimを試してみたらすごく速かった
  • Decoupled UIはちょっと気になるのでそのうち試してみたい
Go、C、Pythonのためのdeoplete.nvimのソースの紹介と、Neovim専用にpure Goでvim-goをスクラッチした話 by zchee
  • neovimに全然興味なかったけど発表を聞いてとりあえずインストールしてみることにした
  • nvim-goの作りが気になるのでソースを見てみる
エディタの壁を越えるGoの開発ツールの文化と作成法 by tenntenn
  • 自分の近くでは「Goやったことある方」でほとんどの人が手を挙げていた
  • gofmt(ごーふむと)、GOOS(ぐーす)、GOARCH(ごーち)
  • ファイルを生成するツール *3 は作ったから次はファイルを書き換えるツールと思っていたのでgorenameのところがとても参考になった
vim-mode-plus for Atom editor by t9md
  • vim-mode-plusのアーキテクチャとそこに到るまでの考え方がただただすごかった
    • Vimでテキストを編集するということへの捉え方
    • モーションやオペレータの表現
  • persistence-selectionはVimにも欲しい
Vimの日本語ドキュメント by MURAOKA Taro
  • 「翻訳作業に手と目と知恵を貸してくれる人募集中」
    • リファレンス&ユーザー・マニュアル
    • メッセージ
    • メニュー
    • など
  • 脱線しかけたのはAho-Corasick法(文字列探索アルゴリズム)
  • 技術者はSPOFは排除したいはず
Vim script parser written in Go by haya14busa
  • Fixer、Formatterに期待!
  • stacktrace便利そう
  • Vim8とV8(node)は紛らわしい?
僕の友達を紹介するよ by aiya000
Best practices for building Vim plugins by thinca
  • :help design-goalsは知らなかった
  • シャイで有名なthincaさんがハイテンションで発表に懸ける強い想いが感じられた

感想

  • Vimハラスメント」に気をつけようと思った
    • (自分としてはネタのつもりだけど)職場でよく「Vimを使おう」と言っているので...
      • 開発関連のやるべき事をやってくれていれば何も言わないけどできていない
      • Vimだったらそのためにどうすれば良いかはいくらでもサポートできる
      • というのが言い訳
  • 今回はチームのメンバ(2名)に参加してもらう事に成功した
    • 楽しんでもらえたようで良かった

終わりに

発表者のみなさま、スタッフのみなさま、会場を提供してくださったミクシィさん、
ありがとうございました。
来年も是非参加したいです。

neocompleteとneobundleを捨てた

半年ほど使っていなかったのでvimrcを整理するタイミングで完全に消すことにした。
ただ長年ツートップだったプラグインなので消すに至った経緯を軽くメモっておく。

neocomplete

今の自分にはVim標準の補完機能(ins-completion)で十分だった。

  • 自動補完が発動するとVimが固まって使い物にならなくなることがある
    • 特定の環境でたまにしか発生しないけど発生するとすごくストレス
  • 自動補完されないと補完自体ができないと思ってしまう
    • そんなことはなく、基本的には常に手動補完可能
    • そもそも自動補完の対象になっていない補完機能もある
  • if_luaが必須
    • どうせ有効化するけどプラグインのためだけにluaを入れたくはなかった

昔は自動補完が必須だと思っていたけどVimの熟練度が上がったからか、

「補完したくなったらその時にCTRL-X(or N,P)押せばいいじゃん」

と思うようになった。
CTRL-Xが押しにくいと感じていたのもいつの間にか全然気にならなくなっていた。

neobundle

Vim標準のパッケージ機能(packages)を使うことにした。

  • 開発終了宣言されたのでどうするか悩んでいたけどどれも決め手に欠けていた
    1. それでもneobundleを使い続ける
      • どうせいつかは移行しないといけなくなるはず
    2. 順当にdein.vimに移行する
      • 機能にあまり魅力を感じなかったし、安定性や将来性に不安があった
    3. ミニマリストを謳うvim-plugに移行する
      • Installationを見た瞬間にもうめんどくさくなった
  • Vimプラグインマネージャーに求める最低限の機能はただ1つ
  • あったら便利な機能は自分でなんとかするか諦める
    1. プラグインのインストールとアップデート
      • Bitbucketにあるプラグインは使わないのでgitさえ叩ければOK
      • 単純なシェルコマンドならVimに依存する必要もない
      • それでも後処理以外はVimからできるようにはしたけど
    2. 依存関係のあるプラグインを自動で解決してインストールする機能
    3. 遅延読み込み
      • 個別に設定するのが面倒なのでbackground loadingで代用している
      • その方が起動時間の短縮にもなるし

どうもプラグインを管理するプラグインに依存するのに疲れたっぽい。
決定版が出るまでは当分これでいくつもり。

次は脱unite!?

インターフェースは便利なんだけどやっぱり安定性はイマイチ...
(今までできていたことが急にできなくなったりすることがあるし)
いつ無くなっても困らないくらいには依存度を減らすようにしておくかな。

vimのjob機能を使ってプラグインを更新する

2ヶ月以上経ってるけど一応前回の続き。

~/.vim/pack/bundle/opt/配下にインストールされているプラグインを更新するには、

ls -d ~/.vim/pack/bundle/opt/* | xargs -I{} git -C {} pull --ff --ff-only

でやってしまうのが手っ取り早いんだけど、あえてvimでやってみた。

以下のようにjob機能を使うことでvimをブロックせず、結果をバッファに出力するといった処理が簡単に実現できた。

let s:plugins = [
            \     'vim-quickrun',
            \ ]

"プラグインを更新したくなったら :call UpdatePackPlugins() を実行する
function! UpdatePackPlugins()
    " 結果を表示するためのバッファを作成
    topleft split
    edit `='[update plugins]'`

    let s:idx = 0
    call timer_start(100, 'PluginUpdateHandler', {'repeat': len(s:plugins)})
endfunction

function! PluginUpdateHandler(timer)
    let path = expand('~/.vim/pack/bundle/opt/' . s:plugins[s:idx])
    let cmd = printf('git -C %s pull --ff --ff-only', path)
    " コマンドを実行し、結果をout_nameで指定したバッファに出力する
    call job_start(cmd, {'out_io': 'buffer', 'out_name': '[update plugins]'})

    let s:idx += 1
endfunction

UpdatePackPlugins()内でforを使うと全部更新できなかったのでtimer機能でPluginUpdateHandler()を呼び出すようにしている。

vim pluginのbackground loading

最近vimに追加されたpackagestimerを使ってvimが起動した後にプラグインの読み込みができたらどうだろう? と思ったのでやってみました。

以下のような設定をvimrcに追加してvimを起動するとvimが立ち上がってからプラグインが読み込まれます。

" vim起動後に~/.vim/pack/bundle/opt/vim-quickrunを読み込む例

let s:plugins = [
            \     'vim-quickrun',
            \ ]

let s:idx = 0
function! PackAddHandler(timer)
    execute 'packadd ' . s:plugins[s:idx]
    let s:idx += 1
endfunction

autocmd VimEnter * call timer_start(1, 'PackAddHandler', {'repeat': len(s:plugins)})

約150個のプラグインある状態のMacVim-KaoriYaで、起動時間が

  • NeoBundle: 約530ms
  • background loading: 約130ms

と、だいぶ高速化されました。

ただし、

  • packagesの仕様*1で読み込まれないプラグインがあったり、
    • 追記(2016-03-21)
      • textobj-userruntime! plugin/textobj/*.vim
      • operator-userruntime! plugin/operator/*.vim
      • PackAddHandlerで実行すると読み込める
    • 追記(2016-04-03)
      • 7.4.1699からはサブディレクトリの.vimも読み込まれるようになったのでruntime!は不要
  • 起動時に指定したファイルのfiletypeが(ファイルを開いた後に読み込まれるので)反映されなかったり、
    • 追記(2016-03-21)
      • PackAddHandlerdoautocmd BufReadPostを実行すると反映される
  • 引数の-cで指定したコマンドが(実行後に読み込まれるので)失敗したり、

するので有効に使うには色々と考えないといけなさそうです。


ところで、e-honAmazonオムニ7にある

「仕事ですぐ役立つ VimEmacsエキスパート活用術」

4月9日(土) に発売されます。

f:id:daisuzu:20160318234059p:plain

技術評論社さんのサイトにも来週にはページができるそうなのでできました。 gihyo.jp
興味のある人はチェックしてみてください。

VimのCTRL-X補完について

この記事はVim Advent Calendar 2015の5日目の記事です。

Vimで補完といえばShougoさんのプラグインneocompleteが有名ですが、プラグインを使わなくてもCTRL-X サブモードで補完を行うことが可能です。
この機能はブログや書籍などでたびたび紹介されてはいますが、文字だけではイメージがつきにくいところもあるのでGIFアニメで紹介してみたいと思います。


行(全体)補完: CTRL-X CTRL-L

if から始まる行と l から始まる行を補完(go)

f:id:daisuzu:20151205000331g:plain

検索対象はcompleteオプションで設定可能


局所キーワード補完: CTRL-X CTRL-N / CTRL-X CTRL-P

現在のファイルから T で始まるキーワードを補完(perl)

f:id:daisuzu:20151205000332g:plain


辞書補完: CTRL-X CTRL-K

dictionaryオプションで設定したファイルから twist で始まる単語を補完

f:id:daisuzu:20151205000322g:plain

dictionaryオプションに使用するファイルを設定する必要がある(デフォルトは未設定)

set dictionary=/usr/share/dict/words

シソーラス補完: CTRL-X CTRL-T

thesaurusオプションで設定したファイルから twister の類語を補完

f:id:daisuzu:20151205000329g:plain

thesaurusオプションに使用するファイルを設定する必要がある(デフォルトは未設定)

set thesaurus=/usr/share/mythes/th_en_US_v2.dat

パスパターン補完: CTRL-X CTRL-I

インクルードしているSocket.pmから getpr で始まるキーワードを補完(perl)

f:id:daisuzu:20151205000325g:plain

検索対象はincludeオプションとpathオプションで設定可能


タグ補完: CTRL-X CTRL-]

tagsファイルからクラス名とメソッド名を補完(ruby)

f:id:daisuzu:20151205000328g:plain

読み込むtagsファイルはtagsオプションで設定可能


ファイル名補完: CTRL-X CTRL-F

/etc/y から始まるファイル名を補完

f:id:daisuzu:20151205000323g:plain


定義補完: CTRL-X CTRL-D

mixinを補完(sass)

f:id:daisuzu:20151205000321g:plain

検索対象はdefineオプションとincludeオプションとpathオプションで設定可能


コマンドライン補完: CTRL-X CTRL-V

vimのコマンドと関数を補完

f:id:daisuzu:20151205000330g:plain


ユーザー定義補完: CTRL-X CTRL-U

completefuncオプションに設定したCompleteMonthsで月の名前を補完

f:id:daisuzu:20151205000324g:plain

fun! CompleteMonths(findstart, base)
  if a:findstart
    " 単語の始点を検索する
    let line = getline('.')
    let start = col('.') - 1
    while start > 0 && line[start - 1] =~ '\a'
      let start -= 1
    endwhile
    return start
  else
    " "a:base" にマッチする月を探す
    let res = []
    for m in split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec")
      if m =~ '^' . a:base
        call add(res, m)
      endif
    endfor
    return res
  endif
endfun

オムニ補完: CTRL-X CTRL-O

omnifuncオプションに設定されたjavascriptcomplete#CompleteJSでDate型のメソッドを補完(javascript)

f:id:daisuzu:20151205000326g:plain


スペリング補完: CTRL-X s / CTRL-X CTRL-S

頭文字が大文字になっていない単語と綴りが間違っている単語の修正候補を補完

f:id:daisuzu:20151205000327g:plain

spellオプションをオンにする必要がある


上記環境はDocker上のcentos6に以下のパッケージをインストールしたものです。
プラグインは一切インストールしておらず、vimrcも作成していません。

yum install vim-enhanced ctags words mythes-en

CTRL-X サブモード について

順序が逆転してしまいましたが、CTRL-X サブモード挿入モードまたは置換モード中にCTRL-Xキーで入ることができます。

ポップアップメニューの補完候補はCTRL-N(次の候補)またはCTRL-P(前の候補)キーで選択し、CTRL-Yキーやスペース、エンターなどで挿入することができます。
また、CTRL-Eキーで補完を中止して元のテキストに戻すことができます。


最近neocompleteが入っていないVimを触ることがちょこちょことあり、ここ1週間くらいはメインのVimでもneocompleteを使わずに過ごしてみました。
昔は自動補完プラグインが無いとコーディングなんてできない...とか思っていましたがそこまで困らないくらいには成長していたようです。
ただ、CTRL-Xキーがイマイチ押しにくいと感じているのでこれさえなんとかなれば自動補完プラグインは使わなくなるかもしれません。
今はこんなマッピングを試してみています。

inoremap <expr><Tab> pumvisible() ? "\<C-n>" : MyInsCompl()
function! MyInsCompl()
  let c = nr2char(getchar())
  if c == "l"
    return "\<C-x>\<C-l>"
  elseif c == "n"
    return "\<C-x>\<C-n>"
  elseif c == "p"
    return "\<C-x>\<C-p>"
  elseif c == "k"
    return "\<C-x>\<C-k>"
  elseif c == "t"
    return "\<C-x>\<C-t>"
  elseif c == "i"
    return "\<C-x>\<C-i>"
  elseif c == "]"
    return "\<C-x>\<C-]>"
  elseif c == "f"
    return "\<C-x>\<C-f>"
  elseif c == "d"
    return "\<C-x>\<C-d>"
  elseif c == "v"
    return "\<C-x>\<C-v>"
  elseif c == "u"
    return "\<C-x>\<C-u>"
  elseif c == "o"
    return "\<C-x>\<C-o>"
  elseif c == "s"
    return "\<C-x>s"
  endif
  return "\<Tab>"
endfunction

macvim-kaoriya or macvimをビルドする(2015/08)

vim 7.4.774で追加された v:completed_item をmacvim-kaoriyaで使いたくなったけど今日の時点だとまだバージョン7.4.769なので使えない...
Homebrewからインストールできるらしいけど手元の環境ではエラーが出たのでコンソールからビルドしてみる。

2015/08/26追記

エラーの原因は古いrecipeを参照しているせいでした。

brew tap splhack/homebrew-splhack
brew install --HEAD splhack/splhack/macvim-kaoriya

でHomebrewからインストールできたので以下は通常用途では使う必要なさそう。

  • vim本体のソースを変更したい
  • if_*を/usr/local以外のバージョンで使いたい

時くらいか。。。


ソースのダウンロード
  • macvim-kaoriya
git clone https://github.com/splhack/macvim

or

  • macvim
git clone https://github.com/b4winckler/macvim
ビルド

このビルドスクリプト

gist.github.com

macvimディレクトリで実行する。

cd macvim
./build-macvim.sh
実行
open src/MacVim/build/Release/MacVim.app

とりあえず動いた。

  • macvim-kaoriya
:version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Aug 23 2015 20:28:09)
MacOS X (unix) version
Included patches: 1-826
Compiled by daisuzu <daisuzu@gmail.com>
Huge version with MacVim GUI.  Features included (+) or not (-):
+acl             +cmdline_info    +emacs_tags      -gettext         +listcmds        +mouse_netterm   +persistent_undo +signs           +termresponse    +wildignore
+arabic          +comments        +eval            +guess_encode    +localmap        +mouse_sgr       +postscript      +smartindent     +textobjects     +wildmenu
+autocmd         +conceal         +ex_extra        -hangul_input    +lua/dyn         -mouse_sysmouse  +printer         -sniff           +title           +windows
+balloon_eval    +cryptv          +extra_search    +iconv           +menu            +mouse_urxvt     +profile         +startuptime     +toolbar         +writebackup
+browse          +cscope          +farsi           +insert_expand   +migemo          +mouse_xterm     +python/dyn      +statusline      +transparency    -X11
++builtin_terms  +cursorbind      +file_in_path    +jumplist        +mksession       +multi_byte      +python3/dyn     -sun_workshop    +user_commands   -xfontset
+byte_offset     +cursorshape     +find_in_path    +keymap          +modify_fname    +multi_lang      +quickfix        +syntax          +vertsplit       +xim
+cindent         +dialog_con_gui  +float           +kaoriya         +mouse           -mzscheme        +reltime         +tag_binary      +virtualedit     -xsmp
+clientserver    +diff            +folding         +langmap         +mouseshape      +netbeans_intg   +rightleft       +tag_old_static  +visual          -xterm_clipboard
+clipboard       +digraphs        -footer          +libcall         +mouse_dec       +odbeditor       +ruby/dyn        -tag_any_white   +visualextra     -xterm_save
+cmdline_compl   +dnd             +fork()          +linebreak       -mouse_gpm       +path_extra      -ruby19          -tcl             +viminfo         -xpm
+cmdline_hist    -ebcdic          +fullscreen      +lispindent      -mouse_jsbterm   +perl/dyn        +scrollbind      +terminfo        +vreplace        
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
  system gvimrc file: "$VIM/gvimrc"
    user gvimrc file: "$HOME/.gvimrc"
2nd user gvimrc file: "~/.vim/gvimrc"
    system menu file: "$VIMRUNTIME/menu.vim"
  fall-back for $VIM: "/Applications/MacVim.app/Contents/Resources/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_MACVIM -Wall -Wno-unknown-pragmas -pipe  -DMACOS_X_UNIX  -g -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1       
Linking: gcc   -L. -L/usr/local/lib -L. -L/usr/local/lib  -L/usr/local/lib -o Vim -framework Cocoa -framework Carbon       -lm  -lncurses -liconv -lmigemo -framework Cocoa  -pagezero_size 10000 -image_base 100000000  -pagezero_size 10000 -image_base 100000000  -fstack-protector  -L/System/Library/Perl/5.18/darwin-thread-multi-2level/CORE 
  • macvim
:version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Aug 23 2015 20:37:09)
MacOS X (unix) version
Included patches: 1-383
Compiled by daisuzu <daisuzu@gmail.com>
Huge version with MacVim GUI.  Features included (+) or not (-):
+acl             +cmdline_info    +emacs_tags      -gettext         +lua/dyn         +mouse_urxvt     +profile         +statusline      +transparency    -X11
+arabic          +comments        +eval            -hangul_input    +menu            +mouse_xterm     +python/dyn      -sun_workshop    +user_commands   -xfontset
+autocmd         +conceal         +ex_extra        +iconv           +mksession       +multi_byte      +python3/dyn     +syntax          +vertsplit       +xim
+balloon_eval    +cryptv          +extra_search    +insert_expand   +modify_fname    +multi_lang      +quickfix        +tag_binary      +virtualedit     -xsmp
+browse          +cscope          +farsi           +jumplist        +mouse           -mzscheme        +reltime         +tag_old_static  +visual          -xterm_clipboard
++builtin_terms  +cursorbind      +file_in_path    +keymap          +mouseshape      +netbeans_intg   +rightleft       -tag_any_white   +visualextra     -xterm_save
+byte_offset     +cursorshape     +find_in_path    +langmap         +mouse_dec       +odbeditor       +ruby/dyn        -tcl             +viminfo         -xpm
+cindent         +dialog_con_gui  +float           +libcall         -mouse_gpm       +path_extra      +scrollbind      +terminfo        +vreplace        
+clientserver    +diff            +folding         +linebreak       -mouse_jsbterm   +perl/dyn        +signs           +termresponse    +wildignore      
+clipboard       +digraphs        -footer          +lispindent      +mouse_netterm   +persistent_undo +smartindent     +textobjects     +wildmenu        
+cmdline_compl   +dnd             +fork()          +listcmds        +mouse_sgr       +postscript      -sniff           +title           +windows         
+cmdline_hist    -ebcdic          +fullscreen      +localmap        -mouse_sysmouse  +printer         +startuptime     +toolbar         +writebackup     
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
  system gvimrc file: "$VIM/gvimrc"
    user gvimrc file: "$HOME/.gvimrc"
2nd user gvimrc file: "~/.vim/gvimrc"
    system menu file: "$VIMRUNTIME/menu.vim"
  fall-back for $VIM: "/Applications/MacVim.app/Contents/Resources/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_MACVIM -Wall -Wno-unknown-pragmas -pipe  -DMACOS_X_UNIX  -g -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1      
Linking: gcc   -L. -L/usr/local/lib -L. -L/usr/local/lib  -L/usr/local/lib -o Vim -framework Cocoa -framework Carbon       -lm  -lncurses -liconv -framework Cocoa  -pagezero_size 10000 -image_base 100000000  -fstack-protector  -L/System/Library/Perl/5.18/darwin-thread-multi-2level/CORE 

gettext-mkやif_*の言語は全部Homebrew経由でインストールした。
luaenv、pyenv、rbenvあたりが有効だと多分ビルドできないので無効にするか以下を正しく設定する。

  • --with-lua-prefix
  • --with-lua52-prefix
  • --with-python-config-dir
  • --with-python3-config-dir
  • --with-ruby-command