Bagaimana cara mendapatkan Vim untuk menyoroti karakter non-ascii?


153

Saya mencoba membuat Vim menyoroti karakter non-ASCII. Apakah ada pengaturan yang tersedia, pola pencarian regex, atau plugin untuk melakukannya?

Jawaban:


291

Menggunakan rentang dalam []kelas karakter dalam pencarian Anda, Anda harus dapat mengecualikan rentang karakter heksadesimal ASCII, oleh karena itu menyorot (dengan asumsi Anda telah hlsearchmengaktifkan) semua karakter lain yang berada di luar rentang ASCII:

/[^\x00-\x7F]

Ini akan melakukan kecocokan negatif (via [^]) untuk karakter antara ASCII 0x00dan ASCII 0x7F(0-127), dan tampaknya berfungsi dalam tes sederhana saya. Untuk ASCII yang diperluas, tentu saja, rentangkan rentang hingga \xFFalih-alih \x7Fmenggunakan /[^\x00-\xFF].

Anda juga dapat mengekspresikannya dalam desimal melalui \d:

/[^\d0-\d127]

Jika Anda membutuhkan sesuatu yang lebih spesifik, seperti pengecualian karakter yang tidak dapat dicetak, Anda perlu menambahkan rentang tersebut ke dalam kelas karakter [].


14
Dalam desimal:/[^\d0-\d127]
Bohr

@ Bohr Itu tambahan yang bagus. Saya akan mengeditnya di atas.
Michael Berkowski

Bagus! menyelamatkan hari! salah satu karakter lekukan disisipkan ke dalam kode python saya dan kesalahan unicode mulai membunuh saya. sulit dideteksi di antara karakter yang sama yang digunakan oleh plugin vim!
kollery

36

Ya, ada fitur asli untuk melakukan penyorotan untuk string yang cocok. Di dalam Vim, lakukan:

:help highlight
:help syn-match

syn-matchmendefinisikan string yang cocok masuk dalam grup. highlightmendefinisikan warna yang digunakan oleh grup. Pikirkan saja tentang penyorotan sintaks untuk file vimrc Anda.

Jadi Anda dapat menggunakan perintah di bawah ini dalam file .vimrc Anda:

syntax match nonascii "[^\x00-\x7F]"
highlight nonascii guibg=Red ctermbg=2

Anda tidak perlu meletakkan perintah :di depan di vimrc Anda.
FDinoff

termbgsepertinya tidak menjadi perintah hukum dalam VIM 7.3 sebagaimana diinstal pada Ubuntu Server 12.10.
dotancohen

4
Maka termbgtampaknya tidak menjadi parameter hukum dalam VIM 7.3 yang diinstal pada Ubuntu Server 12.10.
dotancohen

Memang, terminal reguler termtidak dapat memiliki warna latar belakang, sedangkan terminal warna ctermdapat.
Dima Tisnek

menghapus termbg tetapi Anda bisa menambahkan ctermfg, guifg, dll untuk juga mengontrol latar depan.
fatal_error

16

Untuk orang lain (mulai sekarang yang kurang beruntung) yang berakhir di sini melalui mesin pencari dan tidak dapat melakukan penyorotan karakter non-ASCII, coba ini (masukkan ini ke dalam .vimrc Anda):

highlight nonascii guibg=Red ctermbg=1 term=standout
au BufReadPost * syntax match nonascii "[^\u0000-\u007F]"

Ini memiliki manfaat tambahan karena tidak bertabrakan dengan definisi sintaksis biasa (tipe file [ekstensi file]).


Saya mendapatkan E319: Sorry, the command is not available in this version: au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" Press ENTER or type command to continueLinux mint 17.3
Nasser

3
Meskipun tujuannya dinyatakan tidak bertentangan dengan definisi sintaksis yang sudah didefinisikan, jika Anda menginginkannya , Anda dapat menambahkan containedin=ALLke akhir baris terakhir, membuatnya au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" containedin=ALL. Saya menemukan gangguan layak (ketika unicode diperbolehkan), jawaban asli di sini tidak menangkap hal-hal seperti kode non-ascii di dalam ifpernyataan ...
svenevs

1
Itu selalu lebih aman untuk menyertakan Anda autocmd BufRead ....dalam autogroup di vim, kecuali Anda memiliki alasan yang sangat baik untuk tidak ...
Cbhihe

6

Regex ini juga berfungsi. Itu adalah hit google pertama untuk "vim remove non-ascii karakter" dari briceolion.com dan dengan :set hlsearchakan menyorot:

/[^[:alnum:][:punct:][:space:]]/

1
Pertanyaannya adalah meminta untuk menyoroti karakter non-ascii, tidak menghapusnya .
chutsu

1
Terima kasih telah menunjukkan itu, saya sudah mengedit jawaban saya. Tidak terlalu sulit untuk melihat bahwa regex ini juga menjawab pertanyaan dengan cara yang berbeda dari jawaban lainnya. Jawaban asli saya adalah :%s/[^[:alnum:][:punct:][:space:]]//gcyang paling utama, lalu diganti.
Grant Bowman

4

Jika Anda tertarik juga pada karakter yang tidak dapat dicetak, gunakan yang ini:/[^\x00-\xff]/

Saya menggunakannya dalam suatu fungsi:

 function! NonPrintable()
   setlocal enc=utf8
   if search('[^\x00-\xff]') != 0
     call matchadd('Error', '[^\x00-\xff]')
     echo 'Non printable characters in text'
   else
     setlocal enc=latin1
     echo 'All characters are printable'
   endif
 endfunction

Fungsi Anda tidak berfungsi di sini, tidak disorot dan juga mengacaukan penyandian. Mengapa Anda mengubah pengkodean lokal?
Werner

Coba ubah encke fenc. Saya mengubah penyandian karena penyandian default saya adalah (pada tahun 2013) latin1. Fungsi tidak menyoroti karakter yang tidak dapat dicetak jika set karakter latin1. Juga lihat sorotan Anda harus memiliki kunci ERRORdalam file sintaks warna Anda. Ini milik saya:hi Error guifg=Black guibg=Orange
Reman

2

Berdasarkan jawaban lain pada topik ini dan jawaban yang saya dapatkan di sini saya telah menambahkan ini ke saya .vimrc, sehingga saya dapat mengontrol penyorotan non-ascii dengan mengetik <C-w>1. Itu juga menunjukkan komentar di dalam, meskipun Anda perlu menambahkan grup komentar untuk setiap sintaks file yang akan Anda gunakan. Artinya, jika Anda akan mengedit file zsh, Anda harus menambahkannya zshCommentke baris

au BufReadPost * syntax match nonascii "[^\x00-\x7F]" containedin=cComment,vimLineComment,pythonComment

jika tidak, ia tidak akan menampilkan karakter non-ascii (Anda juga dapat mengatur containin = ALL jika Anda ingin memastikan untuk menampilkan karakter non-ascii di semua grup). Untuk memeriksa bagaimana komentar dipanggil pada jenis file yang berbeda, buka file dari jenis yang diinginkan dan masukkan :sypada vim, kemudian cari pada item sintaks untuk komentar.

function HighlightNonAsciiOff()
  echom "Setting non-ascii highlight off"
  syn clear nonascii
  let g:is_non_ascii_on=0
  augroup HighlightUnicode
  autocmd!
  augroup end
endfunction

function HighlightNonAsciiOn()
  echom "Setting non-ascii highlight on"
  augroup HighlightUnicode
  autocmd!
  autocmd ColorScheme *
        \ syntax match nonascii "[^\x00-\x7F]" containedin=cComment,vimLineComment,pythonComment |
        \ highlight nonascii cterm=underline ctermfg=red ctermbg=none term=underline
  augroup end
  silent doautocmd HighlightUnicode ColorScheme
  let g:is_non_ascii_on=1
endfunction

function ToggleHighlightNonascii()
  if g:is_non_ascii_on == 1
    call HighlightNonAsciiOff()
  else
    call HighlightNonAsciiOn()
  endif
endfunction

silent! call HighlightNonAsciiOn()
nnoremap <C-w>1 :call ToggleHighlightNonascii()<CR>

1

Entah bagaimana, tidak ada jawaban di atas yang berfungsi untuk saya.

Jadi saya menggunakan :1,$ s/[^0-9a-zA-Z,-_\.]//g

Itu membuat sebagian besar karakter saya tertarik.


1
Ini menghapus karakter, di mana op diminta untuk menyoroti .
Bernhard Wagner

bukan maksudmu [^ 0-9a-zA-Z, \ -_ \.], yaitu \ -?
ben26941

0

Seseorang sudah menjawab pertanyaan itu. Namun, untuk orang lain yang masih mengalami masalah, berikut ini adalah solusi lain untuk menyoroti karakter non-ascii dalam komentar (atau grup sintaksis apa pun dalam masalah ini). Ini bukan yang terbaik, tapi ini perbaikan sementara.

Seseorang dapat mencoba:

:syntax match nonascii "[^\u0000-\u007F]" containedin=ALL contained |
            \ highlight nonascii ctermfg=yellow guifg=yellow

Ini memiliki bagian campuran dari solusi lain. Anda dapat menghapus contained, tetapi, dari dokumentasi, mungkin ada potensi masalah berulang itu sendiri (seperti yang saya mengerti). Untuk melihat pola yang didefinisikan lainnya, syn-containsbagian akan memuatnya.

:help syn-containedin
:help syn-contains 

Masalah yang direplikasi dari: Atur item ke prioritas sorotan yang lebih tinggi pada vim

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.