LoginSignup
3
0

More than 3 years have passed since last update.

NeoVimのカラースキームが思った色と違うときの解決方法

Posted at

これはVimおよび、ターミナル初心者(ターミナルという名称が正しいのかもよく分かっていない)がNeoVimのカラースキームと戦った話を備忘録としてまとめたものである。

結論を急ぐ人は以下の文章を飛ばして結論を見てください。
結論

序章

何度かNeoVimなどの環境構築していたときに、どうも思ったカラースキームの色にならないということが多々あった。
スクリーンショット 2020-01-13 0.41.58.png
こんな感じ。
これはseagullというカラースキームでPythonファイルを開いた様子。
vim colorsにあるサンプルだとこんな感じ。
スクリーンショット 2020-01-13 0.43.55.png
ぜんぜん違う。
一体誰が思ってもない色を出してくるエディタでプログラミングしないといけないのか。

環境

  • macOS mojave
  • NeoVim (0.4.3)
  • Terminal.app (2.9.5)
  • iTerm2 (3.3.7)

ターミナルが取り扱う色

どうやらターミナルのテーマによって捉えている色が違うらしい。
Blackと言いつつ#000000ではなく、#0b0e0dみたいな。
ちなみに#0b0e0dはこれである。私の目では#000000との違いが一切わからない。

Terminal.appのテーマをいじりながらneovimを起動していたら、ところどころ色が変わっていた。
なので、ターミナルで設定されている色を基準に色を使っているっぽい。
スクリーンショット 2020-01-13 0.42.35.png
左:Terminal.appのテーマBasicでneovimを起動し、カラースキームseagullを対応させたもの
右:Terminal.appのテーマHomebrewでneovimを起動し、カラースキームseagullを対応させたもの
ほとんど変わりがないように見えるが、よく見るとカーソルの色が違う。背景の透明度はTerminal.appのテーマの影響。

ターミナルが出力できる色

Tearminal.app>環境設定>プロファイル>詳細のところにxterm-256colorとある。
なので256色は出せるのだろうと、素人目の予想を建てる。

MacのTerminalとvimで256色の確認
これを参考にしつつTerminal.appが出力できる色を調べていると、ちゃんと256色出せることが判明。しかし、先程の結果を見て分かる通り、256色出せたところでTerminal.appの色設定に影響されてしまう。

ターミナル環境 (iTerm, vim, tmux) をフルカラーで使う
いろいろ調べているとこの記事にたどり着いた。最近のターミナルだと256色じゃ飽き足らず、24bitのフルカラーを表示する気でいる。なんて卑しいんだ。
このフルカラーを使う規格(?)をTrue Colorというらしい。名前からして色が正確に出力されそうだ。このページに確認するスクリプトまで載ってある。非常に助かった。

TrueColor.md
True Colorに対応しているorしていないターミナルのリストが載っているページ。
ここを見ると、どうやらTerminal.appはTrue Colorに対応していないらしい。TrueToneとか載せる暇あるならTerminal.appにTrue Colorを載せてくれApple。

というわけで、Terminal.appを捨て、iTerm2をインストール。

7割正しくなった

iTerm2を起動し、早速NeoVimを起動。先程同様にカラースキームseagullを適応させてみる。
スクリーンショット 2020-01-13 0.52.59.png
惜しい。Terminal.appのときよりも雰囲気は近くなった。しかし、まだサンプルのseagullには程遠い。

また調べていると、次の記事が見つかった。
Vimでtermguicolorsをオンにしたらちょっとハマった話
どうやらVimでTrueColorを使うときにはtermguicolorsオプションを有効にすることで、端末上でもTrueColorが使えるらしい。
というわけでset termguicolorsで有効にする。
スクリーンショット 2020-01-13 1.10.05.png
若干は違うけども、98%くらい思っていた色が出た。これにて解決。

結論

ターミナルのカラースキームとvimのカラースキームを対応させる。当たり前だろうけど

  1. 使っているターミナルがTrue Colorに対応しているか調べる。対応していないなら乗り換える。
  2. NeoVimでTrue Colorを有効にするset termguicolorsを実行する
  3. True Colorに対応しているカラースキームを当てる。

おまけ

更に調べてみると、どうやらVimの色を設定する際に色の指定の属性として、次のような指定方法があるとのこと。

key 意味
term 白黒端末での属性
cterm カラー端末での属性
ctermfg カラー端末での文字色
ctermbg カラー端末での背景色
gui GUI での属性
font GUI でのフォント
guifg GUI での文字色
guibg GUI での背景色
guisp GUI での波線色

そしてこのオプションはこのような動作をするらしい。

termguicolors をオンにして使用されるのはguifgguibgだけで、特に書いてないですが、guiは使われません。
引用:Vimでtermguicolorsをオンにしたらちょっとハマった話

True Color対応のカラースキームの確認方法として、カラースキームのファイルにguifgguibgが設定されているかを調べればいいんじゃないのかと思ったりした。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0