ปัญหาในการใช้ชุดรูปแบบสีใน NeoVim


16

ฉันไม่เข้าใจอย่างถ่องแท้ว่าชุดสีของฉันมีปฏิสัมพันธ์กับการtermตั้งค่าเป็นกลุ่มอย่างไรและนี่เป็นการขัดขวางความสามารถของฉันในการแสดงให้ถูกต้องใน 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ไม่สามารถตั้งค่าได้ ฉันพยายามเรียกใช้ neovim ด้วยการตั้งค่า $ TERM ด้วยตนเองดังนี้:

TERM=xterm nvim

สิ่งนี้ทำให้เกิดการแสดงสีที่ถูกต้องใน vim ปกติ (เช่นเทียบเท่ากับการตั้งค่าคำใน. vimrc) แต่ใน neovim ดูเหมือนว่า:

ป้อนคำอธิบายรูปภาพที่นี่

ทำไมการรวมกันของset term=xtermและset t_Co=256จำเป็นในการสร้างการแสดงผลที่ถูกต้องของโทนสีนี้ในกลุ่ม

แก้ไข:

ค่าเริ่มต้นคือ $TERM=xterm256-color , ซึ่งด้วยเหตุผลบางอย่างจะต้องมีการแทนที่ไปxtermในกลุ่มปกติที่จะทำให้จอแสดงผลสีได้อย่างถูกต้อง ด้วยตัวแปรสภาพแวดล้อมที่ค่าเริ่มต้น 256 neovim มีลักษณะดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่

นี่เป็นเหมือนเสียงเรียกเข้าปกติด้วยxterm256-colorแต่ไม่ได้ตั้งใจ เป้าหมายของฉันคือเข้าใจว่าทำไมการแฮ็ก xterm จึงจำเป็น / ทำงานเป็นกลุ่มและทำไมมันไม่เหมือน neovim

โปรดทราบว่าสีจำนวนมากปรากฏอย่างถูกต้องโดยมีการตั้งค่าตัวแปร env ด้านบนข้อยกเว้นที่น่าสังเกตว่าเป็นหมายเลขบรรทัดและพื้นหลัง ฉันสงสัยว่าวิธีการระบุสีในโทนสีเฉพาะนี้อาจเกี่ยวข้องกัน


1
$ TERM ของคุณถูกตั้งค่าเป็นสิ่งที่โดยทั่วไปถือว่า 'ถูกต้อง' ในระบบที่ทันสมัย ​​- เปิดใช้งาน 256 สี ดังนั้นตัวเลือก t_Co ซึ่งปกติแล้วจะเข้ากันได้กับเทอร์มินัลรุ่นเก่าจึงไม่จำเป็น เกิดอะไรขึ้นถ้าคุณใส่ความคิดเห็นออกทั้งสองสายการกำหนดค่า?
David Lord

@ David set term=xtermความเห็นจากทั้งสองสายการตั้งค่ามีลักษณะเช่นเดียวกับการแสดงความคิดเห็นออกมา
Gall

คุณสามารถรวมภาพหน้าจอของการกำหนดค่าสี iTerm ที่คุณใช้เมื่อแสดงธีมได้อย่างถูกต้องรวมทั้งเอาต์พุตจากการเรียกใช้สคริปต์นี้หรือไม่
Eric Pruitt

คำตอบ:


11

ปัญหาหลัก

.vimrcปัญหาหลักที่คุณกำลังประสบมีสาเหตุมาจากการสั่งซื้อของคำสั่งในของคุณ

คุณตั้งค่าg:impact_transbgตัวแปรหลังจากที่คุณโหลดสกีมสีและอื่น ๆ ตัวแปรไม่ได้อยู่เมื่อตรวจสอบโดยสกีมสีของifคำสั่งและรุ่นที่สองของสกีมสี (ในelseบล็อก) ถูกนำมาใช้

ในการแก้ไขคุณเพียงแค่ย้ายบรรทัดที่ตั้งค่าตัวแปรไว้เหนือบรรทัดที่คุณโหลด colorcheme:

let g:impact_transbg=1
colorscheme impact3

คุณสามารถ (และควร!) จากนั้นลบบรรทัดที่ไม่จำเป็นออกจาก.vimrc:

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

ปัญหาอื่น ๆ

ฉันยังสามารถกำจัดความเข้าใจผิด / ความสับสนอื่น ๆ ที่คุณอาจมีเกี่ยวกับวิธีการทำงานทั้งหมดนี้:

อธิบายพฤติกรรมของ'term'&'t_Co'

$ xterm256-colorลงทุนของคุณถูกตั้งค่าให้ Vim อ่านสิ่งนี้และเคียวรี terminfo (หรือ termcap) เพื่อค้นหาจำนวนสีที่เทอร์มินัลสนับสนุนและจากนั้นตั้งค่า 't_Co'ตามความเหมาะสม ทะนง $ ลงทุนของคุณถูกต้อง (คุณเป็น) และฐานข้อมูล terminfo ของคุณมีข้อมูลที่ถูกต้องสำหรับสถานีที่ (คุณไม่) คุณควรจะไม่'t_Co'จำเป็นต้องตั้งค่าด้วยตนเอง

อย่างไรก็ตามคุณจะตั้งค่า Vim's เป็น'term'xterm ด้วยตนเอง terminfo ของคุณบอก Vim ว่าเทอร์มินัลนี้รองรับ 8 สีเท่านั้นดังนั้นการเพิ่มสิ่งนี้จะทำให้ 't_Co'ตั้งค่าไม่ถูกต้องเป็น 8 คุณกำลังตั้งค่า't_Co' กลับเป็น 256 ด้วยตนเองแต่ถ้าคุณปล่อยการ'term'ตั้งค่าไว้ที่ค่าที่ถูกต้องคุณจะไม่จำเป็นต้อง .

อนึ่งเมื่อคุณเปลี่ยน't_Co'ด้วยตนเองหลังจากการตั้งค่าg:impact_transbgจะทำให้สกีมสีที่จะโหลดใหม่ (เพื่อช่วยให้สกีมสีเพื่อปรับให้เข้ากับหมายเลขใหม่ของสี) และเนื่องจากg:impact_transbg มีการตั้งค่าในขณะนี้คุณจะได้รับสีที่คุณต้องการ

(เมื่อ'term'เว้นการตั้งค่าบรรทัดไว้แล้ว't_Co'จะถูกตั้งค่าเป็น 256 เมื่อคุณไปที่บรรทัดหลังใน. vimrc ของคุณและดังนั้น colorcheme จะไม่ถูกโหลดซ้ำ: สีผิดดังนั้น)

ดังนั้นเพื่อสรุป:

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

ผลลัพธ์: Colorscheme จะถูกโหลดซ้ำเมื่อ'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คำสั่งตัวแปรไม่อยู่เพื่อให้สีที่ถูกต้อง (และเป็นโบนัส'term'และ't_Co'ถูกต้องด้วย!)

ลักษณะการทำงานนั้นแตกต่างกันใน NeoVim เพียงเพราะการโทรเพื่อตั้งค่า't_Co'ถูกละเว้นเช่นเดียวกับผู้ตอบคำถามอื่น ๆ ที่ได้กล่าวไปแล้ว

'background'

'background'หลังจากตั้งค่าสกีมสีที่คุณยังตั้ง สำหรับเรื่องนี้โดยเฉพาะอย่างยิ่ง สกีมสีนี้ไม่จำเป็นครบถ้วนเพราะสิ่งแรกที่สกีมสีไม่เป็นชุดที่จะ'background''dark'

โปรดทราบว่าฉันไม่เห็นด้วยกับผู้ตอบคนอื่นที่แนะนำว่าคุณควรตั้งค่า 'background'หลังจากโหลด colorcheme ของคุณ Colorscheme อาจใช้ค่าของ'background'การปรับสีของมันดังนั้นการตั้งค่า'background'ก่อนที่จะโหลด colorcheme เป็นการเรียงลำดับที่ชัดเจนยิ่งขึ้น (แม้ว่าโปรดทราบว่าหากคุณเปลี่ยนการ'background'ตั้งค่า Vim จะโหลดชุดสีที่โหลดไว้ดังนั้นการตั้งค่า'background'หลังจากนั้นจะสามารถใช้งานได้: มันไม่เหมาะอย่างยิ่ง)


1
ขอบคุณนี่เป็นสิ่งที่ละเอียดและฉันขอขอบคุณบริบทเพิ่มเติม
Conrad Meyer

@ConradMeyer ฉันดีใจที่เป็นประโยชน์สำหรับคุณ!
Rich

7

ในกรณีของ Neovim t_CoและTERMไม่สร้างความแตกต่าง

คุณโทรset background=darkมาก่อนและcolorscheme impact3หลังจากการเรียกร้องให้ ย้ายset background=darkไปที่ด้านล่างของ colorcheme และลบสายอื่นจาก 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 จึงจำเป็น / ทำงานเป็นกลุ่มและทำไมมันจึงไม่เหมือน neovim

  • Neovim ไม่สนใจเกี่ยวกับt_Coเพราะถือว่า 256 จนกว่าคุณจะเปิดใช้งาน "สีจริง"
    • ในความเป็นจริง Neovim ละเว้นทุกตัวเลือกดูt_*:help t_xx
  • Neovim ไม่อนุญาตให้&termตั้งค่าเพราะไม่มีความหมาย Neovim ใช้unibiliumและกลไกอื่น ๆ เพื่อตรวจสอบความสามารถของเทอร์มินัล

ขอบคุณมากสำหรับข้อมูลเชิงลึกของคุณเกี่ยวกับการตรวจจับความสามารถของคำศัพท์ neovim และการตั้งค่า `t_ * ' การลบสำเนาที่ซ้ำซ้อนและปรับตำแหน่งset background=darkคำสั่งนั้นไม่มีผล แต่รายละเอียดเกี่ยวกับการใช้งานพื้นฐานนั้นมีค่ามากกว่าสำหรับฉัน
Gall

2

ฉันเห็นคุณใช้ iTerm2 ดังนั้นคุณสามารถลอง:

  1. เปิดหน้าต่าง prefernces +,
  2. ไปที่profilesแท็บ
  3. ตรวจสอบโปรไฟล์ปัจจุบันของคุณในรายการด้านซ้าย
  4. คลิกที่แท็บterminalด้านขวา
  5. ในการReport terminal typeเลือกxterm-256color
  6. เสร็จสิ้น

ขอบคุณสำหรับคำแนะนำของคุณ xterm-256colorฉันแก้ไขข้างต้นด้วยคำพูดเกี่ยวกับ ฉันทำตามด้วยขั้นตอนของคุณเพื่อค้นหาประเภทอาคารที่ตั้งค่าไว้แล้ว
Gall

2

คุณไม่มีฟีเจอร์ NeoVim ที่ยอดเยี่ยม มี env var ที่ช่วยเหลือสิ่งนี้ ลองใส่นี่ใน nvimrc ของคุณ:

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 " True gui colors in terminal

หรือ

export NVIM_TUI_ENABLE_TRUE_COLOR=1

ในเปลือก


FYI: นี้จะต้องมีการใช้งานและguifg guibgOP ของการใช้สกีมสีและctermfg ctermbg
Justin M. Keyes

โอ้คุณพูดถูก ขออภัย!
Yann Vanhalewyn

2

คุณต้องตั้งค่าตัวเลือก

let $NVIM_TUI_ENABLE_TRUE_COLOR=1 
set termguicolors

.config/nvim/init.vimในของคุณ


ตัวเลือกเหล่านั้นมีไว้สำหรับการใช้งานguifgและguibgค่า RGB สำหรับสี โทนสีคำถามที่ใช้เฉพาะและctermfg ctermbg
Tommy A

1
มันทำเพื่อฉัน TERM เป็น xterm-256color แล้ว ขอบคุณ!
Qix

1

โปรดทราบว่าชุดรูปแบบสีที่เฉพาะเจาะจงคือชุดสีสองชุดภายในประโยค if-else การดำรงอยู่ของตัวแปรg:impact_transbgเลือกที่ต้องการชุดสีและเดิมทีตั้งใจจะบัญชีสำหรับพื้นหลังโปร่งใสในโทนสีจากที่นี้จะได้มา

การแสดงความคิดเห็นเกี่ยวกับชุดสีที่ 2 และคำสั่ง if-else (เหลือเพียงชุดรูปแบบสีที่ต้องการและทำไปด้วยg:impact_transbg) ให้ผลกับพฤติกรรมตามที่ตั้งใจทั้งในกลุ่มที่เป็นกลุ่มและกลุ่มนีโอวิมถึงแม้จะมีset term=xtermและset t_Co=256ลบออก

นี่ก็หมายความว่า$TERM=xterm-256colorsทั้งในเป็นกลุ่มและ neovim เงื่อนไขif exists("g:impact_transbg")ล้มเหลว แต่การรวมกันของการตั้งค่า

set term=xterm
set t_co=256

อนุญาตให้เงื่อนไขสำเร็จ การถอดประโยคถ้า-อื่นตามที่อธิบายไว้ข้างต้นแก้ปัญหาวัสดุ แต่ยังคงมีความลึกลับเกี่ยวกับการทำงานร่วมกันระหว่างคู่ของการตั้งค่าระยะ .vimrc g:impact_transbgและ


0

ลองตั้งค่า$TERMตัวแปรสภาพแวดล้อมของคุณเช่นนี้:

TERM=xterm-256color

ลองเริ่มต้น nvim ดังนี้:

export TERM=xterm-256color; nvim

หากใช้งานได้ให้ตั้งค่า$TERMตัวแปรในเชลล์ของคุณอย่างถาวร


ขอบคุณสำหรับความคิดเจฟ xterm-256colorฉันแก้ไขคำถามของฉันกับคำพูดเกี่ยวกับ การตั้งค่า $ TERM ผ่านการส่งออกไม่มีผล
Gall

0

ฉันมีปัญหานี้เมื่อเร็ว ๆ นี้ด้วยธีมแสงอาทิตย์ ปัญหาเกิดจากTERMตัวแปร env

ฉันแก้ไขโดยบอก terminal emulator (เทอร์มินัลในกรณีของฉัน) ให้ทำงานenv TERM=xterm-256color zshแทนที่จะเริ่ม zsh ตามปกติ


OPs TERM ถูกตั้งค่าเป็น xterm-256color แล้ว ฉันคิดว่าคุณกำลังประสบปัญหาอื่น
Rich
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.