rcmdnk's blog

20171113_vimcolor_200_200

.vimrcを見直していたらColorScheme設定しているところがあって 上手くまとめたいな、と思いながら 実際の所使ってるcolorschemeを見てみたら 実はほとんど設定の無いテーマだったので 必要なものだけまとめて自分のテーマを作ってプラグインにした話。

Sponsored Links

これまでの設定

以下の様な内容の設定が入っていました。

.vimrc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
augroup MyColors
  autocmd!
  " for spell checks
  "autocmd ColorScheme * hi SpellBad cterm=inverse ctermbg=0
  autocmd ColorScheme * hi SpellBad cterm=underline ctermbg=0
  autocmd ColorScheme * hi SpellCap cterm=underline ctermbg=0
  autocmd ColorScheme * hi SpellLocal cterm=underline ctermbg=0
  autocmd ColorScheme * hi SpellRare cterm=underline ctermbg=0

  " Set all white characters on black background for current line
  if &cursorline
    autocmd ColorScheme * hi CursorLine cterm=underline
    autocmd InsertEnter * hi CursorLine cterm=bold
    autocmd InsertLeave * hi CursorLine cterm=underline

    " SpecialKey, needed for cursorline
    autocmd ColorScheme * hi link MySpecialKey SpecialKey
    if v:version >= 702
      autocmd VimEnter,WinEnter * let w:m_sp = matchadd('MySpecialKey', '\(\t\| \+$\)')
    else
      autocmd VimEnter,WinEnter * match MySpecialKey '\(\t\| \+$\)'
    end
  endif

  " colors for completion
  autocmd ColorScheme * hi Pmenu ctermbg=255 ctermfg=0 guifg=#000000 guibg=#999999
  autocmd ColorScheme * hi PmenuSel ctermbg=blue ctermfg=black
  autocmd ColorScheme * hi PmenuSbar ctermbg=0 ctermfg=9
  autocmd ColorScheme * hi PmenuSbar ctermbg=255 ctermfg=0 guifg=#000000 guibg=#FFFFFF

  " colors for diff mode
  autocmd ColorScheme * hi DiffAdd cterm=bold ctermbg=17 gui=bold guibg=slateblue
  autocmd ColorScheme * hi DiffChange ctermbg=22 guibg=darkgreen
  autocmd ColorScheme * hi DiffText cterm=bold ctermbg=52 gui=bold guibg=olivedrab
  autocmd ColorScheme * hi DiffDelete ctermbg=6 guibg=coral

  " Colors for search
  autocmd ColorScheme * hi Search term=reverse ctermfg=Red ctermbg=11 guifg=Black

  " Colors for SpecialKey
  autocmd Colorscheme * hi SpecialKey term=bold ctermfg=9

  " column
  autocmd ColorScheme * hi ColorColumn ctermbg=017

  " html
  autocmd ColorScheme * hi link htmlItalic LineNr
  autocmd ColorScheme * hi link htmlBold WarningMsg
  autocmd ColorScheme * hi link htmlBoldItalic ErrorMsg

  " two-byte space
  autocmd ColorScheme * hi link TwoByteSpace Error
  if v:version >= 702
    autocmd VimEnter,WinEnter * let w:m_tbs = matchadd('TwoByteSpace', ' ')
  else
    autocmd VimEnter,WinEnter * 2match TwoByteSpace ' '
  end
augroup END

colorscheme ron

まあ色々気になる所を調整していますが、 最後にあるようにcolorschemeはデフォルトで入っているronを使っています1

ron

色々他に公開されてるテーマとかも使ったりしましたが、 なんだかんだでもとから入ってるこれが一番見やすいかな、と思って 長らく使ってきてましたが、 ちょっとこのテーマの中身を見てみた所…

vim/ron.vim

見てもらうと分かる通りほとんどgVimでの設定です。 gVimを使うことはほとんどないのでほとんどの設定は意味なくて、 あるのはVisualモードの時に全体の色を反転させる、という設定くらい。

Visualモードはデフォルトだと白いオーバーレイみたいなのがかかる様になっています。

ちょっと試してみた所、デフォルトの方がむしろ良いかな、とも思ってしまった位で、 何故defaultにしないでronにしかのかしっかり覚えてませんが、 多分、default以外の何かにしようと思って決めただけなんだと思います。

上の自分設定にもguiの設定がありますが、 多分どこかからその設定をコピーしてきてctermの方だけ色設定を 変えてそのまま書いてただけだと思います。

rcmdnk-color.vim

ということでronをわざわざ使う必要は無い、という結論。

だったら上の設定をプラグインとしてまとめて 後々変えたい所をプラグインとしてカラースキーム設定して行こう、ということになりました。

特に特別なものでもないのでcolorschemeの名前もrcmdnkです。 プラグイン名もそれにしてしまうとちょっとあれなのでrcmdnk-color.vimに。

プラグインの作り方はcolorsというディレクトリを作ってそこにカラースキーマファイルを作るだけ。 これでdein.vimなどで

1
2
3
4
5
6
7
8
9
10
11
12
13
if dein#load_state(s:dein_dir)
  call dein#begin(s:dein_dir)
  ...
  call dein#add('rcmdnk/rcmdnk-color.vim')
  ...

  call dein#end()
  call dein#save_state()
endif
...
if dein#tap('rcmdnk-color.vim')
  colorscheme rcmdnk
endif

とかやれば導入できます。

中身は今回は簡単なものを作るのでデフォルトのスキーマを参考に。

vim/runtime/colors

まず最初に

rcmdnk.vim
1
2
3
4
5
6
set background=dark
hi clear
if exists('syntax_on')
  syntax reset
endif
let g:colors_name = expand('<sfile>:t:r')

みたいなのが大体どのカラースキームでも共通で必要なことです。 変えるとしたら最初のbackground。 暗いテーマならdark、明るいテーマならlight

その後でhi clearで一旦これまでのハイライトをクリア。 さらにSyntaxの定義もリセット。

g:colors_nameはcolorschemeに設定される値ですが、 ファイル名をそのままカラースキーム名にすることが多いので こんな感じでファイル名を取得して(.vimは取った形)与えます。

後は好きに書いていけば良いのですが、 作って1つ問題があったのが起動時に

Error detected while processing function <SNR>35_IndentGuidesEnable[1]..indent_guides#enable[8]..indent_guides#init_script_vars[7]..indent_guides#capture_hig
hlight:
line    2:
E411: highlight group not found: Normal

というエラーが出たこと。 これはvim-indent-guides というプラグインが Normalというハイライトグループが無いと行っています。 実際このプラグインの中でNormalのハイライトを取りにいっているところがあってそこでのエラーです。

vim-indent-guidesに限って言えばこれを回避する方法はあるのですが2、 他にも同じようにNormalを使う物があるかもしれないのでそこで問題無く動く様にしたい。

ここで他のカラースキームファイルを見てみると大概Normalを定義しています。 そんな中default では

default.vim
1
2
3
4
5
6
7
" This is the default color scheme.  It doesn't define the Normal
" highlighting, it uses whatever the colors used to be.
...
hi clear Normal
..
" Remove all existing highlighting and set the defaults.
hi clear

の様に単にhi clearとハイライト全体をクリアするのとは別に hi clear NormalNormalだけをクリアしています。

これをするとそれまで定義されていなくても

:hi Normal
Normal         xxx cleared

と、clearedという形で定義がでます。

ということで今回は特にNormalの色を変えたいわけではないので defaultに沿って hi clear Normalを加えておきました。

ちなみにronの方では

default.vim
1
hi Normal  guifg=cyan  guibg=black

とguiの設定だけですがこれでctermの方でも定義としては存在することになります。

その他の設定としては今のところデフォルトだと見にくいSpell checkに関するものや Diff modeの時の表示などを調整してますが、

default.vim
1
2
3
" Two byte space
hi link TwoByteSpace Error
autocmd VimEnter,WinEnter * 2match TwoByteSpace ' '

という設定は全角のスペースがある場合にそれを赤く(Error)表示させるためのものです。 最後のTwoByteSpace後の' 'の間には全角スペースが入ってます。

そんな感じで通常の関数名だとかのコードを書く時の色とか そういったところはほとんどデフォルトのままです。

今後

流石にカラースキームを全部書くつもりはないのであれですが、 これまでも時々色々見ては試したりはしています。

colorswat.ch/vim を見ると相変わらず solarizedmolokai jellybeans なんかが強いです。 ただ、solarizedやmolokaiはそれぞれ最後のアップデートがそれぞれ7年前、4年前です。 まあそれだけ安定しているものなので下手に変わらないほうが良いのだと思いますが。

一方で比較的新しい gruvboxhybrid と言った物がこれらを追っています(gruvboxなんかはスター数で2位に)。 これらのカラースキームは前述のカラースキームを色々参考にしながら作られてる様ですが、 比較的落ち着いた感じの表示になっています。

ただ、これらのテーマを使う時にはちょっと注意が必要で、 Gnu screenやtmuxを使っているとターミナルの背景色をきちんと把握できず、 真っ黒の背景を使ってる際にテキスト部分が灰色な背景になってしまうことがあります。

colors - Vim Colorscheme Weirdness for Background (Not Non-Text Area) - Super User

256 color support for vim background in tmux - Super User

ターミナルマルチプレクサ側で設定を変えたりターミナルの設定を変えたりすると 解決出来ますがちょっと面倒なので注意。

自分で色を変えたりしたい場合には 以下のブログで紹介されているSyntaxInfoコマンドを使うと 簡単にカーソル下のシンタックス情報が分かってはかどります。

Vim のカラースキームが微妙に気に食わないときの対処法 - 反省はしても後悔はしない

Sponsored Links
Sponsored Links

« Vimのincsearch.vimの機能が本体に取り込まれたらしいので設定変更 vim_ahkで有効にするアプリの変更もメニューから出来る様にした »