Vim'i ascii olmayan karakterleri vurgulaması için nasıl alabilirim?


153

ASCII olmayan karakterleri vurgulamak için Vim almaya çalışıyorum. Bunu yapmak için kullanılabilir bir ayar, normal ifade arama modeli veya eklenti var mı?

Yanıtlar:


291

[]Aramanızdaki bir karakter sınıfındaki aralığı kullanarak , ASCII onaltılık karakter aralığını hariç tutabilmeniz gerekir, bu nedenle ASCII aralığının dışında kalan hlsearchdiğer tüm karakterleri vurgulayın ( etkinleştirdiğiniz varsayılarak ) :

/[^\x00-\x7F]

Bu, ASCII ve ASCII (0-127) arasındaki karakterler için negatif bir eşleşme (üzerinden [^]) yapar 0x00ve 0x7Fbasit testimde çalışıyor gibi görünüyor. Genişletilmiş ASCII için, kuşkusuz aralığı kullanmak \xFFyerine menzili \x7Farttırın /[^\x00-\xFF].

Ondalık olarak da şu şekilde ifade edebilirsiniz \d:

/[^\d0-\d127]

Yazdırılamayan karakterlerin hariç tutulması gibi daha spesifik bir şeye ihtiyacınız varsa, bu aralıkları karakter sınıfına eklemeniz gerekir [].


14
Ondalık olarak:/[^\d0-\d127]
Bohr

@Bohr Bu güzel bir ek. Yukarıda düzenleyeceğim.
Michael Berkowski

harika! günü kurtardı! girintili karakterlerden biri python koduma yapıştırıldı ve unicode hatası beni öldürmeye başladı. vim eklentisi tarafından kullanılan aynı karakter arasında tespit etmek zordu!
kollery

36

Evet, eşleşen dizeler için vurgulama yapmak için yerel bir özellik vardır. Vim içinde şunları yapın:

:help highlight
:help syn-match

syn-matchbir gruba düşme ile eşleşen bir dize tanımlar. highlightgrup tarafından kullanılan rengi tanımlar. Vimrc dosyalarınız için sözdizimi vurgulamayı düşünün.

Böylece .vimrc dosyanızda aşağıdaki komutları kullanabilirsiniz:

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

:vimrc'nize komutların önüne koymanız gerekmez .
FDinoff

termbgUbuntu Server 12.10 üzerine yüklendiği gibi VIM 7.3'te yasal bir komut gibi görünmüyor.
dotancohen

4
O zaman termbgUbuntu Server 12.10 üzerine kurulu gibi VIM 7.3 yasal bir parametre gibi görünmüyor.
dotancohen

Gerçekten, normal terminal termarka plan rengine sahip olamazken, renkli terminal ctermolabilir.
Dima Tisnek

termbg kaldırıldı, ancak ön planı da kontrol etmek için ctermfg, guifg, vb. ekleyebilirsiniz.
fatal_error

16

Buraya bir arama motoru aracılığıyla biten ve ASCII olmayan karakterlerin vurgulanmasını başaramayan diğer (bundan sonra daha az şanssız olan) insanlar için bunu deneyin (bunu .vimrc'nize koyun):

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

Bunun, düzenli (filetype [dosya uzantısı] tabanlı) sözdizimi tanımlarıyla çarpışmama avantajı vardır.


Ben olsun E319: Sorry, the command is not available in this version: au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" Press ENTER or type command to continueLinux nane 17.3
Nasır

3
Amaç belirtilen olmasına rağmen değil zaten tanımlı sözdizimi tanımları ile çelişen, eğer istediğiniz ekleyebilir bunu containedin=ALLyapma, son satırın sonuna kadar au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" containedin=ALL. Ben (Unicode izin verilir) oyalama değerinde o, orijinal cevabı burada yok bulmak değil böyle bir olmayan ASCII kodu içi gibi şeyler yakalamak if... deyimi
svenevs

1
autocmd BufRead ....
Yapmamak

6

Bu normal ifade de işe yarıyor. Bu briceolion.com "vim ascii olmayan karakterler kaldırmak" için ilk google hit oldu ve :set hlsearchvurgulayacaktır:

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

1
Soru, ascii olmayan karakterleri kaldırmak değil , vurgulamak istiyor .
chutsu

1
Bunu işaret ettiğiniz için teşekkürler, cevabımı düzenledim. Bu normal ifadenin soruyu diğer cevaplardan farklı bir şekilde yanıtladığını görmek çok da zor değildi. İlk cevabım önce :%s/[^[:alnum:][:punct:][:space:]]//gcvurgulanan, sonra değiştirilen oldu.
Grant Bowman

4

Yazdırılamayan karakterlerle de ilgileniyorsanız, bunu kullanın:/[^\x00-\xff]/

Bir işlevde kullanın:

 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

İşleviniz burada çalışmıyor, vurgulamıyor ve kodlamayı da karıştırıyor. Yerel kodlamayı neden değiştiriyorsunuz?
Werner

Değiştirmeye çalışın enciçin fenc. Varsayılan kodlamam (2013'te) latin1 olduğundan kodlamayı değiştirdim. Karakter kümesi latin1 ise işlev yazdırılamayan karakterleri vurgulamaz. Vurgulamayı görmek için anahtarın ERRORrenk sözdizimi dosyanızda olması gerekir . Bu benim:hi Error guifg=Black guibg=Orange
Reman

2

Bu konudaki diğer cevaplara ve burada aldığım cevaba dayanarak bunu benim ekledim .vimrc, böylece ascii olmayan vurgulamayı yazarak kontrol edebilirim <C-w>1. Kullanacağınız her bir dosya sözdizimi için yorum grubunu eklemeniz gerekse de, iç açıklamaları da gösterir. Yani, bir zsh dosyasını düzenleyecekseniz zshComment, satıra eklemeniz gerekir

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

Aksi takdirde ascii olmayan karakteri göstermez (tüm gruplarda ascii olmayan karakterleri gösterdiğinizden emin olmak istiyorsanız içerenin = ALL değerini de ayarlayabilirsiniz). Yorumun farklı bir dosya türünde nasıl çağrıldığını kontrol etmek için, istediğiniz türde bir dosya açın ve :syvim'e girin , ardından sözdizimi öğelerinde yorum arayın.

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

Bir şekilde yukarıdaki cevapların hiçbiri işe yaramadı.

Ben de kullandım :1,$ s/[^0-9a-zA-Z,-_\.]//g

İlgilendiğim karakterlerin çoğunu tutar.


1
Bu , op'un vurgulanmasını istediği karakterleri siler .
Bernhard Wagner

demek istemiyor musunuz [^ 0-9a-zA-Z, \ -_ \.], yani \ -?
ben26941

0

Birisi soruyu zaten yanıtladı. Bununla birlikte, hala sorun yaşayan diğerleri için, yorumlarda ascii olmayan karakterleri (veya konuyla ilgili herhangi bir sözdizimi grubunu) vurgulamak için başka bir çözüm. En iyisi değil, ama geçici bir düzeltme.

Biri deneyebilir:

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

Bu, diğer çözümlerden karışık parçalar içerir. Sen kaldırabilir contained(Anlıyorum gibi) belgelerinden, kendisini recursing potansiyel sorun olabilir, ancak. Diğer tanımlı kalıpları görüntülemek için, syn-containsbölüm onu ​​içerir.

:help syn-containedin
:help syn-contains 

Çoğaltılan sorun: Vim'de öğeyi daha yüksek vurgu önceliğine ayarla

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.