Plugin
vimを使ってみたけどもの足りない。
機能拡張しましょう。
そうそれがプラグイン!!
偉大なvimプラグイン作成者の方々に拍手
管理する
現代は管理社会ですなんでも管理しちゃいましょー
Neobundle.vim が最高にクールなので使わない手はないです。
NeoBundle.vimとは
次世代的なプラグイン管理方法です。
プラグインの導入から更新、削除までサックサックです。
環境
vim -> バージョンが7.3.885以降のもので +Lua だと言うことなしです。
git -> 入れといてください
導入
実際に導入するにあたって、楽ちんな方法を提供します。
" neobundle settings {{{if has('vim_starting')setnocompatible " neobundle をインストールしていない場合は自動インストールif!isdirectory(expand("~/.vim/bundle/neobundle.vim/"))
echo "install neobundle..." " vim からコマンド呼び出しているだけ neobundle.vim のクローン
:call system("git clone git://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim")endif " runtimepath の追加は必須setruntimepath+=~/.vim/bundle/neobundle.vim/endifcall neobundle#begin(expand('~/.vim/bundle'))letg:neobundle_default_git_protocol='https'" neobundle#begin - neobundle#end の間に導入するプラグインを記載します。
NeoBundleFetch 'Shougo/neobundle.vim'" ↓こんな感じが基本の書き方
NeoBundle 'nanotech/jellybeans.vim'" vimrc に記述されたプラグインでインストールされていないものがないかチェックする
NeoBundleCheck
call neobundle#end()filetype plugin indent on" どうせだから jellybeans カラースキーマを使ってみましょうsett_Co=256syntaxoncolorscheme jellybeans
NeoBundleCheck の段階で jellybeans.vim がインストールされていないので、インストールするか聞かれます。
y を入力して Enter を押すとインストールされます。
基本的なコマンドは以下の通りです。
コマンド | 動作 |
---|---|
:NeoBundleInstall | プラグインの新規インストール |
:NeoBundleUpdate | インストール済みのプラグインのアップデート |
:NeoBundleClean | vimrcにないインストール済みのプラグインを掃除 |
:NeoBundleSource | プラグインの読み込み直し、後述の NeoBundleLasy と組み合わせたりする |
構文
導入だけしたい人はここは必要ないので飛ばして
" 通常(user/repositoryはそれぞれgithubのユーザ,リポジトリを入力)" []で囲っているものは省略可
NeoBundle 'user/repository' [,version] [,option]
"遅延読み込み(stringは'hoge'といった文字列,listは['hoge','foo','bar']といった文字列の集合)" filetypesにはhtml,css,c,cpp,java,ruby,eruby,pythonといったものを入れる" commandsには各プラグインのコマンドを入れる" insertはインサートモードに入ったときに読み込まれる" mappngsはプラグインで定められているマッピングを呼び出したとき" autoload内でそのプラグインに見合っただけ入れとけばオーケー(補完プラグインならinsertのみなど)
NeoBundleLasy 'user/repository', {
\ 'autoload' : {
\ 'filetypes' : string|list,
\ 'commands' : string|list,
\ 'mappings' : string|list,
\ 'insert' : 1,
\ }}
"フェッチ(ランタイムパスに追加されないらしい)
NeoBundleFetch 'user/repository'"その他オプション" スクリプトの実施'build' : {'windows|mac|cygwin|unix|others' : string}
" 最小動作バージョンの記載(バージョンの書き方はいろいろある)'vim_version' : '7|7.3|7.3.885'" 無効化(conditionが1と評価された際にプラグインを無効化する)
'disabled : condition
オススメのプラグイン
個人的におすすめのプラグインを大量紹介します
unite.vim
他のプラグインからも使われている便利ランチャー
普段使いではファイラーとして機能しているが、奥に秘めたポテンシャルは無限大
下記の設定では<C-u><C-f>
と<C-u><C-u>
に特にお世話になっている
ファイルの一覧では<C-n>
は下方向、<C-p>
は上方向に移動する。(この操作方法のプラグインが結構ある)
また上端の > に文字列を入力することによって絞り込み検索を行い、Enterでファイルを開くのが基本の使い方
なお、Escを2回押すことで unite で開いたバッファを閉じるように設定している(楽)
※<C- >
はCtrl+いずれかのキー
NeoBundle 'Shougo/unite.vim'" unite {{{letg:unite_enable_start_insert=1
nmap <silent><C-u><C-b> :<C-u>Unite buffer<CR>
nmap <silent><C-u><C-f> :<C-u>UniteWithBufferDir -buffer-name=filesfile<CR>
nmap <silent><C-u><C-r> :<C-u>Unite -buffer-name=registerregister<CR>
nmap <silent><C-u><C-m> :<C-u>Unite file_mru<CR>
nmap <silent><C-u><C-u> :<C-u>Unite buffer file_mru<CR>
nmap <silent><C-u><C-a> :<C-u>UniteWithBufferDir -buffer-name=files buffer file_mru bookmark file<CR>auFileType unite nmap <silent><buffer><expr><C-j> unite#do_action('split')auFileType unite imap <silent><buffer><expr><C-j> unite#do_action('split')auFileType unite nmap <silent><buffer><expr><C-l> unite#do_action('vsplit')auFileType unite imap <silent><buffer><expr><C-l> unite#do_action('vsplit')auFileType unite nmap <silent><buffer><ESC><ESC>qauFileType unite imap <silent><buffer><ESC><ESC><ESC>q" }}}
neomru.vim
unite.vim から独立した機能
ファイル履歴を記録してくれている
こいつがいれば上記unite.vimにより<C-u><C-u>
で以前開いたファイルが表示される
NeoBundle 'Shougo/neomru.vim', {
\ 'depends' : 'Shougo/unite.vim'
\ }
vimproc
vim に非同期処理を提供してくれる縁の下の力持ち
多数のプラグインがこいつを頼りに高速化している。
NeoBundle 'Shougo/vimproc', {
\ 'build' : {
\ 'windows' : 'make -f make_mingw32.mak',
\ 'cygwin' : 'make -f make_cygwin.mak',
\ 'mac' : 'make -f make_mac.mak',
\ 'unix' : 'make -f make_unix.mak',
\ },
\ }
neocomplete.vim
クソ強力な補完機能を使えるようになる
vimproc で高速化するやつ...というか作者が一緒
これも<C-n>
,<C-p>
で補完候補から選択する
if has('lua')
NeoBundleLazy 'Shougo/neocomplete.vim', {
\ 'depends' : 'Shougo/vimproc',
\ 'autoload' : { 'insert' : 1,}
\ }
endif" neocomplete {{{letg:neocomplete#enable_at_startup =1letg:neocomplete#auto_completion_start_length =3letg:neocomplete#enable_ignore_case =1letg:neocomplete#enable_smart_case =1letg:neocomplete#enable_camel_case =1letg:neocomplete#use_vimproc =1letg:neocomplete#sources#buffer#cache_limit_size =1000000letg:neocomplete#sources#tags#cache_limit_size =30000000letg:neocomplete#enable_fuzzy_completion =1letg:neocomplete#lock_buffer_name_pattern ='\*ku\*'" }}}
vimshell
vim からシェルを簡単に使えるようになる便利屋
画面分割してシェルを使える VimShellPop がオススメ。
縮めて vp にマッピングしている。
NeoBundleLazy 'Shougo/vimshell', {
\ 'depends' : 'Shougo/vimproc',
\ 'autoload' : {
\ 'commands' : [{ 'name' : 'VimShell','complete' : 'customlist,vimshell#complete'},
\ 'VimShellExecute','VimShellInteractive',
\ 'VimShellTerminal','VimShellPop'],
\ 'mappings' : ['<Plug>(vimshell_switch)']
\ }}
" vimshell {{{
nmap <silent>vs :<C-u>VimShell<CR>
nmap <silent> vp :<C-u>VimShellPop<CR>" }}}
yankround
ヤンク履歴を保持してくれるやつ
ペースト後に<C-p>
か<C-n>
を押してヤンク履歴をペーストできる
いわゆるコピペ拡張
unite.vim と連携することで、(この設定では)\<C-p>
で履歴一覧から絞り込み検索が可能
NeoBundle 'LeafCage/yankround.vim'" yankround.vim {{{
nmap p<Plug>(yankround-p)
nmap P<Plug>(yankround-P)
nmap <C-p><Plug>(yankround-prev)
nmap <C-n><Plug>(yankround-next)letg:yankround_max_history =100nnoremap<Leader><C-p> :<C-u>Unite yankround<CR>"}}}
vimfiler
ファイルビューア<C-u><C-j>
で縦分割で開閉できるように設定してみた
NeoBundleLazy 'Shougo/vimfiler', {
\ 'depends' : ["Shougo/unite.vim"],
\ 'autoload' : {
\ 'commands' : [ "VimFilerTab","VimFiler","VimFilerExplorer","VimFilerBufferDir" ],
\ 'mappings' : ['<Plug>(vimfiler_switch)'],
\ 'explorer' : 1,
\ }}
" vimfiler {{{letg:vimfiler_as_default_explorer =1letg:vimfiler_safe_mode_by_default =0letg:vimfiler_data_directory = expand('~/.vim/etc/vimfiler')nnoremap<silent><C-u><C-j> :<C-u>VimFilerBufferDir -split -simple -winwidth=35-no-quit -toggle<CR>" }}}
vim-autoclose
括弧を自動的に閉じてくれるやつ
なお閉じ括弧は入力しても2重にならない素敵仕様
NeoBundle 'Townk/vim-autoclose'
vim-endwise:.vimrc
ifとかの終了宣言を自動で挿入してくれるやつ
デフォルト設定で十分使える
NeoBundleLazy 'tpope/vim-endwise', {
\ 'autoload' : { 'insert' : 1,}}
memolist.vim
メモを取る際に使う
mnで新規作成、mlでリスト化、mgでgrep検索が出来るようにマッピングしてみた
なおメモはGoogleDriveにてクラウド管理するようにしている
g:memolist_pathでお好きなディレクトリへどうぞ
NeoBundle 'glidenote/memolist.vim'" memolist {{{letg:memolist_path = expand('~/GoogleDrive/memolist')letg:memolist_gfixgrep =1letg:memolist_unite =1letg:memolist_unite_option ="-vertical -start-insert"nnoremap mn :MemoNew<CR>nnoremapml :MemoList<CR>nnoremap mg :MemoGrep<CR>" }}}
vim-easymotion
超高速で簡単な移動がコンセプト
s[key][key][done]の4キーで画面内のどこへでも移動可能
移動したいところを決めてから使う最強のカーソル移動プラグイン
詳しくは過去記事を参照してください
NeoBundle 'Lokaltog/vim-easymotion'" vim-easymotion {{{letg:EasyMotion_do_mapping =0
nmap s<Plug>(easymotion-s2)
xmap s<Plug>(easymotion-s2)
omap z <Plug>(easymotion-s2)
nmap g/ <Plug>(easymotion-sn)
xmap g/ <Plug>(easymotion-sn)
omap g/ <Plug>(easymotion-tn)letg:EasyMotion_smartcase =1
map <Leader>j<Plug>(easymotion-j)
map <Leader>k<Plug>(easymotion-k)letg:EasyMotion_startofline =0letg:EasyMotion_keys ='QZASDFGHJKL;'letg:EasyMotion_use_upper =1letg:EasyMotion_enter_jump_first =1" }}}
vim-easy-align
文章整形プラグイン
以下のような文章も即すっきり
ビジュアルモードで選択して、Enter -> 整列したい文字
ちなみに整形したい文字列が複数個ある下記のような場合は Enter -> * -> 整列したい文字(下記例では:)
"整形前letg:jellybeans_overrides = {
\ 'Todo': { 'guifg': '151515','guibg': 'd0d033','ctermfg': 'Black','ctermbg': 'Yellow' },
\ 'SignColumn': { 'guifg': 'f0f0f0','guibg': '333333','ctermfg': 'Black','ctermbg': 'Gray' },
\ 'SpecialKey': { 'guifg': 'a0a000','guibg': '2c2c2c','ctermfg': 'Black','ctermbg': 'Gray' },
\ }
"整形後letg:jellybeans_overrides = {
\ 'Todo': { 'guifg': '151515','guibg': 'd0d033','ctermfg': 'Black','ctermbg': 'Yellow' },
\ 'SignColumn': { 'guifg': 'f0f0f0','guibg': '333333','ctermfg': 'Black','ctermbg': 'Gray' },
\ 'SpecialKey': { 'guifg': 'a0a000','guibg': '2c2c2c','ctermfg': 'Black','ctermbg': 'Gray' },
\ }
NeoBundleLazy 'junegunn/vim-easy-align', {
\ 'autoload': {
\ 'commands' : ['EasyAlign'],
\ 'mappings' : ['<Plug>(EasyAlign)'],
\ }}
" vim-easy-align {{{
vmap <Enter><Plug>(EasyAlign)
nmap <Leader>a<Plug>(EasyAlign)" }}}
vim-markdown
vimのデフォルトシンタックスでは不満がある人向け
NeoBundle 'rcmdnk/vim-markdown'" vim-markdown {{{letg:vim_markdown_folding_disabled =1" }}}
以降は個人的な推奨プラグイン
neosnippet, neosnippet-snippets
スニペット補完をおこなえるようになる
if<C-k>
などは多くの言語で動作するだろう
"#:conditionで入力状態となり、<C-k>で数字順に数字:ターゲットへジャンプ(下記はvimでの実行例)if #:condition
<`0:TARGET`>endif
NeoBundleLazy 'Shougo/neosnippet', {
\ 'depends' : 'Shougo/neosnippet-snippets',
\ 'autoload' : {
\ 'insert' : 1,
\ 'filetypes' : 'snippet',
\ }}
NeoBundle 'Shougo/neosnippet-snippets'letg:neosnippet#data_directory = expand('~/.vim/etc/.cache/neosnippet')letg:neosnippet#snippets_directory = [expand('~/.vim/.bundle/neosnippet-snippets/neosnippets'),expand('~/dotfiles/snippets')]
" neosnippet {{{
imap <C-k><Plug>(neosnippet_expand_or_jump)smap<C-k><Plug>(neosnippet_expand_or_jump)" }}}
switch.vim
true/falseとかを瞬時に切り替えてくれる
+と-で切り替えられるようにしている
設定すれば独自でトグルを設定できるが、私は使っていない
NeoBundle 'AndrewRadev/switch.vim'" switch {{{
nmap + :Switch<CR>
nmap - :Switch<CR>" }}}
vim-surround, matchit
テキストを囲みや括弧のカーソル移動機能を拡張する
いろいろと機能豊富
NeoBundle 'tpope/vim-surround'
NeoBundle 'vim-scripts/matchit.zip'
open-browser.vim, dash.vim
カーソルの下にある単語をgxで調べてくれるopen-browser
カーソルの下にあるプログラムの単語を<Leader>d
(Leaderはデフォルトだと\
)でDashで調べてくれるdash.vim
Dash for Mac - Documentation Browser, Snippet Manager - Kapeli
からダウンロードしてください(Homebrewでもダウンロード可)
:.vimrc
NeoBundle 'tyru/open-browser.vim'" open-browser {{{letg:netrw_nogx =1" disable netrw's gx mapping.
nmap gx <Plug>(openbrowser-smart-search)" }}}
NeoBundle 'rizzatti/dash.vim'" dash.vim {{{
nmap <Leader>d<Plug>DashSearch
" }}}
プログラム言語に関係するプラグインたち
vim-quickrun
実行する言語で自動化の環境が整っている場合あまり出番がない
でもプログラムの編集状態から実行できて、出力を得られる\r
で編集中のファイルを実行する
NeoBundleLazy 'thinca/vim-quickrun', {
\ 'autoload' : {
\ 'mappings' : [['n','\r']],
\ 'commands' : ['QuickRun']
\ }}
" quickrun {{{letg:quickrun_config = {}
letg:quickrun_config._ = { 'runner' : 'vimproc',
\ 'runner/vimproc/updatetime' : 200,
\ 'outputter/buffer/split' : ':botright 8sp',
\ 'outputter' : 'multi:buffer:quickfix',
\ 'hook/close_buffer/enable_empty_data' : 1,
\ 'hook/close_buffer/enable_failure' : 1,
\ }
nnoremap<expr><silent><C-c> quickrun#is_running() ? quickrun#sweep_sessions() : "\<C-c>"" }}}
emmet-vim
HTMLのタグを一瞬で入力できる。<C-y>n
で次のタグ入力箇所に移動できたりフロントエンドの味方
利用している技術はこれだと思うemmet
div.container>div.col-sm-6.col-md-4>ul*3>ui*4
<!-- 入力後にインサートモードのまま<C-y>,で↓の状態に --><divclass="container"><divclass="col-sm-6 col-md-4"><ul><ui></ui><ui></ui><ui></ui><ui></ui></ul><ul><ui></ui><ui></ui><ui></ui><ui></ui></ul><ul><ui></ui><ui></ui><ui></ui><ui></ui></ul></div></div>
NeoBundleLazy 'mattn/emmet-vim', {
\ 'autoload' : {
\ 'filetypes' : ['html','html5','eruby','jsp','xml','css','scss','coffee'],
\ 'commands' : ['<Plug>ZenCodingExpandNormal']
\ }}
" emmet {{{letg:use_emmet_complete_tag =1letg:user_emmet_settings = {
\ 'lang' : 'ja',
\ 'html' : {
\ 'indentation' : ' '
\ }}
" }}}
その他
いっぱいあるのでプラグインの設定だけにして、説明は省きます
" Ruby on rails
NeoBundle 'tpope/vim-rails'
NeoBundleLazy 'alpaca-tc/alpaca_tags', {
\ 'depends': ['Shougo/vimproc','Shougo/unite.vim'],
\ 'autoload' : {
\ 'commands' : ['Tags','TagsUpdate','TagsSet','TagsBundle','TagsCleanCache'],
\ 'unite_sources' : ['tags']
\ }}
" alpaca_tags {{{letg:alpaca_update_tags_config = {
\ '_' : '-R --sort=yes --languages=-js,html,css',
\ 'ruby': '--languages=+Ruby',
\ }
" }}}
NeoBundleLazy 'vim-ruby/vim-ruby', {
\ 'autoload' : {'filetypes' : ['ruby','eruby']}}
" Python
NeoBundleLazy "davidhalter/jedi-vim", {
\ "autoload": {
\ "filetypes": ["python","python3","djangohtml"],
\ },
\ "build" : {
\ "mac" : "pip install jedi",
\ "unix" : "pip install jedi",
\ }}
" jedi-vim {{{letg:jedi#rename_command ='<Leader>R'letg:jedi#goto_assignments_command ='<Leader>G'autocmdFileType python setlocalomnifunc=jedi#completions
letg:jedi#completions_enabled =0letg:jedi#auto_vim_configuration =0" }}}" html
NeoBundle 'hail2u/vim-css3-syntax'
NeoBundle 'othree/html5.vim'" javascript
NeoBundle 'kchmck/vim-coffee-script'
NeoBundle 'moll/vim-node'
NeoBundle 'pangloss/vim-javascript'
最後に
今回は酔っぱらいながら書いているので誤字、脱字、間違いの指摘大歓迎です。
以前の投稿からだいぶ間隔が空きました。
北の大地から東京に出てきて仕事をして、AWSに関することを多く学んだのでいずれそれを記事にする予定です。
vimの記事については未定