NeoVimでの配色の使用に関する問題


16

私の配色がtermvim の設定とどのように相互作用しているかを完全に理解していないため、neovimで正しく表示するための能力が妨げられています。

私の.vimrcファイルでは、問題の配色の正しい動作には設定が必要です

set term=xterm
set t_Co=256

これらの設定のいずれかを省略すると、配色が正しく表示されません。

正しく 正しいカラー表示 ない正しく 誤ったカラー表示 ない 異なる誤ったカラー表示

スキームは次のようになります。

set background=dark
hi clear
if exists("syntax_on")
    syntax reset
endif
let g:colors_name="impact3"

if exists("g:impact_transbg")
    hi Normal       ctermfg=255 ctermbg=none
    hi NonText      ctermfg=DarkGray  ctermbg=none

    hi Statement    ctermfg=Blue      ctermbg=none
    hi Comment      ctermfg=DarkGray  ctermbg=none cterm=bold term=bold
    hi Constant     ctermfg=173  ctermbg=none
    hi Identifier   ctermfg=Cyan      ctermbg=none
    hi Type         ctermfg=DarkGreen ctermbg=none
    hi Folded       ctermfg=0 ctermbg=235 cterm=underline term=none
    hi Special      ctermfg=Blue      ctermbg=none
    hi PreProc      ctermfg=LightGray ctermbg=none cterm=bold term=bold
    hi Scrollbar    ctermfg=Blue      ctermbg=none
    hi Cursor       ctermfg=white     ctermbg=none
    hi ErrorMsg     ctermfg=Red       ctermbg=none cterm=bold term=bold
    hi WarningMsg   ctermfg=Yellow    ctermbg=none
    hi VertSplit    ctermfg=0     ctermbg=0
    hi Directory    ctermfg=Cyan      ctermbg=DarkBlue
    hi Visual       ctermfg=White     ctermbg=Gray cterm=underline term=none
    hi Title        ctermfg=255     ctermbg=Blue
    hi String       ctermfg=Blue   ctermbg=none

    hi StatusLine   term=bold cterm=bold,underline ctermfg=White ctermbg=Black
    hi StatusLineNC term=bold cterm=bold,underline ctermfg=Gray  ctermbg=Black
    hi LineNr       term=bold cterm=bold ctermfg=2 ctermbg=None
    hi Search       ctermfg=Black ctermbg=2
    hi TabLine      ctermfg=0 ctermbg=DarkGray
    hi TabLineFill  ctermfg=DarkGray ctermbg=DarkGray
else
    hi Normal       ctermfg=White ctermbg=Black
    hi NonText      ctermfg=DarkGray  ctermbg=Black

    hi Statement    ctermfg=Blue      ctermbg=Black
    hi Comment      ctermfg=DarkGray  ctermbg=Black cterm=bold term=bold
    hi Constant     ctermfg=DarkCyan  ctermbg=Black
    hi Identifier   ctermfg=Cyan      ctermbg=Black
    hi Type         ctermfg=DarkGreen ctermbg=Black
    hi Folded       ctermfg=DarkGreen ctermbg=Black cterm=underline term=none
    hi Special      ctermfg=Blue      ctermbg=Black
    hi PreProc      ctermfg=LightGray ctermbg=Black cterm=bold term=bold
    hi Scrollbar    ctermfg=Blue      ctermbg=Black
    hi Cursor       ctermfg=white     ctermbg=Black
    hi ErrorMsg     ctermfg=Red       ctermbg=Black cterm=bold term=bold
    hi WarningMsg   ctermfg=Yellow    ctermbg=Black
    hi VertSplit    ctermfg=White     ctermbg=Black
    hi Directory    ctermfg=Cyan      ctermbg=DarkBlue
    hi Visual       ctermfg=White     ctermbg=DarkGray cterm=underline term=none
    hi Title        ctermfg=White     ctermbg=DarkBlue

    hi StatusLine   term=bold cterm=bold,underline ctermfg=White ctermbg=Black
    hi StatusLineNC term=bold cterm=bold,underline ctermfg=Gray  ctermbg=Black
    hi LineNr       term=bold cterm=bold ctermfg=White ctermbg=Black
endif

neovimでは、term設定できません。私は次のように$ TERMを手動で設定してneovimを起動しようとしました:

TERM=xterm nvim

これにより、通常のvim(.vimrcで用語を設定するのと同等)で色が正しく表示されますが、neovimでは次のようになります。

ここに画像の説明を入力してください

なぜの組み合わせであるset term=xtermset t_Co=256VIMこの配色の正しい表示を生成するのに必要では、なぜ設定の等価組み合わせはneovimに異なる結果を生成しますか?

編集:

デフォルトは $TERM=xterm256-colorあり、何らかの理由xtermで通常の​​vimでオーバーライドして、カラー表示を正しくする必要があります。環境変数をデフォルトの256に設定すると、neovimは次のようになります。

ここに画像の説明を入力してください

これはを使用した通常のvimと同じですxterm256-colorが、意図したとおりではありません。私の目標は、xtermハックがvimで必要/動作する理由と、neovimで同じように見えない理由を理解することです。

上記のenv変数設定では、多くの色が正しく表示されることに注意してください。顕著な例外は行番号と背景です。この特定の配色での色の指定方法が関係しているのではないかと思います。


1
$ TERMは、現在のシステムで一般に「正しい」と考えられるものに既に設定されています-256色が有効になっています。したがって、通常は古い端末との互換性のために必要なt_Coオプションは必要ありません。両方の構成行をコメントアウトするとどうなりますか?
デビッドロード

@David両方の設定行をコメントアウトすることは、コメントアウトすることと同じに見えset term=xtermます。
ギャル

テーマが正しくレンダリングされるときに使用するiTermカラー構成のスクリーンショットと、このスクリプトの実行からの出力を含めることができますか?
エリックプルイット

回答:


11

主な問題

あなたが経験している主な問題はあなたのコマンドの順序によって引き起こされます.vimrc

colorschemeを読み込んだ後g:impact_transbg変数を設定するため、colorschemeのステートメントでチェックすると変数は存在せ、colorschemeの2番目のバージョン(ブロック内)が使用されます。ifelse

修正するには、colorschemeをロードする行の上に変数を設定する行を移動するだけです。

let g:impact_transbg=1
colorscheme impact3

あなたはあなたから不要な行を削除することができます(そしてすべきです!).vimrc

set term=xterm
set background=dark
set t_Co=256

その他の問題

また、これがすべてどのように機能するかについてあなたが持つかもしれない他のいくつかの誤解/混乱をクリアすることができます:

'term'&の動作の説明't_Co'

$ TERMはに設定されていxterm256-colorます。Vimはこれを読み取り、terminfo(またはtermcap)を照会して、端末がサポートする色数を確認し、それに't_Co'応じて設定します 。$ TERMが正しい(あなたのものである)とterminfoデータベースにその端末の正しい情報が含まれている(あなたのものである)と仮定すると、手動でリセットする必要ありませ't_Co'

ただし、Vim 'term'をxtermに手動で設定しています。terminfoはVimにこの端末が8色しかサポートしていないことを伝えるため、これを追加 't_Co'すると誤って8に設定されます。手動で256に設定し't_Co' 直していますが、'term'設定を正しい値のままにしておく必要はありません。

ちなみに、あなたが変更した場合、't_Co'設定後に手動でg:impact_transbg、それは(カラースキームは、色の新しい番号に適応できるようにするため)カラースキームがリロードされ、およびのでg:impact_transbg され、今設定し、あなたが望む色を取得します。

(行設定を'term'省略した場合、.vimrcの最後の行に到達する't_Co'既に 256に設定されているため、colorschemeは再ロードされません。したがって、色が間違っています。)

要約すると、

term=xterm
colorscheme impact3
let g:impact_transbg=1
set t_Co=256

結果:'t_Co'256に設定すると、カラースキームが再ロードされ、色が正しくなります。

"term=xterm
colorscheme impact3
let g:impact_transbg=1
set t_Co=256

結果:Colorschemeはcolorschemeコマンドによってロードされ、変数は存在せず、色が間違っています。

term=xterm
colorscheme impact3
let g:impact_transbg=1
"set t_Co=256

結果:Colorschemeはcolorschemeコマンドによってロードされ、変数は存在せず、Vimは8色のみを使用し、色が間違っています。

"term=xterm
colorscheme impact3
let g:impact_transbg=1
"set t_Co=256

結果:Colorschemeはcolorschemeコマンドによってロードされ、変数は存在せず、色が間違っています。

let g:impact_transbg=1
colorscheme impact3

結果:Colorschemeはcolorschemeコマンドによって読み込まれ、変数存在するため、色が正しくなります。(そして、ボーナスとして、'term'そして't_Co'また正しいです!)

NeoVim 't_Co'では、他の回答者がすでに述べたように、単にsetの呼び出しが無視されるため、動作が異なります。

'background'

カラースキームを設定した後、を設定し'background'ます。この特定の カラースキームでは、カラースキームが最初に行うことはに設定'background'することなので、これは完全に不要'dark'です。

'background'カラースキームを読み込んだ後に設定することを提案する他の回答者には同意しないことに注意して ください。ColorSchemeはその値を使用し'background'て色を調整する場合があるため'background'、ColorSchemeをロードする前に設定する方が順序が明確です。(ただし、'background'設定を変更すると、Vimは読み込まれたカラースキームをリロードするため、'background'後で設定することでも機能することに注意してください。これは最適ではありません。)


1
おかげで、これは非常に徹底的であり、追加のコンテキストに感謝します。
コンラッドマイヤー

@ConradMeyerそれはあなたに役立ってうれしいです!
リッチ

7

Neovimの場合、違いはt_CoありTERMません。

あなたは、呼び出しているset background=dark呼び出し後colorscheme impact3set background=darkカラースキームの一番下に移動し、vimrcから他の呼び出しを削除します。

から:help 'background'

When 'background' is set Vim will adjust the default color 
groups for the new value.
...
When a color scheme is loaded (the "g:colors_name" variable 
is set) setting 'background' will cause the color scheme to 
be reloaded.

参照:https : //github.com/justinmk/molokai/commit/aa1cc201c743dd7d1b80bb2e2b5fbb7894ebfe5f

私の目標は、xtermハックがvimで必要/動作する理由と、neovimで同じように見えない理由を理解することです。

  • Neovimは、 "true color"t_Co有効にしない限り256を想定しているため、気にしません。
    • 実際、Neovimはすべてのt_*オプションを無視します:help t_xx。をご覧ください。
  • Neovim &termは無意味なので設定できません。Neovimは、ユニビリウムおよびその他のメカニズムを使用して端末機能を検出します。

neovimの用語能力検出と `t_ *`設定に関する洞察に感謝します。set background=darkステートメントの冗長コピーを削除して位置を変更しても効果はありませんでしたが、基礎となる実装に関するこれらの詳細は、私にとってはるかに価値があります。
ガル

2

iTerm2を使用しているので、これを試すことができます。

  1. 優先ウィンドウを開く+,
  2. profilesタブに移動
  3. 左のリストで現在のプロファイルを確認してください
  4. terminal右側のタブをクリックします
  5. Report terminal type選びますxterm-256color
  6. できた

ご提案ありがとうございます。についての備考で上記を編集しましたxterm-256color。このように既に設定されている端末タイプを見つけるための手順を実行しました。
ギャル

2

素晴らしいNeoVim機能がありません。このようなことを支援するenv変数があります。これをnvimrcに入れてみてください:

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 " True gui colors in terminal

または

export NVIM_TUI_ENABLE_TRUE_COLOR=1

シェルで。


FYI:これはを使用する必要がありますguifgguibg。OPのカラースキームはとを使用ctermfgctermbgます。
ジャスティンM.キーズ

ああ、あなたは正しい。ごめんなさい!
ヤンヴァンハレウィン

2

オプションを設定する必要があります

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 
set termguicolors

あなたの.config/nvim/init.vim


これらのオプションは使用のためのものguifgguibg色の値をRGB。質問の配色はとのみを使用ctermfgctermbgます。
トミー

1
これは私のためにそれをしました。TERMはすでにxterm-256colorでした。ありがとう!
Qix

1

特定の配色は、実際にはif-else句内の2セットの配色であることに注意してください。変数の存在は、g:impact_transbg希望する色のセットを選択します。これはもともと、これが由来する配色の透明な背景を説明するためのものでした。

2番目のカラースキームとif-elseステートメントg:impact_transbgをコメントアウトするset term=xtermと(目的のカラースキームのみを残し、を使用しない)、vimとneovimの両方で意図した動作が得られset t_Co=256ます。

これ$TERM=xterm-256colorsは、vimとneovimの両方で条件if exists("g:impact_transbg")が失敗するが、設定の組み合わせが

set term=xterm
set t_co=256

条件が成功することを許可しました。上記のif-else句削除することで重大な問題は解決しますが、.vimrcの用語設定とのペア間の相互作用については謎が残っていますg:impact_transbg


0

次の$TERMように環境変数を設定してみてください。

TERM=xterm-256color

また、次のようにnvimを起動してみてください。

export TERM=xterm-256color; nvim

それが機能する$TERM場合は、シェルで変数を永続的に設定します。


アイデアをありがとう、ジェフ。に関する質問を編集しましたxterm-256color。エクスポート経由で$ TERMを設定しても効果はありません。
ギャル

0

最近、ソラリゼーションをテーマにこの問題が発生しました。問題はTERMenv変数に起因していました。

ターミナルエミュレーター(私の場合はターミネーター)にenv TERM=xterm-256color zsh、通常どおりにzshを起動するのではなく実行するように指示することで修正しました。


OP TERMはすでにxterm-256colorに設定されています。別の問題が発生していたと思います。
リッチ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.