Vim のブログ

テキストエディター Vim の魅力、使い方のコツを初心者にも分かりやすく伝えていきたいと思います。

Vim のカスタマイズ 〜autocmd で自動処理〜

Vim の自動処理とイベント

.vimrc が読み込まれて中に記述されたコマンドが実行されるのは、Vim の起動時の一度だけです。

しかし、ここに autocmd というコマンドを書き加えることにより、特定のタイミングに対して自動で処理を追加することが出来ます。この自動処理を行える特定のタイミングを「イベント」と呼びます。ヘルプの

:h autocmd-events

から、ファイルが開かれた時、閉じられた時など、種々様々なイベントに対して自動処理を行うことが出来ることが確認できます。

autocmd

autocmd は

autocmd グループ名(オプション) イベント名 ファイルパターン nested(オプション) イベントに対して自動的に実行されるコマンド

という形の引数指定で呼び出すことが出来ます。グループ名と nested は必須ではありません。nested は、自動処理中に再帰的に autocmd を実行したい場合に指定します。基本的には不要ですが、詳しくは ヘルプを参照して下さい。グループ名については後で説明します。

ファイルパターン

どのようなファイルに対して自動処理を行いたいのかをファイルパターンを通じて指定することが出来ます。例えば、ファイルパターンとして*.htmlを指定すると、HTMLファイルのみに対して自動処理が行われます。

グループ

autocmd にグループを指定しておくと、そのグループの autocmd をまとめて解除することが出来ます。これは、同じ autocmd が何度も繰り返し登録されるのを避けるのに使われます。

また、グループは、augroup コマンドにより、一括指定することも出来ます。

" vimrc_autocmd グループの autocmd 登録を開始する
augroup vimrc_autocmd
  " 複数回、この部分が実行された場合に備えて、vimrc_autocmd グループの autocmd を一括解除する
  augroup!
  " 自動的に vimrc_autocmd に登録される
  autocmd ...
augroup END
" augroup の外でも、オプションを使って明示的にグループを指定することも可能。
autocmd vimrc_autocmd ...

このグループ指定と、それを用いた事前一括解除を怠ると、.vimrc が複数回読み込まれた時に自動処理が何重にも登録されることになり、Vim が重くなったり、異常な動作をする原因になるので注意しましょう。

この autocmd の具体的な使い方の例を別のページで紹介しています。

Vim のカスタマイズ 〜キー割り当て変更方法〜

キー割り当て変更

vi/Vimは最小限のキー操作で様々な事が行えるように作られています。ですが、
「どうしても使いにくいキー配置があるので、変えたい」、
「繰り返し行う複雑な操作を簡単に行いたい」ということがあります。
そんな時にキー割り当て変更が活躍します。

なお、キー割り当ての実例については、Vim のカスタマイズ 〜キー割り当て変更の実例〜 で紹介しています。

キー割り当て変更コマンド

キー割り当て変更コマンドは、下のように、モードごと、再割当(remap)の有無によって別の名前が割り当てられています。

モード再割当無し再割当有り
ノーマルモード+ビジュアルモード noremap map
コマンドラインモード+インサートモード noremap! map!
ノーマルモード nnoremap nmap
ビジュアル(選択)モード vnoremap vmap
コマンドラインモード cnoremap cmap
インサート(挿入)モード inoremap imap

このコマンドは、

コマンド名([n/v/c/i][nore]map]) <オプション> ユーザーが入力する操作 Vimが解釈する操作

という形で使います。オプションの有無は任意です。例えば、

nnoremap ; :

.vimrcに記入すると、ノーマルモードで ; (セミコロン)が入力された時に、Vimは本来の機能を呼び出す代わりに : (コロン)が入力されたとみなして、コマンドラインモードに入ります。

nnoremap  <C-c><C-c> :<C-u>nohlsearch<cr><Esc>

とすれば、 CTRL-C を2回押すことで検索文字列のハイライトを解除することが出来ます。この例のように < と > で囲うことで特殊なキーを指定することも出来ます。また割り当て先にコマンドラインモードのコマンド実行を指定することも出来ます。

キーの再割当て

nore がつかない、map/map!/nmap/vmap/cmap/imapといったコマンドを使った場合、キーの再割当てが発生します。つまり、Vimが解釈する操作は、「ユーザーが定義したキー割り当て」に従って行われます。これはユーザーの割り当てが変化するものである以上、混乱の元になる事が多いので、特に理由が無ければ noremap を用いて Vim の本来のキー割り当てによる指定を行う事をオススメします。

さらに詳しい情報

:h key-mapping

でヘルプを参照してみましょう。上記以外のモードに対応したコマンドや、<silent> や <buffer> といったオプションについても説明があります。

キー割り当ての注意

キーを機能に割り当てるのではなくて、別のキーを割り当てるようになっていることから分かるように、この機能は、元々、vi / Vimキーバインドを前提として、それに対して一部変更を行うためのものです。既存のキーバインドを丸ごと変えてしまうのではなくて、あまり違和感なく共存するようなキー割り当てを行うようにしましょう。

Vim のカスタマイズ 〜カラースキームで好みの配色にしよう〜

カラースキームとは?

Vim の表示の配色をまとめたパッケージです。配色は画面の印象を大きく左右します。長時間向かうことになるテキストエディターの画面ですから、好みの配色を見つけることはとても重要です。

前もって必要な準備

プラグイン管理ツールを使うのがカラースキームの導入の近道です。 NeoBundle でプラグインをインストールできるようにしておいて下さい。

いろんなカラースキームをインストールしてみよう

" solarized カラースキーム
  NeoBundle 'altercation/vim-colors-solarized'
" mustang カラースキーム
  NeoBundle 'croaker/mustang-vim'
" wombat カラースキーム
  NeoBundle 'jeffreyiacono/vim-colors-wombat'
" jellybeans カラースキーム
  NeoBundle 'nanotech/jellybeans.vim'
" lucius カラースキーム
  NeoBundle 'vim-scripts/Lucius'
" zenburn カラースキーム
  NeoBundle 'vim-scripts/Zenburn'
" mrkn256 カラースキーム
  NeoBundle 'mrkn/mrkn256.vim'
" railscasts カラースキーム
  NeoBundle 'jpo/vim-railscasts-theme'
" pyte カラースキーム
  NeoBundle 'therubymug/vim-pyte'
" molokai カラースキーム
  NeoBundle 'tomasr/molokai'

" カラースキーム一覧表示に Unite.vim を使う
  NeoBundle 'Shougo/unite.vim'
  NeoBundle 'ujihisa/unite-colorscheme'

.vimrc に上を追記して、NeoBundle でカラースキームと Unite.vim をインストールして読み込むようにして下さい。上には有名なカラースキームがひと通り含まれています。Unite.vim は様々な一覧表示を行うためのプラグインで、今回は、カラースキームの一覧表示に用います。

いろんなカラースキームを表示確認しよう

NeoBundleによるインストールが済んだら、コマンドラインモードで

:Unite colorscheme -auto-preview

を実行して下さい。

カラースキームが一覧表示されるので、jキーとkキーでカラースキームを選んでください。選んだものが即座に画面に反映されるので、画面で確認しながら好みのカラースキームを選んで下さい。

(私自身は jellybeans を愛用しています。)

.vimrc でカラースキームを指定しよう

colorscheme カラースキーム名

を .vimrc に書くことで、起動時に指定したカラースキームを読み込むことが出来ます。
同様にコマンドラインモードで、

:colorscheme カラースキーム名

を実行すると、Unite.vim を使わなくても直接カラースキームを指定することが出来ます。

参考にしたサイト

Vim のプラグインを探すのに役立つサイト

ウェブ上には Vim プラグインの情報は膨大にあるのですが、その中で、特に広くいろんなプラグインを見て回りたい場合に参考になるサイトを紹介します。

ワシのVimプラグインは百八式まであるぞ - daisuzu's notes
なんと、108 個もプラグインが紹介されています!リンクが貼られていないので、自分でプラグインのページを探す必要がありますが、大体、Vim のプラグインでどういうことが出来るのかをざっと見るのに便利だと思います。
Vimpusher
これもスゴイ!ユーザーが .vimrc で読み込んだプラグインを集計して、ランキングを表示してくれるウェブサービスです。プラグインの説明はありませんが、リンクが貼られているのでサイトをすぐ見つけることが出来ます。
vim online
本家のサイト。検索やソートが充実して、説明も十分あるのですが、英語で書かれているのと、最近、プラグイン公開の場が github に移ってしまったので、情報が古いという難点があります。
VimL most watched repositories
ソーシャルコーディングサイト Github で人気のある Vim プラグインのランキング。最近はこちらの方が参考になるかもしれませんね。
「vim プラグイン」でタグ検索(人気順) - はてなブックマーク
そして最後にはてなブックマーク。記事が古いものもありますが、体験談が添えられている記事が多いのはありがたいですね。

以上、プラグイン探しに役立てて下さい。プラグインのインストールについては、こちらの記事を参照してください。

Vim のカスタマイズ 〜 NeoBundle でプラグイン管理! 〜

プラグインとは?

Vim の動作は、VimScriptというプログラム言語によって拡張可能です。この VimScript を特定の用途のためにパッケージ化したものをプラグインと呼びます。

インターネット上には、無数の便利なVimプラグインが公開されています。好みのものをインストールして設定するだけで、Vim は何倍、いや何百倍にも便利になります。

プラグインマネージャープラグイン NeoBundle

お使いの Vim にプラグインをインストールする方法はいろいろあるのですが、プラグインを管理するためのプラグインを使うのが手っ取り早くてオススメです。今回は、私が使っている NeoBundle をご紹介します。

git コマンド

NeoBundle を使うためには、 git というコマンドが必要になります。それぞれの OS に対応した git をインストールしておいて下さい。

NeoBundle のインストール

まず、~/.vim/bundleというフォルダを作って、コマンドライン上でそのフォルダに移動して

git clone https://github.com/Shougo/neobundle.vim

というコマンドを実行して下さい。

.vimrc で NeoBundle を読み込む

.vimrcに、下のように追記して下さい。

" NeoBundle がインストールされていない時、
" もしくは、プラグインの初期化に失敗した時の処理
function! s:WithoutBundles()
  colorscheme desert
  " その他の処理
endfunction

" NeoBundle よるプラグインのロードと各プラグインの初期化
function! s:LoadBundles()
  " 読み込むプラグインの指定
  NeoBundle 'Shougo/neobundle.vim'
  NeoBundle 'tpope/vim-surround'
  " ...
  " 読み込んだプラグインの設定
  " ...
endfunction

" NeoBundle がインストールされているなら LoadBundles() を呼び出す
" そうでないなら WithoutBundles() を呼び出す
function! s:InitNeoBundle()
  if isdirectory(expand("~/.vim/bundle/neobundle.vim/"))
    filetype plugin indent off
    if has('vim_starting')
      set runtimepath+=~/.vim/bundle/neobundle.vim/
    endif
    try
      call neobundle#rc(expand('~/.vim/bundle/'))
      call s:LoadBundles()
    catch
      call s:WithoutBundles()
    endtry 
  else
    call s:WithoutBundles()
  endif

  filetype indent plugin on
  syntax on
endfunction

call s:InitNeoBundle()

neobundle.vim で plugin をモダンに管理する に比べると複雑になっていますが、これはプラグインがまだインストールされていない状態で Vim を起動した時にエラーが出ないようにするための分岐が入っているためです。

プラグインのインストール

以降、コマンドラインで :NeoBundleInstall を実行すると、関数 s:LoadBundles() の中で NeoBundle コマンドを使って指定したプラグインが自動でインストールされます。インストールされた後に、Vim を再起動するとプラグインが使えるようになっています。

プラグインの追加

その後、プラグイン を追加したくなったときは、 s:LoadBundles() の中で、追加したいプラグインを引数に与えて NeoBundle コマンドを呼び出すようにしてください。

その後、Vim を再起動して、.vimrc を再読み込みし、 :NeoBundleInstall を実行した後、もう一度 Vim を再起動してプラグインを読み込むのを忘れないで下さい。

NeoBundle コマンドの引数に与える文字列

上の .vimrc の例では、

  NeoBundle 'Shougo/neobundle.vim'
  NeoBundle 'tpope/vim-surround'

として2つのプラグインを読み込んでいます。それぞれ、

に対応しています。同じように、追加したいプラグインを github 上に見つけたら、URL からパスを抜き出して、NeoBundle に引数として渡すようにして下さい。

その他の NeoBundle のコマンド

:NeoBundleUpdate でインストール済みのプラグインを最新版に更新できます。

インストールした後、使わなくなって NeoBundle コマンドで読み込み指定しなくなったプラグインがある場合は、:NeoBundleClean を実行すると、削除することが出来ます。

どんなプラグインがあるのかな?

こちらの記事を参考にして下さい。

Vim のカスタマイズ 〜 set コマンド オススメまとめ 〜

これまで紹介してきた、set の option をまとめると下の通りです。このまま.vimrc ファイルの先頭に書き込みましょう。

各項目にコメントを添えたので、慣れてきたらそれを参考に自分好みに書き換えて下さい。

set nocompatible

" 画面表示の設定

set number         " 行番号を表示する
set cursorline     " カーソル行の背景色を変える
set cursorcolumn   " カーソル位置のカラムの背景色を変える
set laststatus=2   " ステータス行を常に表示
set cmdheight=2    " メッセージ表示欄を2行確保
set showmatch      " 対応する括弧を強調表示
set helpheight=999 " ヘルプを画面いっぱいに開く
set list           " 不可視文字を表示
" 不可視文字の表示記号指定
set listchars=tab:▸\ ,eol:↲,extends:❯,precedes:❮

" カーソル移動関連の設定

set backspace=indent,eol,start " Backspaceキーの影響範囲に制限を設けない
set whichwrap=b,s,h,l,<,>,[,]  " 行頭行末の左右移動で行をまたぐ
set scrolloff=8                " 上下8行の視界を確保
set sidescrolloff=16           " 左右スクロール時の視界を確保
set sidescroll=1               " 左右スクロールは一文字づつ行う

" ファイル処理関連の設定

set confirm    " 保存されていないファイルがあるときは終了前に保存確認
set hidden     " 保存されていないファイルがあるときでも別のファイルを開くことが出来る
set autoread   "外部でファイルに変更がされた場合は読みなおす
set nobackup   " ファイル保存時にバックアップファイルを作らない
set noswapfile " ファイル編集中にスワップファイルを作らない

" 検索/置換の設定

set hlsearch   " 検索文字列をハイライトする
set incsearch  " インクリメンタルサーチを行う
set ignorecase " 大文字と小文字を区別しない
set smartcase  " 大文字と小文字が混在した言葉で検索を行った場合に限り、大文字と小文字を区別する
set wrapscan   " 最後尾まで検索を終えたら次の検索で先頭に移る
set gdefault   " 置換の時 g オプションをデフォルトで有効にする

" タブ/インデントの設定

set expandtab     " タブ入力を複数の空白入力に置き換える
set tabstop=2     " 画面上でタブ文字が占める幅
set shiftwidth=2  " 自動インデントでずれる幅
set softtabstop=2 " 連続した空白に対してタブキーやバックスペースキーでカーソルが動く幅
set autoindent    " 改行時に前の行のインデントを継続する
set smartindent   " 改行時に入力された行の末尾に合わせて次の行のインデントを増減する

" 動作環境との統合関連の設定

" OSのクリップボードレジスタ指定無しで Yank, Put 出来るようにする
set clipboard=unnamed,unnamedplus
" マウスの入力を受け付ける
set mouse=a
" Windows でもパスの区切り文字を / にする
set shellslash
" インサートモードから抜けると自動的にIMEをオフにする
set iminsert=2

" コマンドラインの設定

" コマンドラインモードでTABキーによるファイル名補完を有効にする
set wildmenu wildmode=list:longest,full
" コマンドラインの履歴を10000件保存する
set history=10000

" ビープの設定

"ビープ音すべてを無効にする
set visualbell t_vb=
set noerrorbells "エラーメッセージの表示時にビープを鳴らさない

Vim のカスタマイズ 〜 タブ/インデントの設定 〜

この記事では、.vimrc上でset コマンドを使って vimコマンドラインモードの設定をするための option を紹介していきたいと思います。

option 名設定対象の説明値の種別オススメの設定
expandtab タブ入力を複数の空白入力に置き換える
(既存のタブには影響しない)
オン/オフ オン
tabstop 画面上でタブ文字が占める幅 数値 好みのタブ幅
shiftwidth 自動インデントでずれる幅 数値 好みのタブ幅
softtabstop 連続した空白に対してタブキーやバックスペースキーでカーソルが動く幅 数値 好みのタブ幅
autoindent 改行時に前の行のインデントを継続する オン/オフ オン
smartindent 改行時に入力された行の末尾に合わせて次の行のインデントを増減する オン/オフ オン

上の項目について、.vimrc に記入するのにオススメの設定をまとめると下の通りです。タブ幅は2としてみました。"(ダブルクウォート)から始まる部分はコメントです。

set expandtab "タブ入力を複数の空白入力に置き換える
set tabstop=2 "画面上でタブ文字が占める幅
set shiftwidth=2 "自動インデントでずれる幅
set softtabstop=2 "連続した空白に対してタブキーやバックスペースキーでカーソルが動く幅
set autoindent "改行時に前の行のインデントを継続する
set smartindent "改行時に入力された行の末尾に合わせて次の行のインデントを増減する