Kesulitan Menggunakan Skema Warna di NeoVim

16

Saya tidak memiliki pemahaman penuh tentang bagaimana skema warna saya berinteraksi dengan termpengaturan di vim dan ini menghambat kemampuan saya untuk membuatnya ditampilkan dengan benar di neovim.

Dalam file .vimrc saya, perilaku yang benar dari skema warna tersebut membutuhkan pengaturan

set term=xterm
set t_Co=256

Menghilangkan salah satu dari pengaturan tersebut menghasilkan tampilan skema warna yang salah:

benar Tampilan Warna yang Benar salah Tampilan Warna Tidak Benar berbeda salah Tampilan Warna yang Salah Salah

Skemanya terlihat seperti ini:

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

Dalam neovim, termtidak dapat diatur. Saya mencoba menggunakan neovim dengan menetapkan $ TERM secara manual seperti:

TERM=xterm nvim

Ini menghasilkan tampilan warna yang benar dalam vim reguler (yaitu setara dengan istilah pengaturan dalam .vimrc), tetapi dalam neovim tampilannya seperti ini:

masukkan deskripsi gambar di sini

Mengapa kombinasi set term=xtermdan set t_Co=256perlu untuk menghasilkan tampilan yang benar dari skema warna ini dalam vim dan mengapa kombinasi pengaturan yang setara menghasilkan hasil yang berbeda dalam neovim?

Edit:

Standarnya adalah $TERM=xterm256-color , yang karena alasan tertentu harus ditimpa xtermdalam vim biasa untuk membuat tampilan warna dengan benar. Dengan variabel lingkungan pada 256 default, neovim terlihat seperti ini:

masukkan deskripsi gambar di sini

Ini identik dengan vim biasa dengan xterm256-color, tetapi tidak seperti yang dimaksudkan. Tujuan saya adalah untuk memahami mengapa peretasan xterm diperlukan / bekerja di vim, dan mengapa peretasannya tidak terlihat sama di neovim.

Perhatikan bahwa banyak warna muncul dengan benar dengan pengaturan variabel env istilah di atas, pengecualian penting adalah nomor baris dan latar belakang. Saya menduga bahwa cara warna ditentukan dalam skema warna khusus ini mungkin terlibat.

Empedu
sumber
1
$ TERM Anda sudah disetel ke apa yang umumnya dianggap 'benar' pada sistem modern - 256 warna diaktifkan. Jadi opsi t_Co, yang biasanya untuk kompatibilitas dengan terminal lama, seharusnya tidak diperlukan. Bagaimana jika Anda mengomentari kedua baris konfigurasi?
David Lord
@ David Mengomentari kedua baris konfigurasi terlihat sama dengan berkomentar set term=xterm.
Empedu
Bisakah Anda menyertakan tangkapan layar dari konfigurasi warna iTerm yang Anda gunakan saat tema dirender dengan benar serta hasil dari menjalankan skrip ini ?
Eric Pruitt

Jawaban:

11

Isu utama

Masalah utama yang Anda alami disebabkan oleh urutan perintah di komputer Anda .vimrc.

Anda mengatur g:impact_transbgvariabel setelah Anda memuat colorscheme, dan variabel tidak ada ketika diperiksa oleh pernyataan colorscheme if, dan versi kedua dari colorscheme (di elseblok) digunakan.

Untuk memperbaikinya, Anda hanya perlu memindahkan garis yang mengatur variabel di atas garis tempat Anda memuat skema warna:

let g:impact_transbg=1
colorscheme impact3

Anda dapat (dan harus!) Lalu menghapus garis yang tidak perlu dari .vimrc:

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

Masalah lain

Saya juga dapat menjernihkan beberapa kesalahpahaman / kebingungan lain yang mungkin Anda miliki tentang bagaimana semua ini bekerja:

Menjelaskan perilaku 'term'&'t_Co'

$ TERM Anda disetel ke xterm256-color. Vim membaca ini, dan menanyakan terminfo (atau termcap) untuk mengetahui berapa banyak warna yang didukung terminal, dan kemudian menyetelnya 't_Co'. Anggap $ TERM Anda benar (milik Anda) dan database terminfo Anda berisi informasi yang benar untuk terminal itu (milik Anda), Anda tidak perlu mereset secara manual 't_Co'.

Namun, Anda kemudian secara manual mengatur Vim 'term'ke xterm. Terminfo Anda memberi tahu Vim bahwa terminal ini hanya mendukung 8 warna, jadi menambahkan ini akan menyebabkan 't_Co'salah diatur ke 8. Anda secara manual mengatur 't_Co' kembali ke 256, tetapi jika Anda telah meninggalkan 'term'pengaturan pada nilai yang benar, Anda tidak perlu .

Kebetulan, ketika Anda mengubah 't_Co'secara manual setelah pengaturan g:impact_transbg, hal itu menyebabkan colorscheme yang akan ulang (untuk memungkinkan colorscheme untuk beradaptasi dengan nomor baru warna), dan karena g:impact_transbg itu sekarang ditetapkan, Anda mendapatkan warna yang Anda inginkan.

(Dengan garis pengaturan 'term'dihilangkan, 't_Co'ini sudah diatur untuk 256 ketika Anda sampai ke garis terakhir dalam vimrc Anda, dan begitu colorscheme tidak reloaded:. Maka warna yang salah)

Jadi, untuk rekap:

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

Hasil: Colorscheme dimuat ulang ketika 't_Co'diatur ke 256, warna sudah benar.

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

Hasil: Colorscheme diambil oleh colorschemeperintah, variabel tidak ada, warna salah.

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

Hasil: Colorscheme dimuat oleh colorschemeperintah, variabel tidak ada dan Vim hanya menggunakan 8 warna, warna salah.

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

Hasil: Colorscheme diambil oleh colorschemeperintah, variabel tidak ada, warna salah.

let g:impact_transbg=1
colorscheme impact3

Hasil: Skema warna dimuat oleh colorschemeperintah, variabel tidak ada, sehingga warna yang benar. (Dan sebagai bonus 'term'dan 't_Co'juga benar!)

Perilaku ini berbeda di NeoVim hanya karena panggilan untuk mengatur 't_Co'diabaikan, seperti penjawab lain telah sebutkan.

'background'

Setelah mengatur skema warna, Anda juga mengatur 'background'. Untuk ini khusus colorscheme, ini benar-benar tidak perlu, karena hal pertama colorscheme yang dilakukan adalah untuk set 'background'ke 'dark'.

Perhatikan bahwa saya tidak setuju dengan penjawab lain yang menyarankan Anda harus mengatur 'background'setelah memuat skema warna Anda. Skema warna dapat menggunakan nilai 'background'untuk menyesuaikan warnanya, jadi pengaturan 'background'sebelum memuat skema warna adalah urutan yang lebih jelas. (Meskipun perhatikan bahwa jika Anda mengubah 'background'pengaturan, Vim akan memuat ulang semua skema warna yang dimuat, jadi menyetelnya 'background'kemudian juga akan berfungsi: itu hanya tidak optimal.)

Kaya
sumber
1
Terima kasih, ini sangat menyeluruh dan saya menghargai konteks tambahan.
Conrad Meyer
@ConradMeyer Saya senang itu membantu Anda!
Rich
7

Dalam kasus Neovim, t_Codan TERMtidak ada bedanya.

Anda menelepon set background=darksebelum dan sesudah panggilan ke colorscheme impact3. Pindah set background=darkke bagian bawah skema warna, dan hapus panggilan lain dari vimrc Anda.

Dari :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.

Lihat juga: https://github.com/justinmk/molokai/commit/aa1cc201c743dd7d1b80bb2e2b5fbb7894ebfe5f

Tujuan saya adalah untuk memahami mengapa peretasan xterm diperlukan / bekerja di vim, dan mengapa peretasannya tidak terlihat sama di neovim.

  • Neovim tidak peduli t_Cokarena mengasumsikan 256 kecuali Anda mengaktifkan "true color" .
    • Bahkan Neovim mengabaikan semua t_*opsi, lihat :help t_xx.
  • Neovim tidak memungkinkan &termuntuk ditetapkan karena tidak ada artinya. Neovim menggunakan unibilium dan mekanisme lain untuk mendeteksi kemampuan terminal.
Justin M. Keyes
sumber
terima kasih banyak atas wawasan Anda mengenai deteksi kemampuan istilah neovim dan pengaturan `t_ *`. Menghapus salinan berlebihan dan memposisikan ulang set background=darkpernyataan itu tidak berpengaruh, tetapi rincian tentang implementasi yang mendasarinya jauh lebih berharga bagi saya.
Empedu
2

Saya melihat Anda menggunakan iTerm2, sehingga Anda dapat mencoba ini:

  1. Buka jendela preferensi +,
  2. Buka profilestab
  3. Periksa profil Anda saat ini di daftar sebelah kiri
  4. Klik pada tab terminaldi sebelah kanan
  5. Di Report terminal typepilihxterm-256color
  6. Selesai
Alexander Myshov
sumber
Terima kasih atas saran Anda. Saya mengedit di atas dengan komentar tentang xterm-256color. Saya menindaklanjuti dengan prosedur Anda untuk menemukan jenis terminal yang sudah diatur demikian.
Empedu
2

Anda kehilangan fitur NeoVim yang luar biasa. Ada env var yang membantu dengan hal ini. Coba letakkan ini di nvimrc Anda:

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 " True gui colors in terminal

Atau

export NVIM_TUI_ENABLE_TRUE_COLOR=1

di shell.

Yann Vanhalewyn
sumber
FYI: ini akan membutuhkan penggunaan guifgdan guibg. Colorscheme OP menggunakan ctermfgdan ctermbg.
Justin M. Keyes
Oh kamu benar Maaf!
Yann Vanhalewyn
2

Anda perlu mengatur opsi

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 
set termguicolors

di Anda .config/nvim/init.vim.

yqbk
sumber
Pilihan itu untuk penggunaan guifgdan guibgnilai RGB untuk warna. Skema warna pertanyaan hanya menggunakan ctermfgdan ctermbg.
Tommy A
1
Ini berhasil untukku. TERM sudah berwarna xterm-256. Terima kasih!
Qix
1

Perhatikan bahwa skema warna spesifik sebenarnya adalah dua set skema warna dalam klausa if-else. Keberadaan variabel g:impact_transbgmemilih set warna yang diinginkan, dan pada awalnya dimaksudkan untuk menjelaskan latar belakang transparan dalam skema warna dari mana ini berasal .

Mengomentari skema warna ke-2 dan pernyataan if-else (hanya menyisakan skema warna yang diinginkan dan menghapusnya g:impact_transbg) menghasilkan perilaku yang dimaksudkan dalam vim dan neovim bahkan dengan set term=xtermdan set t_Co=256menghapus.

Ini menyiratkan bahwa dengan $TERM=xterm-256colorsvim dan neovim, kondisi if exists("g:impact_transbg")gagal, tetapi kombinasi pengaturan

set term=xterm
set t_co=256

memungkinkan persyaratan untuk berhasil. Menghapus klausa if-else seperti yang dijelaskan di atas menyelesaikan masalah material, tetapi masih ada misteri mengenai interaksi antara pasangan pengaturan istilah .vimrc dan g:impact_transbg.

Empedu
sumber
0

Coba atur $TERMvariabel lingkungan Anda seperti ini:

TERM=xterm-256color

Coba juga mulai nvim seperti ini:

export TERM=xterm-256color; nvim

Jika berhasil, atur $TERMvariabel di shell Anda secara permanen.

Jeff Buttas
sumber
Terima kasih untuk idenya, Jeff. Saya mengedit pertanyaan saya dengan komentar terkait xterm-256color. Pengaturan $ TERM via export tidak berpengaruh.
Gall
0

Saya memiliki masalah ini baru-baru ini dengan tema soliter. Masalahnya memang berasal dari TERMvariabel env.

Saya memperbaikinya dengan mengatakan emulator terminal saya (terminator dalam kasus saya) untuk menjalankan, env TERM=xterm-256color zshbukan hanya memulai zsh seperti biasa.

benbot
sumber
JANGKA OPs sudah diatur ke xterm-256color. Saya pikir Anda mengalami masalah yang berbeda.
Kaya