お正月暇だったので、やってみたかったけど業務中にはやりづらいことをやってみるシリーズです。
vimのカラースキームを自作してみようかと思います。
ファイル設置場所
下記ディレクトリにファイルを作成して、カラースキームの設定を記述していきます。
.vim/colors/${scheme_name}.vim
困った時の一次情報はコチラ
設定方法
カラースキームファイルに下記のように記述します。
:hi normal guifg=#e8e8d3 guibg=#333333 guisp=#151515 gui=NONE ctermfg=187 ctermbg=236 cterm=NONE
hi
というコマンドにグループ名と各色や装飾を設定していきます。
guiとcterm
gvimとvimで設定方法が異なります。
gui**
にgvimの色を、cterm**
にvimの色を設定していきます。
**の部分に入る種類は下記
fg
: テキストカラー
bg
: 背景色
sp
: 装飾の色(下線の色など)
そして、無記入の場合は装飾の種類を指定します。たとえば、 gui=underline
と書くと下線が追加されます。
カラーグループ
特定のsyntaxをカラーグループに分類して色をつけていきます
デフォルトのカラーグループは下記がよくまとまっていて参考になります。
vimrcのcolorグループ一覧
link
全てのsyntaxに色をつけていくのは流石にしんどいですが、下記のように記述すると既存のカラーグループの色を指定のカラーグループにリンクできます。便利。
:hi[ghlight][!] [default] link {from-group} {to-group}
現在のカラーを確認する
:hi
コマンドで現在設定されているシンタックスカラーグループが確認できる。
いろいろプラグインを入れているとカラーグループが500パターンくらい出てきてビビるが、
ほぼリンクが貼られているだけなので、実際に設定すべきは下記60パターン程だけ。
" SpecialKey
" EndOfBuffer
" NonText
" Directory
" ErrorMsg
" IncSearch
" Search
" MoreMsg
" ModeMsg
" LineNr
" CursorLineNr
" Question
" StatusLine
" StatusLineNC
" VertSplit
" Title
" Visual
" VisualNOS
" WarningMsg
" WildMenu
" Folded
" FoldColumn
" DiffAdd
" DiffChange
" DiffDelete
" DiffText
" SignColumn
" Conceal
" SpellBad
" SpellCap
" SpellRare
" SpellLocal
" Pmenu
" PmenuSel
" PmenuSbar
" PmenuThumb
" TabLine
" TabLineSel
" TabLineFill
" CursorColumn
" CursorLine
" ColorColumn
" QuickFixLine
" StatusLineTerm
" StatusLineTermNC
" MatchParen
" ToolbarLine
" ToolbarButton
" Comment
" Constant
" Special
" Identifier
" Statement
" PreProc
" Type
" Underlined
" Ignore
" Error
" Todo
この カラーグループにguiとctermの色を設定していけばよい だけです!
そして実装
すべきことがわかったので、実装開始します。ワクワクですね。
愚直に60グループに対して hi
コマンドで色を指定していってもよいのですが、できるだけ楽をしたいので少し工夫して設定してみます。
使う色を選ぶ
全部個別に定義するのはしんどいので、カラーチャートをみながら、先に使用するカラーをguiとcterm両方の色をpickupして変数にいれておきます。
let s:colors = {
\ "none" : { "gui": "NONE", "cterm": "NONE"},
\ "black" : { "gui": "#000000", "cterm": "0"},
\ "deepgray" : { "gui": "#262626", "cterm": "235"},
\ "darkgray" : { "gui": "#303030", "cterm": "236"},
\ "gray" : { "gui": "#8a8a8a", "cterm": "244"},
\ "lightgray" : { "gui": "#a8a8a8", "cterm": "248"},
\ "white" : { "gui": "#eeeeee", "cterm": "255"},
\ "magenda" : { "gui": "#ff0087", "cterm": "198"},
\ "perple" : { "gui": "#5f5fd7", "cterm": "62"},
\ "blue" : { "gui": "#005fff", "cterm": "27"},
\ "cyan" : { "gui": "#00afd7", "cterm": "38"},
\ "green" : { "gui": "#00af5f", "cterm": "35"},
\ "yellow" : { "gui": "#ffd700", "cterm": "220"},
\ "orange" : { "gui": "#ffaf00", "cterm": "214"},
\ "red" : { "gui": "#af0000", "cterm": "124"},
\ }
文字色や背景色を指定するとguiもctermもいい感じに設定してくれるヘルパーを定義
fun! s:SetColor(group, fg, bg, attr, sp)
let l:hi = "hi ".a:group.
\" guifg=".s:colors[a:fg].gui.
\" guibg=".s:colors[a:bg].gui.
\" guisp=".s:colors[a:sp].gui.
\" gui=".a:attr.
\" ctermfg=".s:colors[a:fg].cterm.
\" ctermbg=".s:colors[a:bg].cterm.
\" cterm=".a:attr
execute l:hi
endfun
カラーグループと色を配列につっこみます
一旦確認できるように2,3個定義しておきます。
let s:syntaxes = [
\ ["Normal", "white", "darkgray","none","none"],
\ ["Visual", "black", "yellow", "none","none"],
\ ["SpecialKey", "cyan", "none", "none","none"],
\ ]
そしてそれをぶん回してヘルパーに突っ込む
for syntax in s:syntaxes
call s:SetColor(syntax[0], syntax[1], syntax[2], syntax[3], syntax[4])
endfor
ここまでで確認ができます
:hi
コマンドで syntaxes
変数に定義したカラーグループが設定されていることが確認できます。
あとは、残りの色も確認しながら一つ一つ定義していくだけです!
根気がいる作業ですが、自分で考えた組み合わせの色でコーディングできるとテンションが上がるのでおすすめです!