Menampilkan spasi tambahan dalam vim

10

Saya ingin memiliki tampilan yang bagus dan manis dari ruang putih di terminal vim saya. Ini memungkinkan saya untuk menghapusnya sebelum menutup file.

Saya sadar bahwa pertanyaan ini cukup populer dan saya sudah menemukan lusinan jawaban di SO. Sayangnya saya belum menemukan yang memuaskan ...

Jadi saya akan mencoba merangkum informasi yang dikumpulkan dan solusi yang saya temukan.

Solusi 1: Sorot ruang trailing secara manual

highlight ExtraWhitespace ctermbg=red guibg=red
match ExtraWhitespace /\s\+$/
autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
autocmd InsertLeave * match ExtraWhitespace /\s\+$/
autocmd BufWinLeave * call clearmatches()

Sorot spasi putih tertinggal

Pro:

  • Mudah digunakan
  • Cepat
  • Cocok dengan cursorline

Cons:

  • Warna yang dipilih tidak kompatibel dengan skema warna lain karena warna diatur secara manual red
  • Blok latar belakang merah besar tidak terlalu estetika

Solusi 2: Menggunakan fitur daftar

set list
set listchars+=trail:◦

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Pro:

  • Mudah digunakan
  • Cepat

Cons:

  • Masalah jika :set cursorlinediaktifkan
  • Warna khusus untuk list/trailtidak dapat dikonfigurasi. Harus sama dengan listchars lainnya

Solusi 3: Menggunakan fitur penyembunyian

syn match WhiteSpace "\s\+$" containedin=ALL conceal cchar=◦
set conceallevel=2 
set concealcursor=nv
highlight Conceal ctermfg=red

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Pro:

  • Lebih cantik dari solusi pertama

Cons:

  • Latar belakang tidak sama dengan latar belakang kursor
  • Dapat mengganggu aturan penyembunyian lainnya
  • Warna yang dipilih tidak selalu kompatibel dengan skema warna
  • Tidak kompatibel dengan Vim versi lama

Pertanyaan saya

Salah satu solusi yang disebutkan adalah yang paling cocok dalam hal kinerja dan kompatibilitas dan bagaimana saya bisa mendapatkan semua pro dan tidak ada yang kontra?

Dengan kata lain, saya ingin mencari solusi di mana:

  • Warna garis belakang sorot sesuai dengan skema warna yang dipilih
  • Warna ini terlihat jelas tetapi tidak terlalu agresif untuk mata
  • Kompatibel dengan cursorline(latar belakang dan latar depan) `
  • Kompatibel dengan plugin lain yang mungkin menggunakan menyembunyikan
  • Trailing char dapat disetel ke char Unicode apa saja
sekarang
sumber
Jika Anda tidak suka merah, maka pilih warna yang berbeda. Jika Anda ingin warna agar kompatibel dengan skema warna yang berbeda, maka tautkan ke nama grup warna daripada menggunakan warna tertentu, misalnya :hi link ExtraWhitespace CursorLine,. Lihat :help hi-link.
garyjohn

Jawaban:

4

Dalam hal kinerja, tidak satupun dari ini harus membuat perbedaan. Vim sebagian besar terhambat oleh pola sintaksis yang kompleks; polanya di sini cukup sederhana.

Untuk membuat warna sorotan sesuai dengan skema warna yang dipilih, gunakan :hi linkuntuk grup yang ada; biasanya begitu Error. Tentu saja, semua ini hanya penting jika Anda sering mengganti tema warna; selain itu, menggunakan warna yang sesuai secara langsung (seperti dalam solusi Anda 1) juga akan baik-baik saja.

Solusi 1: Sorot ruang trailing secara manual

Saya akan memilih ini, tetapi menggunakan matchadd()sebagai ganti :match; ini meninggalkan yang terakhir untuk penyorotan khusus. Juga, clearmatches()terlalu kasar; itu menghapus semua kecocokan, dan karenanya dapat memengaruhi plugin. Anda dapat menggunakan / melihat plugin ShowTrailingWhitespace saya untuk implementasi yang bersih dan kuat (yang juga termasuk pengecualian untuk tipe file tertentu). Ya, ini solusi yang jauh lebih besar, tetapi saya belum melihat adanya dampak apa pun.

Solusi 2: Menggunakan fitur daftar

Ini adalah fitur yang berguna dalam dirinya sendiri, dan mempertahankannya secara permanen memiliki efek pada posisi kursor pada karakter Tab, jadi saya tidak akan merekomendasikan itu.

Solusi 3: Menggunakan fitur penyembunyian

Itu pasti akan mengganggu beberapa sintaks dan plugin menggunakan fitur ini. Ide buruk.

Ingo Karkat
sumber
Jadi, dari jawaban Anda, saya mengerti bahwa ada solusi yang memungkinkan penggunaan karakter Unicode kustom untuk menandai ruang ekstra. Pertanyaan ini memang lebih rumit yang awalnya saya pikir.
nowox
Benar, karakter khusus hanya berfungsi dengan 'listchars'. Bagi saya, penyorotan lebih dari cukup (terutama dengan warna agresif).
Ingo Karkat