neocompleteとneobundleを捨てた
半年ほど使っていなかったのでvimrcを整理するタイミングで完全に消すことにした。
ただ長年ツートップだったプラグインなので消すに至った経緯を軽くメモっておく。
neocomplete
今の自分にはVim標準の補完機能(ins-completion
)で十分だった。
- 自動補完が発動するとVimが固まって使い物にならなくなることがある
- 特定の環境でたまにしか発生しないけど発生するとすごくストレス
- 自動補完されないと補完自体ができないと思ってしまう
- そんなことはなく、基本的には常に手動補完可能
- そもそも自動補完の対象になっていない補完機能もある
- if_luaが必須
昔は自動補完が必須だと思っていたけどVimの熟練度が上がったからか、
「補完したくなったらその時に
CTRL-X
(orN
,P
)押せばいいじゃん」
と思うようになった。
CTRL-X
が押しにくいと感じていたのもいつの間にか全然気にならなくなっていた。
neobundle
Vim標準のパッケージ機能(packages
)を使うことにした。
どうもプラグインを管理するプラグインに依存するのに疲れたっぽい。
決定版が出るまでは当分これでいくつもり。
次は脱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に追加されたpackages
、timer
を使って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-userはruntime! plugin/textobj/*.vim
operator-userはruntime! plugin/operator/*.vim
をPackAddHandler
で実行すると読み込める
- 追記(2016-04-03)
- 7.4.1699からはサブディレクトリの.vimも読み込まれるようになったので
runtime!
は不要
- 7.4.1699からはサブディレクトリの.vimも読み込まれるようになったので
- 追記(2016-03-21)
- 起動時に指定したファイルのfiletypeが(ファイルを開いた後に読み込まれるので)反映されなかったり、
- 追記(2016-03-21)
PackAddHandler
でdoautocmd BufReadPost
を実行すると反映される
- 追記(2016-03-21)
- 引数の
-c
で指定したコマンドが(実行後に読み込まれるので)失敗したり、
するので有効に使うには色々と考えないといけなさそうです。
が 4月9日(土) に発売されます。
技術評論社さんのサイトにも来週にはページができるそうなのでできました。 gihyo.jp
興味のある人はチェックしてみてください。
goemonを使ってblockdiagを書いてみたら快適だった
そこそこちゃんとしたドキュメントを書くときは
を使うけど、
図だけライブプレビューしながら書くには大げさすぎるのでgoemonを使ってみた。
まずはこの記事を参考にmarkdownのライブリロード環境を構築。
ただcssは無くても良かったのでhtmlテンプレートに追加したのはlivereload.jsのみ。
pandoc -D html | sed '/<\/head>/i\ <script src="http://localhost:35730/livereload.js"></script>' > template.html
あとはgoemon.ymlにblockdiagを追加して
tasks: - match: '*.md' commands: - pandoc -f markdown -t html --template=template.html -o ${GOEMON_TARGET_DIR}/${GOEMON_TARGET_NAME}.html ${GOEMON_TARGET_FILE} - :livereload / - match: '*.diag' commands: - blockdiag -Tsvg -o ${GOEMON_TARGET_DIR}/${GOEMON_TARGET_NAME}.svg ${GOEMON_TARGET_FILE} - :livereload /
goemonを起動したら
goemon python -m SimpleHTTPServer
こんな感じのmarkdownを作って
![](blockdiag.svg)
blockdiag.diag
を書いていくだけ。
Sphinxに比べるとファイルを保存してからブラウザに反映されるまでが速い!
とりあえずでやってみたものの、こんなに快適に書けるとは思ってなかった...
複数のblockdiagシリーズを同時に使うときのことはあんまり考えてなかったけど
ファイルの拡張子で実行するコマンドを分ければなんとかなりそう。
- match: '*.diag' commands: - blockdiag -Tsvg -o ${GOEMON_TARGET_DIR}/${GOEMON_TARGET_NAME}.svg ${GOEMON_TARGET_FILE} - :livereload / - match: '*.seqdiag' commands: - seqdiag -Tsvg -o ${GOEMON_TARGET_DIR}/${GOEMON_TARGET_NAME}.svg ${GOEMON_TARGET_FILE} - :livereload /
これをやる前に
考えてもみたけど今のところそこまで汎用的なのは必要ないかなぁという感じ。
初期設定が楽になってもパフォーマンスは落ちそうだし...
と、ここまで書いてdiagram-autobuildがあるということを知った。
1ファイルしか指定できないけど書きたい図が1つだけの時はこれで良さそう。
手元の環境だとgoemonに比べてワンテンポくらい遅かったけど...
VimのCTRL-X補完について
この記事はVim Advent Calendar 2015の5日目の記事です。
Vimで補完といえばShougo
さんのプラグインneocomplete
が有名ですが、プラグインを使わなくてもCTRL-X サブモード
で補完を行うことが可能です。
この機能はブログや書籍などでたびたび紹介されてはいますが、文字だけではイメージがつきにくいところもあるのでGIFアニメで紹介してみたいと思います。
行(全体)補完: CTRL-X CTRL-L
if から始まる行と l から始まる行を補完(go)
検索対象はcomplete
オプションで設定可能
局所キーワード補完: CTRL-X CTRL-N / CTRL-X CTRL-P
現在のファイルから T で始まるキーワードを補完(perl)
辞書補完: CTRL-X CTRL-K
dictionary
オプションで設定したファイルから twist で始まる単語を補完
dictionary
オプションに使用するファイルを設定する必要がある(デフォルトは未設定)
set dictionary=/usr/share/dict/words
シソーラス補完: CTRL-X CTRL-T
thesaurus
オプションで設定したファイルから twister の類語を補完
thesaurus
オプションに使用するファイルを設定する必要がある(デフォルトは未設定)
set thesaurus=/usr/share/mythes/th_en_US_v2.dat
パスパターン補完: CTRL-X CTRL-I
インクルードしているSocket.pmから getpr で始まるキーワードを補完(perl)
検索対象はinclude
オプションとpath
オプションで設定可能
タグ補完: CTRL-X CTRL-]
読み込むtagsファイルはtags
オプションで設定可能
ファイル名補完: CTRL-X CTRL-F
/etc/y から始まるファイル名を補完
定義補完: CTRL-X CTRL-D
mixinを補完(sass)
検索対象はdefine
オプションとinclude
オプションとpath
オプションで設定可能
コマンドライン補完: CTRL-X CTRL-V
vimのコマンドと関数を補完
ユーザー定義補完: CTRL-X CTRL-U
completefunc
オプションに設定したCompleteMonthsで月の名前を補完
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)
スペリング補完: CTRL-X s / CTRL-X CTRL-S
頭文字が大文字になっていない単語と綴りが間違っている単語の修正候補を補完
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
Goのパッケージをgit subtreeで管理する
Go 1.5からVendoring機能が使えるようになったので外部パッケージをgit subtree
で管理してみた。
以下のコマンドで対象のリポジトリにパッケージを追加することができる。
※ --squash
をつけると取り込むパッケージのコミットを一つにまとめることができる
# usage: git subtree add --prefix=<prefix> <repository> <ref> $ git subtree add --prefix=vendor/github.com/zenazn/goji https://github.com/zenazn/goji v0.8.3 --squash
GO15VENDOREXPERIMENT
はデフォルトでは無効なのでビルドするときに有効にする必要がある。
$ GO15VENDOREXPERIMENT=1 go build
パッケージを更新するときはpull
を使う。
$ git subtree pull --prefix=vendor/github.com/zenazn/goji https://github.com/zenazn/goji v0.9.0 --squash
gitとgoさえあれば誰でもどこでも(ネットワークが使えなくても)ビルドできるので仕事で開発する時なんかに良さげ。
例
ディレクトリ構成
$ tree . ├── main.go └── vendor └── github.com └── zenazn └── goji
main.go
package main import ( "fmt" "net/http" "github.com/zenazn/goji" "github.com/zenazn/goji/web" ) func hello(c web.C, w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, %s!", c.URLParams["name"]) } func main() { goji.Get("/hello/:name", hello) goji.Serve() }
コミットグラフ
$ git log --graph --oneline * 2c05509 Merge commit '082b48ab2b6004bf43e3faa0bda84e9323a2cfce' |\ | * 082b48a Squashed 'vendor/github.com/zenazn/goji/' changes from 9a41ab2..ba6c4f2 * | b3823c4 Merge commit '7fed70cb0d2f008dfc30014f3f4829113b3c34e8' as 'vendor/github.com/zenazn/goji' |\ \ | |/ | * 7fed70c Squashed 'vendor/github.com/zenazn/goji/' content from commit 9a41ab2 * 0da4802 Initial commit
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
ビルド
このビルドスクリプトを
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あたりが有効だと多分ビルドできないので無効にするか以下を正しく設定する。