Sự cố khi sử dụng Bảng màu trong NeoVim


16

Tôi không có hiểu biết đầy đủ về cách phối màu của tôi tương tác với termcài đặt trong vim và điều này cản trở khả năng của tôi để làm cho nó hiển thị chính xác trong neovim.

Trong tệp .vimrc của tôi, hành vi đúng của bảng màu trong câu hỏi yêu cầu cài đặt

set term=xterm
set t_Co=256

Việc bỏ qua một trong các cài đặt đó dẫn đến hiển thị bảng màu không chính xác:

đúng Hiển thị màu chính xác sai Hiển thị màu không chính xác khác nhau không đúng Hiển thị màu không chính xác khác nhau

Đề án trông như thế này:

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

Trong neovim, termkhông thể được thiết lập. Tôi đã thử gọi neovim bằng cách đặt $ TERM theo cách thủ công như vậy:

TERM=xterm nvim

Điều này tạo ra sự hiển thị màu chính xác trong vim thông thường (nghĩa là tương đương với cài đặt thuật ngữ trong .vimrc), nhưng trong neovim thì nó trông như thế này:

nhập mô tả hình ảnh ở đây

Tại sao sự kết hợp set term=xtermset t_Co=256cần thiết để tạo ra màn hình chính xác của bảng màu này trong vim và tại sao sự kết hợp cài đặt tương đương lại tạo ra kết quả khác nhau trong neovim?

Biên tập:

Mặc định là $TERM=xterm256-color , vì một số lý do phải được ghi đè xtermtrong vim thông thường để hiển thị màu chính xác. Với biến môi trường ở mặc định 256, neovim trông như thế này:

nhập mô tả hình ảnh ở đây

Điều này giống hệt với vim thông thường với xterm256-color, nhưng không như dự định. Mục tiêu của tôi là hiểu lý do tại sao hack xterm là cần thiết / hoạt động trong vim và tại sao nó không giống nhau trong neovim.

Lưu ý rằng nhiều màu xuất hiện chính xác với cài đặt biến env ở trên, ngoại lệ đáng chú ý là số dòng và nền. Tôi nghi ngờ rằng cách các màu được chỉ định trong bảng màu cụ thể này có thể được tham gia.


1
$ TERM của bạn đã được đặt thành cái thường được coi là 'chính xác' trên các hệ thống hiện đại - được bật 256 màu. Vì vậy, tùy chọn t_Co, thông thường để tương thích với các thiết bị đầu cuối cũ hơn, không cần thiết. Điều gì nếu bạn nhận xét cả hai dòng cấu hình?
David Lord

@David Nhận xét cả hai dòng cấu hình trông giống như nhận xét set term=xterm.
Gall

Bạn có thể bao gồm một ảnh chụp màn hình cấu hình màu iTerm mà bạn sử dụng khi chủ đề được hiển thị chính xác cũng như đầu ra từ việc chạy tập lệnh này không?
Eric Pruitt

Câu trả lời:


11

Vấn đề chính

Vấn đề chính bạn gặp phải là do thứ tự các lệnh trong của bạn .vimrc.

Bạn đặt g:impact_transbgbiến sau khi bạn tải màu sắc, và do đó biến không tồn tại khi được kiểm tra bởi ifcâu lệnh của colorcheme và phiên bản thứ hai của colorcheme (trong elsekhối) được sử dụng.

Để khắc phục, bạn chỉ cần di chuyển dòng đặt biến phía trên dòng nơi bạn tải màu sắc:

let g:impact_transbg=1
colorscheme impact3

Bạn có thể (và nên!) Sau đó xóa các dòng không cần thiết khỏi .vimrc:

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

Các vấn đề khác

Tôi cũng có thể làm sáng tỏ một vài hiểu lầm / nhầm lẫn khác mà bạn có thể có về cách thức hoạt động của tất cả những điều này:

Giải thích hành vi của 'term'&'t_Co'

$ HẠN của bạn được đặt thành xterm256-color. Vim đọc cái này và truy vấn terminfo (hoặc termcap) để tìm hiểu xem thiết bị đầu cuối hỗ trợ bao nhiêu màu, và sau đó đặt 't_Co'tương ứng. Giả sử $ TERM của bạn là chính xác (của bạn là) và cơ sở dữ liệu terminfo của bạn chứa thông tin chính xác cho thiết bị đầu cuối đó (của bạn), bạn không bao giờ cần phải thiết lập lại theo cách thủ công 't_Co'.

Tuy nhiên, sau đó bạn đang cài đặt thủ công Vim 'term'thành xterm. Terminfo của bạn nói với Vim rằng thiết bị đầu cuối này chỉ hỗ trợ 8 màu, vì vậy việc thêm này sẽ khiến 't_Co'cài đặt không chính xác thành 8. Bạn đang tự đặt 't_Co' lại thành 256, nhưng nếu bạn đã để 'term'cài đặt ở giá trị chính xác, bạn sẽ không cần phải .

Ngẫu nhiên, khi bạn thay đổi 't_Co'bằng tay sau khi thiết lập g:impact_transbg, nó gây ra các colorscheme được nạp lại (cho phép colorscheme để thích ứng với các số điện thoại mới của màu sắc), và vì g:impact_transbg bây giờ thiết lập, bạn sẽ có được màu sắc mà bạn mong muốn.

(Với dòng thiết lập được 'term'bỏ qua, 't_Co'đã thiết lập để 256 khi bạn nhận được vào dòng sau trong vimrc của bạn, và do đó colorscheme không được nạp lại:. Vì thế màu sắc sai)

Vì vậy, để tóm tắt lại:

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

Kết quả: Colorscheme được tải lại khi 't_Co'được đặt thành 256, màu sắc chính xác.

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

Kết quả: Colorscheme được tải bằng colorschemelệnh, biến không tồn tại, màu sắc bị sai.

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

Kết quả: Colorscheme được tải bằng colorschemelệnh, biến không tồn tại và Vim chỉ sử dụng 8 màu, màu sai.

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

Kết quả: Colorscheme được tải bằng colorschemelệnh, biến không tồn tại, màu sắc bị sai.

let g:impact_transbg=1
colorscheme impact3

Kết quả: Colorscheme được tải bằng colorschemelệnh, biến không tồn tại, vì vậy màu sắc là chính xác. (Và như một phần thưởng 'term''t_Co'cũng đúng!)

Hành vi khác nhau trong NeoVim đơn giản là vì lệnh gọi được đặt 't_Co'bị bỏ qua, như những người trả lời khác đã đề cập.

'background'

Sau khi thiết lập màu sắc, bạn cũng thiết lập 'background'. Đối với màu sắc đặc biệt này , điều này là hoàn toàn không cần thiết, bởi vì điều đầu tiên mà colorcheme làm là đặt 'background'thành 'dark'.

Lưu ý rằng tôi không đồng ý với người trả lời khác, người gợi ý rằng bạn nên đặt 'background'sau khi tải màu sắc của mình. Màu sắc có thể sử dụng giá trị của 'background'để điều chỉnh màu sắc của nó, vì vậy cài đặt 'background'trước khi tải màu sắc là thứ tự rõ ràng hơn. (Mặc dù lưu ý rằng nếu bạn thay đổi 'background'cài đặt, Vim sẽ tải lại mọi màu sắc được tải, do đó, cài đặt 'background'sau đó cũng sẽ hoạt động: nó chỉ không tối ưu.)


1
Cảm ơn, điều này là vô cùng kỹ lưỡng và tôi đánh giá cao bối cảnh bổ sung.
Conrad Meyer

@ConradMeyer Tôi rất vui vì nó hữu ích cho bạn!
Giàu

7

Trong trường hợp của Neovim, t_CoTERMkhông có sự khác biệt.

Bạn đang gọi set background=darktrước sau cuộc gọi đến colorscheme impact3. Di chuyển set background=darkxuống dưới cùng của colorcheme và xóa cuộc gọi khác khỏi vimrc của bạn.

Từ :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.

Xem thêm: https://github.com/justinmk/molokai/commit/aa1cc201c743dd7d1b80bb2e2b5fbb7894ebfe5f

Mục tiêu của tôi là hiểu lý do tại sao hack xterm là cần thiết / hoạt động trong vim và tại sao nó không giống nhau trong neovim.

  • Neovim không quan tâm t_Covì nó giả sử 256 trừ khi bạn bật "màu thật" .
    • Trong thực tế Neovim bỏ qua tất cả các t_*tùy chọn, xem :help t_xx.
  • Neovim không cho phép &termđược thiết lập vì nó là vô nghĩa. Neovim sử dụng unibilium và các cơ chế khác để phát hiện các khả năng của thiết bị đầu cuối.

cảm ơn rất nhiều vì những hiểu biết của bạn về phát hiện khả năng thuật ngữ neovim và cài đặt `t_ *`. Loại bỏ bản sao dự phòng và định vị lại set background=darktuyên bố không có tác dụng, nhưng những chi tiết đó về việc triển khai cơ bản có giá trị hơn nhiều đối với tôi.
Gall

2

Tôi thấy bạn sử dụng iTerm2, vì vậy bạn có thể thử điều này:

  1. Mở cửa sổ ưa thích +,
  2. Chuyển đến profilestab
  3. Kiểm tra hồ sơ hiện tại của bạn trong danh sách bên trái
  4. Bấm vào tab terminalbên phải
  5. Trong Report terminal typelựa chọnxterm-256color
  6. Làm xong.

Cảm ơn lời đề nghị của bạn. Tôi đã chỉnh sửa ở trên với nhận xét liên quan xterm-256color. Tôi đã làm theo thủ tục của bạn để tìm loại thiết bị đầu cuối đã được thiết lập như vậy.
Gall

2

Bạn đang thiếu một tính năng NeoVim tuyệt vời. Có một var env giúp với công cụ này. Hãy thử đặt cái này vào nvimrc của bạn:

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 " True gui colors in terminal

Hoặc là

export NVIM_TUI_ENABLE_TRUE_COLOR=1

trong vỏ.


FYI: điều này sẽ yêu cầu sử dụng guifgguibg. Màu sắc của OP sử dụng ctermfgctermbg.
Justin M. Keyes

Oh bạn nói đúng. Lấy làm tiếc!
Yann Vanhalewyn

2

Bạn cần thiết lập tùy chọn

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 
set termguicolors

trong của bạn .config/nvim/init.vim.


Các tùy chọn này là để sử dụng guifgguibggiá trị RGB cho màu sắc. Bảng màu của câu hỏi chỉ sử dụng ctermfgctermbg.
Tommy A

1
Điều này đã làm điều đó cho tôi. HẠN đã xterm-256color. Cảm ơn!
Qix

1

Lưu ý rằng bảng màu cụ thể thực sự là hai bộ phối màu trong mệnh đề if-other. Sự tồn tại của biến g:impact_transbgchọn bộ màu mong muốn và ban đầu được dự định tính đến các nền trong suốt trong bảng màu mà từ đó có nguồn gốc .

Cho ý kiến ra màu sắc thứ 2 và tuyên bố if-else (chỉ để lại màu sắc mong muốn và với việc từ bỏ g:impact_transbg) sản lượng các hành vi dự định ở cả vim và neovim ngay cả với set term=xtermset t_Co=256loại bỏ.

Điều này ngụ ý rằng với $TERM=xterm-256colorscả vim và neovim, điều kiện if exists("g:impact_transbg")không thành công, nhưng đó là sự kết hợp của cài đặt

set term=xterm
set t_co=256

cho phép điều kiện để thành công. Xóa mệnh đề if-other như được mô tả ở trên sẽ giải quyết vấn đề quan trọng, nhưng vẫn còn một bí ẩn liên quan đến sự tương tác giữa cặp cài đặt thuật ngữ .vimrc và g:impact_transbg.


0

Hãy thử đặt $TERMbiến môi trường của bạn như thế này:

TERM=xterm-256color

Cũng thử bắt đầu nvim như thế này:

export TERM=xterm-256color; nvim

Nếu nó hoạt động, đặt $TERMbiến trong vỏ của bạn vĩnh viễn.


Cảm ơn vì ý tưởng, Jeff. Tôi chỉnh sửa câu hỏi của tôi với những nhận xét liên quan xterm-256color. Đặt $ TATE qua xuất khẩu không có hiệu lực.
Gall

0

Tôi đã có vấn đề này gần đây với chủ đề năng lượng mặt trời. Vấn đề đã đến từ TERMbiến env.

Tôi đã sửa nó bằng cách báo cho trình giả lập terminal (terminator trong trường hợp của tôi) chạy env TERM=xterm-256color zshthay vì chỉ khởi động zsh như bình thường.


OP TATE đã được đặt thành xterm-256color. Tôi nghĩ rằng bạn đã trải qua một vấn đề khác nhau.
Giàu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.