Help us understand the problem. What is going on with this article?

Vim pluginへの入門[NeoBundle.vim]

More than 3 years have passed since last update.

2016.03.06 追記

NeoBundle.vimはより高速に動作するDein.vimを推しています。(作者が同じ)
これから始める方や速さを求める方はこちらも御覧くださいNeoVim、そしてdein.vimへ

Plugin

vimを使ってみたけどもの足りない。
機能拡張しましょう。
そうそれがプラグイン!!
偉大なvimプラグイン作成者の方々に拍手

管理する

現代は管理社会ですなんでも管理しちゃいましょー
Neobundle.vim が最高にクールなので使わない手はないです。

NeoBundle.vimとは

次世代的なプラグイン管理方法です。
プラグインの導入から更新、削除までサックサックです。

環境

vim -> バージョンが7.3.885以降のもので +Lua だと言うことなしです。
git -> 入れといてください

導入

実際に導入するにあたって、楽ちんな方法を提供します。

.vimrc
" neobundle settings {{{
if has('vim_starting')
  set nocompatible
  " 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 の追加は必須
  set runtimepath+=~/.vim/bundle/neobundle.vim/
endif
call neobundle#begin(expand('~/.vim/bundle'))
let g: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 カラースキーマを使ってみましょう
set t_Co=256
syntax on
colorscheme 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+いずれかのキー

.vimrc
NeoBundle 'Shougo/unite.vim'
" unite {{{
let g: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=files file<CR>
nmap <silent> <C-u><C-r> :<C-u>Unite -buffer-name=register register<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>
au FileType unite nmap <silent> <buffer> <expr> <C-j> unite#do_action('split')
au FileType unite imap <silent> <buffer> <expr> <C-j> unite#do_action('split')
au FileType unite nmap <silent> <buffer> <expr> <C-l> unite#do_action('vsplit')
au FileType unite imap <silent> <buffer> <expr> <C-l> unite#do_action('vsplit')
au FileType unite nmap <silent> <buffer> <ESC><ESC> q
au FileType unite imap <silent> <buffer> <ESC><ESC> <ESC>q
" }}}

neomru.vim

unite.vim から独立した機能
ファイル履歴を記録してくれている
こいつがいれば上記unite.vimにより<C-u><C-u>で以前開いたファイルが表示される

.vimrc
NeoBundle 'Shougo/neomru.vim', {
  \ 'depends' : 'Shougo/unite.vim'
  \ }

vimproc

vim に非同期処理を提供してくれる縁の下の力持ち
多数のプラグインがこいつを頼りに高速化している。

.vimrc
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>で補完候補から選択する

.vimrc
if has('lua')
  NeoBundleLazy 'Shougo/neocomplete.vim', {
    \ 'depends' : 'Shougo/vimproc',
    \ 'autoload' : { 'insert' : 1,}
    \ }
endif

" neocomplete {{{
let g:neocomplete#enable_at_startup               = 1
let g:neocomplete#auto_completion_start_length    = 3
let g:neocomplete#enable_ignore_case              = 1
let g:neocomplete#enable_smart_case               = 1
let g:neocomplete#enable_camel_case               = 1
let g:neocomplete#use_vimproc                     = 1
let g:neocomplete#sources#buffer#cache_limit_size = 1000000
let g:neocomplete#sources#tags#cache_limit_size   = 30000000
let g:neocomplete#enable_fuzzy_completion         = 1
let g:neocomplete#lock_buffer_name_pattern        = '\*ku\*'
" }}}

vimshell

vim からシェルを簡単に使えるようになる便利屋
画面分割してシェルを使える VimShellPop がオススメ。
縮めて vp にマッピングしている。

.vimrc
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>で履歴一覧から絞り込み検索が可能

.vimrc
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)
let g:yankround_max_history = 100
nnoremap <Leader><C-p> :<C-u>Unite yankround<CR>
"}}}

vimfiler

ファイルビューア
<C-u><C-j>で縦分割で開閉できるように設定してみた

.vimrc
NeoBundleLazy 'Shougo/vimfiler', {
  \ 'depends' : ["Shougo/unite.vim"],
  \ 'autoload' : {
  \   'commands' : [ "VimFilerTab", "VimFiler", "VimFilerExplorer", "VimFilerBufferDir" ],
  \   'mappings' : ['<Plug>(vimfiler_switch)'],
  \   'explorer' : 1,
  \ }}


" vimfiler {{{
let g:vimfiler_as_default_explorer  = 1
let g:vimfiler_safe_mode_by_default = 0
let g: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重にならない素敵仕様

.vimrc
NeoBundle 'Townk/vim-autoclose'

vim-endwise:.vimrc

ifとかの終了宣言を自動で挿入してくれるやつ
デフォルト設定で十分使える

.vimrc
NeoBundleLazy 'tpope/vim-endwise', {
  \ 'autoload' : { 'insert' : 1,}}

memolist.vim

メモを取る際に使う
mnで新規作成、mlでリスト化、mgでgrep検索が出来るようにマッピングしてみた
なおメモはGoogleDriveにてクラウド管理するようにしている
g:memolist_pathでお好きなディレクトリへどうぞ

.vimrc
NeoBundle 'glidenote/memolist.vim'

" memolist {{{
let g:memolist_path = expand('~/GoogleDrive/memolist')
let g:memolist_gfixgrep = 1
let g:memolist_unite = 1
let g:memolist_unite_option = "-vertical -start-insert"
nnoremap mn  :MemoNew<CR>
nnoremap ml  :MemoList<CR>
nnoremap mg  :MemoGrep<CR>
" }}}

vim-easymotion

超高速で簡単な移動がコンセプト
s[key][key][done]の4キーで画面内のどこへでも移動可能
移動したいところを決めてから使う最強のカーソル移動プラグイン
詳しくは過去記事を参照してください

.vimrc
NeoBundle 'Lokaltog/vim-easymotion'
" vim-easymotion {{{
let g: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)
let g:EasyMotion_smartcase = 1
map <Leader>j <Plug>(easymotion-j)
map <Leader>k <Plug>(easymotion-k)
let g:EasyMotion_startofline = 0
let g:EasyMotion_keys = 'QZASDFGHJKL;'
let g:EasyMotion_use_upper = 1
let g:EasyMotion_enter_jump_first = 1
" }}}

vim-easy-align

文章整形プラグイン
以下のような文章も即すっきり
ビジュアルモードで選択して、Enter -> 整列したい文字
ちなみに整形したい文字列が複数個ある下記のような場合は Enter -> * -> 整列したい文字(下記例では:)

"整形前
let g: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' },
  \ }

"整形後
let g: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' },
  \ }
.vimrc
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のデフォルトシンタックスでは不満がある人向け

.vimrc
NeoBundle 'rcmdnk/vim-markdown'
" vim-markdown {{{
let g:vim_markdown_folding_disabled = 1
" }}}

以降は個人的な推奨プラグイン

neosnippet, neosnippet-snippets

スニペット補完をおこなえるようになる
if<C-k>などは多くの言語で動作するだろう

"#:conditionで入力状態となり、<C-k>で数字順に数字:ターゲットへジャンプ(下記はvimでの実行例)
if #:condition
  <`0:TARGET`>
endif
.vimrc
NeoBundleLazy 'Shougo/neosnippet', {
  \ 'depends' : 'Shougo/neosnippet-snippets',
  \ 'autoload' : {
  \   'insert' : 1,
  \   'filetypes' : 'snippet',
  \ }}
NeoBundle 'Shougo/neosnippet-snippets'

let g:neosnippet#data_directory     = expand('~/.vim/etc/.cache/neosnippet')
let g: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とかを瞬時に切り替えてくれる
+と-で切り替えられるようにしている
設定すれば独自でトグルを設定できるが、私は使っていない

.vimrc
NeoBundle 'AndrewRadev/switch.vim'

" switch {{{
nmap + :Switch<CR>
nmap - :Switch<CR>
" }}}

vim-surround, matchit

テキストを囲みや括弧のカーソル移動機能を拡張する
いろいろと機能豊富

.vimrc
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 {{{
let g: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で編集中のファイルを実行する

.vimrc
NeoBundleLazy 'thinca/vim-quickrun', {
  \ 'autoload' : {
  \   'mappings' : [['n', '\r']],
  \   'commands' : ['QuickRun']
  \ }}

" quickrun {{{
let g:quickrun_config = {}
let g: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>,で↓の状態に -->
    <div class="container">
      <div class="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>
.vimrc
NeoBundleLazy 'mattn/emmet-vim', {
  \ 'autoload' : {
  \   'filetypes' : ['html', 'html5', 'eruby', 'jsp', 'xml', 'css', 'scss', 'coffee'],
  \   'commands' : ['<Plug>ZenCodingExpandNormal']
  \ }}
" emmet {{{
let g:use_emmet_complete_tag = 1
let g:user_emmet_settings = {
  \ 'lang' : 'ja',
  \ 'html' : {
  \   'indentation' : '  '
  \ }}
" }}}

その他

いっぱいあるのでプラグインの設定だけにして、説明は省きます

.vimrc
" 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 {{{
let g: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 {{{
let g:jedi#rename_command = '<Leader>R'
let g:jedi#goto_assignments_command = '<Leader>G'
autocmd FileType python setlocal omnifunc=jedi#completions
let g:jedi#completions_enabled = 0
let g: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の記事については未定

okamos
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした