NeoVim'de Renk Şemasını Kullanmayla İlgili Sorun


16

Renk termdüzenimin vim'deki ayarla nasıl etkileşime girdiğini tam olarak anlayamıyorum ve bu, neovim'de doğru bir şekilde görüntülenmesini sağlama yeteneğimi engelliyor.

.Vimrc dosyamda, söz konusu renk düzeninin doğru davranışının ayarlanması gerekiyor

set term=xterm
set t_Co=256

Bu ayarlardan herhangi birini atlamak renk düzeninin yanlış görüntülenmesine neden olur:

doğru Doğru Renkli Ekran yanlış Yanlış Renkli Ekran farklı yanlış Farklı Yanlış Renkli Ekran

Şema şöyle görünür:

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'de termayarlanamaz. Ben böyle bir manuel olarak ayarlanmış $ TERM ile neovim çağırmayı denedim:

TERM=xterm nvim

Bu, normal vim'de (yani .vimrc'de terim ayarına eşdeğer) renklerin doğru görüntülenmesini sağladı, ancak neovim'de şöyle görünüyor:

resim açıklamasını buraya girin

Neden kombinasyonu olan set term=xtermve set t_Co=256ayarların eşdeğer kombinasyonu neovim içinde farklı bir sonuç üretir neden gerekli vim bu renk düzeni doğru görüntü üretmek ve nasıl?

Düzenle:

Varsayılan $TERM=xterm256-color , nedense şekilde geçersiz olması gerekir ki xtermdoğru renk ekranı yapmak düzenli vim. 256 varsayılan ortam değişkeni ile neovim şöyle görünür:

resim açıklamasını buraya girin

Bu, normal vim ile aynıdır xterm256-color, ancak amaçlandığı gibi değildir. Amacım xterm hackinin neden gerekli olduğunu / vim'de çalıştığını ve neovim'de neden aynı görünmediğini anlamak.

Renklerin çoğunun yukarıdaki terim değişken ayarı ile doğru göründüğüne dikkat edin, dikkate değer istisnalar satır numaraları ve arka plandır. Bu özel renk şemasında renklerin belirtilme şeklinin dahil olabileceğinden şüpheleniyorum.


1
$ TERM, halihazırda modern sistemlerde 'doğru' kabul edilen şeye ayarlanmıştır - 256 renk etkin. Bu nedenle, normalde eski terminallerle uyumluluk için kullanılan t_Co seçeneği gerekli olmamalıdır. Her iki yapılandırma satırına da yorum yaparsanız ne olur?
David Lord

@David Her iki yapılandırma satırını da yorumlamak, yorum yapmakla aynı görünür set term=xterm.
Gall

Tema doğru oluşturulduğunda kullandığınız iTerm renk yapılandırmasının bir ekran görüntüsünü ve bu komut dosyasını çalıştırmanın çıktısını ekleyebilir misiniz?
Eric Pruitt

Yanıtlar:


11

Ana mesele

Karşılaştığınız ana sorun, içindeki komutların sırasından kaynaklanmaktadır .vimrc.

Sen set g:impact_transbgdeğişkeni sonra sen ColorScheme yük ve değişken bu yüzden değil ColorScheme en tarafından kontrol edildiğinde var ifdeyimi ve (içinde ColorScheme ikinci versiyonu elsebloğu) kullanılır.

Düzeltmek için, değişkeni ayarlayan satırı renk şemasını yüklediğiniz satırın üzerine taşımanız yeterlidir:

let g:impact_transbg=1
colorscheme impact3

Daha sonra gereksiz satırları kendinizden kaldırabilirsiniz (ve yapmalısınız!) .vimrc:

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

Diğer sorunlar

Ayrıca, bunların nasıl çalıştığıyla ilgili sahip olabileceğiniz diğer birkaç yanlış anlama / karışıklığı da giderebilirim:

'term'& İşlevinin davranışını açıklama't_Co'

$ TERM tutarınız olarak ayarlandı xterm256-color. Vim bunu okur ve terminalin kaç rengi desteklediğini bulmak için terminfo (veya termcap) sorgular ve sonra 't_Co'buna göre ayarlanır . $ TERM'nizin doğru (sizinki) olduğunu ve terminfo veritabanınızın bu terminal için doğru bilgileri içerdiğini (sizinki) asla manuel olarak sıfırlamanız gerekmediğini varsayarsak 't_Co'.

Ancak, Vim'leri el 'term'ile xterm olarak ayarlıyorsunuz . Terminfo'nuz Vim'e bu terminalin sadece 8 rengi desteklediğini söyler, bu yüzden bu ekleme 't_Co'yanlış 8'e ayarlanır. Manuel olarak 256'ya 't_Co' geri dönüyorsunuz, ancak 'term'ayarı doğru değerde bırakmış olsaydınız, .

Bu arada sen değiştirdiğinizde, 't_Co'ayar sonra elle g:impact_transbg, bu ColorScheme (ColorScheme renklerin yeni sayısına uyum sağlamak için) yeniden yüklenmesi neden olur ve çünkü g:impact_transbg edilir şimdi set, size arzu renkleri olsun.

(Hat ayar ile 'term'atlanmış, 't_Co'bir zaten ColorScheme yeniden edilmez böylece .vimrc içinde ikinci satıra geldiğinizde 256 olarak ayarlanır ve:. Dolayısıyla yanlış renkler)

Özetlemek gerekirse:

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

Sonuç: 256'ya 't_Co'ayarlandığında, renkler doğru olduğunda Colorscheme yeniden yüklenir .

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

Sonuç: Colorscheme colorschemekomutla yüklenir , değişken mevcut değildir, renkler yanlıştır.

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

Sonuç: Colorscheme colorschemekomutla yüklenir , değişken mevcut değildir ve Vim yalnızca 8 renk kullanır, renkler yanlıştır.

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

Sonuç: Colorscheme colorschemekomutla yüklenir , değişken mevcut değildir, renkler yanlıştır.

let g:impact_transbg=1
colorscheme impact3

Sonuç: Renk ş tarafından yüklenen colorschemekomutu, değişken yapar renkleri doğru yüzden mevcuttur. (Ve bonus olarak 'term've 't_Co'aynı zamanda doğrudur!)

Davranış NeoVim'de farklıdır, çünkü 't_Co'diğer cevaplayıcıların daha önce de bahsettiği gibi set çağrısı göz ardı edilir.

'background'

Renk şemasını ayarladıktan sonra da ayarlarsınız 'background'. Bunun için özellikle ColorScheme ki ilk şey setine çünkü ColorScheme, bu tamamen gereksizdir 'background'için 'dark'.

'background'Colorscheme'inizi yükledikten sonra ayarlamanız gerektiğini öneren diğer cevaplayıcı ile aynı fikirde olmadığımı unutmayın. Colorscheme 'background', renklerini ayarlamak için değerini kullanabilir , bu nedenle 'background'colorscheme'i yüklemeden önce ayarlamak daha açık bir sıralamadır. ( 'background'Ayarı değiştirirseniz , Vim'in yüklü renk simgelerini yeniden yükleyeceğini unutmayın, bu nedenle 'background'daha sonra ayarlamak da işe yarayacaktır: bu sadece optimal değildir.)


1
Teşekkürler, bu son derece kapsamlı ve ek bağlamı takdir ediyorum.
Conrad Meyer

@ConradMeyer Sizin için yararlı olduğuna sevindim!
Zengin

7

Neovim durumunda t_Cove TERMhiçbir fark yaratmayın.

Çağrısından set background=darkönce ve sonra çağırıyorsunuz colorscheme impact3. Taşı set background=darkColorScheme dibine ve kaldırmak için vimrc diğer çağrı.

Gönderen :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.

Ayrıca bakınız: https://github.com/justinmk/molokai/commit/aa1cc201c743dd7d1b80bb2e2b5fbb7894ebfe5f

Amacım xterm hackinin neden gerekli olduğunu / vim'de çalıştığını ve neden neovim'de aynı görünmediğini anlamak.

  • Neovim umursamıyor t_Coçünkü "gerçek rengi" etkinleştirmediğiniz sürece 256 olduğunu varsayar .
    • Aslında Neovim tüm t_*seçenekleri görmezden geliyor , bakın :help t_xx.
  • Neovim &termayarlanmasına izin vermiyor çünkü anlamsız. Neovim, terminal yeteneklerini tespit etmek için unibilium ve diğer mekanizmaları kullanır .

neovim terim yetenek tespiti ve `t_ *` ayarlarıyla ilgili görüşleriniz için çok teşekkürler. İfadenin yedek kopyasının kaldırılması ve yeniden konumlandırılmasının set background=darkbir etkisi olmamıştır, ancak temeldeki uygulama hakkındaki bu ayrıntılar benim için çok daha değerlidir.
Gall

2

İTerm2 kullandığınızı görüyorum, bu yüzden bunu deneyebilirsiniz:

  1. Prefernces penceresini aç +,
  2. profilesSekmeye git
  3. Soldaki listeden mevcut profilinizi kontrol edin
  4. terminalSağdaki sekmeyi tıklayın
  5. In Report terminal typeseçimxterm-256color
  6. Bitti.

Önerin için teşekkürler. Yukarıdakilerle ilgili açıklamalarla düzenledim xterm-256color. Bu şekilde ayarlanmış terminal tipini bulmak için prosedürünüzü takip ettim.
Gall

2

Harika bir NeoVim özelliğini kaçırıyorsunuz. Bu şeylere yardımcı olan bir env var. Bunu nvimrc'nize koymayı deneyin:

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 " True gui colors in terminal

Veya

export NVIM_TUI_ENABLE_TRUE_COLOR=1

Kabukta.


Bilginize: Bu kullanılmasını gerektirecektir guifgve guibg. OP'nin renk şeması ctermfgve kullanır ctermbg.
Justin M.Keyes

Oh, haklısın. Afedersiniz!
Yann Vanhalewyn

2

Seçenekleri ayarlamanız gerekiyor

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 
set termguicolors

sizin .config/nvim/init.vim.


Bu seçenekler renk guifgve guibgRGB değerleri içindir. Sorunun renk şeması sadece ctermfgve kullanır ctermbg.
Tommy A

1
Bu benim için yaptı. TERM zaten xterm-256color idi. Teşekkürler!
Qix - MONICA

1

Belirli renk şemasının, bir if-else deyimindeki gerçekten iki renk şeması kümesi olduğuna dikkat edin. Değişkenin varlığı g:impact_transbgistenen renk grubunu seçer ve başlangıçta bunun türetildiği renk şemasındaki saydam arka planları hesaba katması amaçlanmıştır .

2. renk şemasını ve if-else deyimini (yalnızca istenen renk şemasını bırakarak ve ortadan kaldırmak) g:impact_transbgyorumlamak, vim ve neovim'de amaçlanan davranışı bile olsa set term=xtermve set t_Co=256kaldırır.

Bu $TERM=xterm-256colors, hem vim hem de neovim'de koşulun if exists("g:impact_transbg")başarısız olduğunu, ancak

set term=xterm
set t_co=256

şartın başarılı olmasına izin verdi. Yukarıda açıklandığı gibi if-else yantümcesini kaldırmak maddi sorunu çözer, ancak .vimrc terimi ayarları ile g:impact_transbg.


0

$TERMOrtam değişkeninizi şu şekilde ayarlamayı deneyin :

TERM=xterm-256color

Ayrıca böyle nvim başlatmayı deneyin:

export TERM=xterm-256color; nvim

Bu işe yararsa, $TERMkabuğunuzdaki değişkeni kalıcı olarak ayarlayın.


Fikir için teşekkürler, Jeff. Sorumla ilgili açıklamalarımı düzenledim xterm-256color. Dışa aktarma yoluyla $ TERM belirlemenin hiçbir etkisi olmadı.
Gall

0

Bu konuyu yakın zamanda solarize tema ile yaşadım. Sorun TERMenv değişkeninden kaynaklandı.

Terminal emülatörüme (benim durumumda sonlandırıcı) env TERM=xterm-256color zshsadece zsh'yi normal olarak başlatmak yerine çalışmasını söyleyerek düzelttim .


OPs TERM zaten xterm-256color olarak ayarlanmış. Bence farklı bir sorun yaşıyorsunuz.
Zengin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.