Mengapa warna Vim terlihat berbeda di dalam dan di luar tmux?

29

Lingkungan Hidup:

  • Fedora 25 (4.9.12-200.fc25.x86_64)
  • Terminal GNOME 3.22.1 Menggunakan VTE versi 0.46.1 + GNUTLS
  • VIM - Vi IMproved 8.0 (2016 Sep 12, disusun 22 Feb 2017 16:26:11)
  • tmux 2.2

Saya baru-baru ini mulai menggunakan tmux dan telah mengamati bahwa warna dalam Vim berubah tergantung pada apakah saya menjalankan di dalam atau di luar tmux. Di bawah ini adalah screenshot Vim di luar (kiri) dan di dalam (kanan) dari tmux saat melihat Git diff:

masukkan deskripsi gambar di sini

TERMVariabel saya adalah

  • Di luar tmux: xterm-256color
  • Di dalam tmux: screen-256color

Vim melaporkan jenis terminal ini seperti yang diharapkan (via :set term?):

  • Di luar tmux: term=xterm-256color
  • Di dalam tmux: term=screen-256color

Vim juga melaporkan kedua instance berjalan dalam mode 256-warna (via :set t_Co?):

  • Di luar tmux: t_Co=256
  • Di dalam tmux: t_Co=256

Ada banyak pertanyaan serupa di luar sana mengenai bagaimana menjalankan Vim dalam mode 256-warna di dalam tmux (jawaban terbaik yang saya temukan ada di sini ), tetapi saya tidak berpikir itu masalah saya mengingat informasi di atas.

Saya dapat menduplikasi masalah di luar tmux jika saya menjalankan Vim dengan tipe terminal yang diatur ke screen-256color:

$ TERM=screen-256color vim

Jadi itu membuat saya percaya ada beberapa perbedaan antara kemampuan terminal xterm-256colordan screen-256coloryang menyebabkan perbedaan warna. Yang mengarah ke pertanyaan yang diajukan dalam judul: apa yang secara khusus dalam kemampuan terminal menyebabkan warna Vim menjadi berbeda? Saya melihat perbedaan antara menjalankan :set termcapdi dalam dan di luar tmux, tapi saya ingin tahu variabel mana yang sebenarnya menyebabkan perbedaan perilaku.

Terlepas dari pertanyaan sebelumnya, mungkinkah warna Vim konsisten saat berjalan di dalam atau di luar tmux? Beberapa hal yang saya coba antara lain:

  • Secara eksplisit mengatur terminal default yang digunakan tmux ~/.tmux.confke berbagai nilai (beberapa bertentangan dengan saran dari FAQ tmux ):
    set -g default-terminal "screen-256color"
    set -g default-terminal "xterm-256color"
    set -g default-terminal "screen.xterm-256color"
    set -g default-terminal "tmux-256color"
  • Mulai tmux menggunakan tmux -2.

Dalam semua kasus, Vim terus menampilkan berbagai warna di dalam tmux.

Rusty Shackleford
sumber
Bisakah Anda memulai script, memulai vim, keluar vimdan kemudian keluar scriptdari shell, dan lampirkan typescriptfile yang dihasilkan ? Kemudian ulangi langkah yang sama TERM=screen-256color vimsebagai gantinya.
egmont
@egmont Ini dia: typescript-xterm-256color dan typescript-screen-256color .
Rusty Shackleford
1
Saya dapat melihat urutan pelarian 256-warna dalam xterm-256colorversi (mencari "38; 5;" dalam file), tetapi tidak dapat dalam screen-256color. Misalnya dimanapun ada \e[38;5;81mdalam xterm-256color(warna # 81 dari palet 256-warna, warna biru tengah), screen-256colorberisi \e[34m(standar biru dari palet 8-warna). Jadi pertanyaan utamanya adalah mengapa vim tidak menggunakan palet 256-warna jika ada TERM=screen-256color.
egmont
Hal lain yang menarik adalah bahwa xterm-256colorversi tersebut tampaknya mencetak layar dua kali, pertama dengan warna legacy dan kemudian dengan palet 256 warna. Cari misalnya "F1" dalam file, Anda akan menemukan dua kecocokan xterm-256color, yang pertama dengan \e[34mwarna, yang kedua dengan \e[38;5;81m. Saya tidak tahu apa yang terjadi di sini.
egmont
Menambahkan set -g default-terminal "screen.xterm-256color"di ~/.tmux.confdan reload config di tmux (<Cs>: sumber-berkas ~ / .tmux.conf) bekerja untuk saya (masalah sorot). thx
dtrckd

Jawaban:

17

Saya memiliki masalah serupa sebelumnya. Komentar dengan warna biru di Vim sulit dibaca. Di .tmux.confsaya atur ini:

set -g default-terminal "screen-256color"

Dan di .vimrc:

set background=dark

Sekarang tampilannya sebagai berikut dan berfungsi baik di Terminal Gnome dan Cygwin: masukkan deskripsi gambar di sini

Vitalii Plagov
sumber
3
Ini menyelesaikannya untuk saya. Untuk beberapa alasan, di dalam tmux, vim tidak mendeteksi latar belakang yang gelap. Pengaturan secara eksplisit bg=darkdi vimrc saya memperbaikinya.
Adam Keenan
Aneh - $TERMbaik di dalam maupun di luar tmuxsaya "xterm-256color"dan secara eksplisit menetapkan backgroun melakukannya untuk saya juga. Terima kasih!
nronnei
Bekerja untuk saya juga. Saya pikir masalah ini dengan sttermkarena dalam xfce4-terminalsegala sesuatu tampak nyaman (komentar muncul di cyanbukannya blueyang sangat sulit untuk membaca dengan latar belakang gelap). setelah perubahan ini semuanya bekerja dengan baik. Tapi ingat untuk menambahkan unlet! skip_defaults_vim source $VIMRUNTIME/defaults.vimfile vimrc untuk menggunakan penyorotan sintaks dll ...
Abinash Dash
2

Berkat analisis @ egmont tentang warna apa yang dikeluarkan Vim saat itu TERM=screen-256color, saya terinspirasi untuk melihat skema warna yang digunakan Vim dalam dua skenario.

Vim melaporkan menggunakan defaultskema warna dalam kedua kasus. Saya pikir itu aneh karena defaultskema warna pada Fedora 25 ( /usr/share/vim/vim80/colors/default.vim) tampaknya tidak cocok dengan warna yang sebenarnya saya lihat saat itu TERM=xterm-256color. Jika saya secara eksplisit mengatur skema warna menggunakan :colorscheme defaultsaat TERM=xterm-256color, penampilan Vim berubah ke saat itu TERM=screen-256color. Untuk mendapatkan warna kembali seperti semula ketika saya memulai Vim, saya harus menggunakan ronskema warna. Kemajuan!

Saya menemukan jawaban Tanya Ubuntu yang menunjukkan bahwa ketika Vim melaporkannya menggunakan defaultskema warna, itu tidak selalu berarti default.vimmelainkan beberapa skema warna tema-spesifik. Seperti jawabannya, tema gelap (yang saya gunakan) berhubungan dengan ronskema warna, seperti yang saya temukan di atas. (Meskipun postingan ini berkenaan dengan Ubuntu, saya berasumsi OP menggunakan GNOME.)

Saya juga menemukan pertanyaan lain yang sepertinya menggambarkan masalah yang sama yang saya alami. Saya menemukan itu ketika mencari sebelum saya memposting pertanyaan ini, tetapi, untuk beberapa alasan, skema warna tidak menurut saya relevan.

Saya akhirnya melakukan apa yang @LapshinDmitry lakukan dalam jawabannya dan secara eksplisit mengatur file colorscheme ronsaya ~/.vimrc. Sekarang, apakah saya memulai Vim di dalam atau di luar tmux, warnanya tampak sama. Satu-satunya kelemahan adalah jika saya pernah mengubah tema desktop saya dari rasa gelap ke rasa terang, Vim tidak akan secara otomatis beralih ke skema warna tema cahaya "default", yang tampaknya peachpuff. Saya bisa hidup dengan itu, karena saya tidak mungkin mengubah tema saya.

Saya tidak akan menerima jawaban ini karena saya mempertimbangkan pengaturan skema warna secara eksplisit dalam ~/.vimrcsolusi daripada solusi. Jika seseorang dapat menjelaskan mengapa Vim memuat skema warna "default" yang berbeda tergantung pada nilainya TERM, saya akan dengan senang hati menerima jawaban itu, karena saya lebih tertarik untuk memahami akar permasalahan. Saya menduga itu ada hubungannya dengan bagaimana Vim mengartikan kemampuan terminal antara dua file terminfo.

Rusty Shackleford
sumber
Saya juga ingin tahu mengapa vimberperilaku seperti ini. Lagipula, bcekemampuan itu seharusnya tidak ada hubungannya dengan jumlah warna yang tersedia.
egmont
@egmont I menerjemahkan jawaban @ ThomasDickey sebagai: 1) Vim memeriksa bcekemampuan terminal, 2) jika ada, pilih skema warna "A", 3) jika tidak, pilih skema warna "B". Saya percaya kedalaman warna sama dalam kedua kasus (yaitu 256 warna, seperti yang t_Coditunjukkan). Hanya saja skema warna "B" di sistem saya kebetulan hanya menggunakan palet 8-warna meskipun 256 warna mungkin (saya pikir itu menjelaskan apa yang Anda amati dalam analisis naskah Anda; perbaiki saya jika saya salah). Ingat, setelah saya berlari :colorscheme ron, saya melihat urutan melarikan diri 256-warna dalam sesi Vim yang sama.
Rusty Shackleford
Terima kasih atas penjelasannya - saya masih tidak dapat melihat alasan di balik ini. Sudahlah. vimmemiliki keputusan desain yang sangat aneh.
egmont
0

Variabel TERM saya adalah Di luar tmux: xterm-256color Di dalam tmux: screen-256color

Itu benar dan bekerja untuk saya. Cobalah dengan terminal yang berbeda (saya menggunakan urxvt) untuk melihat apakah Gnome Terminal adalah masalahnya.

Juga periksa COLORTERM(milik saya diatur ke rxvt) dan unset TERMCAP.

laktak
sumber
Terima kasih atas sarannya. Aku berlari tes yang sama dengan urxvt (luar TERM adalah rxvt-unicode-256color) menggunakan sesuai ~/.Xdefaultsdan sayangnya masih mengamati warna yang berbeda di dalam dan di luar tmux. Untuk skenario gnome-terminal, COLORTERMis truecolordan TERMCAPisinya kosong di dalam dan di luar tmux. Untuk skenario urxvt, COLORTERMberada di rxvt-xpmluar dan truecolordi dalam tmux, sementara TERMCAPkosong di dalam dan di luar tmux.
Rusty Shackleford
@RustyShackleford ini hanya untuk Vim? Apakah Anda menggunakan 'termguicolors'? Lihatlah :help xterm-true-coloratau coba dengan konfigurasi Vim yang lebih standar.
laktak
Saya hanya memperhatikan masalah di Vim sejauh ini (seperti yang saya katakan, saya baru saja mulai menggunakan tmux). Sebagai contoh, terminal prompt saya dan keluaran Git CLI tampaknya memiliki warna yang sama baik di dalam maupun di luar tmux. Saya tidak menetapkan termguicolorsdalam .vimrcdan :set termguicolors?laporan saya notermguicolorsdalam kedua kasus. Saya akan melihat topik bantuan yang Anda referensikan; Terima kasih!
Rusty Shackleford
0

Untuk referensi saya sendiri nanti ketika saya tidak diragukan lagi google ini mengatur mesin saya berikutnya.

  • Vim8 / Neovim
  • Windows 10
  • Git bash
  • Tmux 2.7

Gunakan instruksi ini untuk mendapatkan binari dan DLL yang diperlukan ke dalam PATH Git bash:

https://blog.pjsen.eu/?p=440

Gunakan perintah ini untuk mengonfigurasi:

echo 'set -g default-terminal "screen.xterm-256color"' > ~/.tmux.conf
tmux -2u
Josh Peak
sumber