Vim の Color Scheme を自作するためのあれこれ

Vim Advent Calendar 2011 : ATND 22日目です。

担当は、
2011 My Best Life Changing 賞が
vim-arpeggio を使った

"jk同時押しでEsc
call arpeggio#load()
Arpeggionmap jk <Esc>
Arpeggioimap jk <Esc>
Arpeggiocmap jk <Esc>
Arpeggiovmap jk <Esc>
Arpeggionmap fj <Esc>
Arpeggioimap fj <Esc>
Arpeggiocmap fj <Esc>
Arpeggiovmap fj <Esc>

を今更選ぶ nishikawasasaki です。



設定やプラグインのお話が多そうなので、気分を変えて Vim の見た目の話です。
Vim の Color Scheme について軽く触れてみたいと思います。
なんだかんだで世の中見た目が9割9分、自分好みの色設定を作れば Vim で作業してるだけでハッピーですね!
特に最近の gVim を対象にしています。

colorscheme コマンド

まずは基本ですね。
カラースキームを確認/適用するためのコマンドです。

:colorscheme
:colo

で実行できます。
引数なしで現在のカラースキーム名を表示します。
引数としてカラースキームの名前を与えると、その名前のカラースキームを適用します。
カラースキーム定義ファイルは runtimepath に設置してある必要がありますので、

~/.vim/colors

などに格納しておきましょう。
環境によっては上記に定義ファイルを置いてもうまく読み込まない時があります。
そんな時は自分の設定ファイル置き場ではなく、
Vim 本体のファイル類がある runtime 以下のそれらしいところに定義ファイルを置くと
無理矢理ですが読み込んで動いたりします。

最初のおまじない

さてカラースキームの定義ファイルでだいたい最初に書いてある部分を見ていきます。

set background=dark

背景色の設定を行います。
Vim はあらかじめ明るい背景(白)にあった色のセットと、
反対に暗い背景(黒)にあった色のセットを持っています。
明るい場合は light を指定し、暗い場合は dark を指定します。
イメージする Vim の見た目に応じて light か dark を設定してくださいね。


次に

hi clear
if exists("syntax_on")
  syntax reset
endif

の部分ではシンタックスハイライトの設定を一度全てデフォルトに戻しています。
これから設定する色の定義と今の色の定義が混ざらないようにする為ですね。

let colors_name = "hogehoge"

ここではカラースキームの名前を設定しています。
上の例では hogehoge カラースキームということになります。
ファイル名も hogehoge.vim とすることが多いようです。

設定 highlight コマンド

さて本題の色を設定する部分 highlight コマンドです。

:highlight
:hi

で実行できます。
基本的な文法は

:hi 色の設定を行う属性名 見た目の設定をするグループ名

のようになります。
「属性」と「グループ」の例を挙げると

hi Normal guifg=#000000

の場合「Normal」グループに対して #000000 の色を「guifg」属性へ設定する、となります。
Normal はハイライトされない部分、つまり普通の文字すべてに影響します。
guifg は gui あり(gVim)で使った場合のフォントカラーに影響します。
まとめると「通常部分の文字色を黒(#000000)に設定する」となります。


属性の代表的なものは

属性名 設定箇所 引数
guifg gVimの文字の色 色コード#6桁 or 定義済み色名
guibg gVimの文字の背景色 色コード#6桁 or 定義済み色名
gui gVimの文字の属性(太字など) bold(太字)、underline(下線)などなど
ctermfg ターミナルで起動したVimの文字色 色コード#6桁 or 定義済み色名 or ターミナルの色番号
ctermbg ターミナルで起動したVimの文字背景色 色コード#6桁 or 定義済み色名 or ターミナルの色番号
cterm ターミナルで起動したVimの文字の属性 bold(太字)、underline(下線)などなど

のように GUI 用とターミナル用の設定項目があります。

2011/12/23追記
コメントで指摘頂きました。
ターミナルでは6桁色コードでの指定はできませんでした。
また色コード指定可能部分は3桁の色コードでもOKです。
thincaさんありがとうございます。



グループは構文(シンタックス)を似たもの同士でまとめたものであって、
そのシンタックスに色の設定(ハイライト)をすることで Vim 上で色の表現が行われます。
色や効果を設定できるグループにはあらかじめ設定されているものがあり、
代表的なものには

属性名 設定箇所
Cursor カーソル位置
CursorIM カーソル位置(IMEオンの時)
Normal 通常時のテキスト
Search 検索文字
Visual 選択箇所
StatusLine ステータスライン

などがあります。
他にもシンタックスハイライトとして自分でも定義できます。
プログラミング言語用のプラグインを導入すると
その言語の構文に応じて色を表現してくれると思いますが、
この自由に定義できる機能を利用しています。
全て挙げているとキリがありませんので Vim の highlight ヘルプを御覧ください。
他にも Vim 付属の Color Scheme を見てみるとなんとなく名前から想像が付くと思います。

応用編

上記の方法で好きなグループに好きな色を設定していくと、自分好みの色設定を作ることが可能です。
しかし全体のバランスを考えると同じ色を複数箇所で使ったりするなど
色の設定もシステマチックに設定したくなります。
そんな時に使えるのが

link

です。

hi link グループA グループB

と記述することでAの設定をそのままBに適用することができます。
同じ色番号を複数箇所に嫌になるほど書くのを軽減できると思います。

もっと応用編

いきなりですが下のリンク先をご覧ください。

colors/Tomorrow-Night-Bright.vim
GitHub : https://github.com/ChrisKempson/Vim-Tomorrow-Theme/blob/master/colors/Tomorrow-Night-Bright.vim

見た目がこれまで考えてきたものと違いますね。
Color SchemeVIm の設定ですので、この Color Scheme ではプログラム的に色の設定を行なっています。

let s:foreground = "eaeaea"

変数 foreground に "eaeaea" をいう文字列をセットしているように、
色コードを変数にセットして複数箇所で使い回しできるように工夫しています。
そして highlight 自体も直接呼び出すのではなく、

fun <SID>X(group, fg, bg, attr)
		if a:fg != ""
			exec "hi " . a:group . " guifg=#" . a:fg . " ctermfg=" . <SID>rgb(a:fg)
		endif
		if a:bg != ""
			exec "hi " . a:group . " guibg=#" . a:bg . " ctermbg=" . <SID>rgb(a:bg)
		endif
		if a:attr != ""
			exec "hi " . a:group . " gui=" . a:attr . " cterm=" . a:attr
		endif
	endfun

の部分のように
引数で与えたグループ、文字色、背景色、属性から highlight を組み立てる関数を作成しています。
こうしておくことで

call <SID>X("Visual", "", s:selection, "")

のように Visual グループへ変数 selection 、つまり"424242"の色を設定することができています。

終わりに

どうでしょう、自分好みの Color Scheme を作れそうでしょうか?
といっても実際に Color Scheme を作る際は、上のような仕組みを意識することはなく
ひたすら色コードを設定しては悩み、設定しては悩みを繰り返す作業がメインだと思います・・・。


上に挙げた Tomorrow-Night-Bright.vim はとても良いですね!
また

Vim color scheme: Wombat « Lars H. Nielsen’s Blog :
http://dengmao.wordpress.com/2007/01/22/vim-color-scheme-wombat/

も良い感じです。


さてキレイに作られたものをそのまま使っても良いのですが、
そのままでは色がつかなかった部分、自分の好みではない色の部分などちょこちょこ修正しながら、
世界に1つだけの自分好みの Vim を作り上げてみてください!
超カッコイイ!超かわいい!超スイーツ()!超目に優しい!いろんな自分好みがあると思います。
きっとエディタを立ち上げて文字を表示・入力しているだけで楽しくなれるはずです!!


さて駆け足な上に長くなってしまいましたがココらへんで22日目を終わります。
明日 2011/12/23 は @LeafCage さんです。