गैर-अस्सी पात्रों को उजागर करने के लिए विम कैसे प्राप्त करें?


153

मैं गैर-एएससीआईआई पात्रों को उजागर करने के लिए विम प्राप्त करने की कोशिश कर रहा हूं। क्या ऐसा करने के लिए एक उपलब्ध सेटिंग, regex खोज पैटर्न या प्लगइन है?

जवाबों:


291

[]अपनी खोज में वर्ण वर्ग में श्रेणी का उपयोग करते हुए , आपको ASCII हेक्साडेसिमल वर्ण श्रेणी को बाहर करने में सक्षम होना चाहिए , इसलिए ASCII सीमा के बाहरhlsearch पड़े अन्य सभी वर्णों को हाइलाइट करना (आपके द्वारा सक्षम होना चाहिए) :

/[^\x00-\x7F]

यह ASCII और ASCII (0-127) के बीच के पात्रों के लिए एक नकारात्मक मैच (के माध्यम से [^]) करेगा, और मेरे सरल परीक्षण में काम करता दिखाई देगा। विस्तारित ASCII के लिए, निश्चित रूप से, उपयोग करने के बजाय सीमा बढ़ाएँ ।0x000x7F\xFF\x7F/[^\x00-\xFF]

आप इसे दशमलव के माध्यम से भी व्यक्त कर सकते हैं \d:

/[^\d0-\d127]

यदि आपको कुछ और विशिष्ट चाहिए, जैसे गैर-मुद्रण योग्य वर्णों का बहिष्करण, तो आपको उन श्रेणियों को वर्ण वर्ग में जोड़ना होगा []


14
दशमलव में:/[^\d0-\d127]
बोह्र

@ बोहर यह एक अच्छा अतिरिक्त है। मैं इसे ऊपर संपादित करूँगा।
माइकल बर्कोव्स्की

महान! दिन बचाया! इंडेंटेशन कैरेक्टर में से एक मेरे पाइथन कोड में पेस्ट हो गया और यूनिकोड एरर ने मुझे मारना शुरू कर दिया। vim plugin द्वारा उपयोग किए गए समान वर्ण के बीच का पता लगाना कठिन था!
कोलीरी

36

हां, किसी भी मिलान किए गए तारों के लिए हाइलाइटिंग करने के लिए एक देशी विशेषता है। विम के अंदर, करें:

:help highlight
:help syn-match

syn-matchएक स्ट्रिंग को परिभाषित करता है जो एक समूह में गिरता है। highlightसमूह द्वारा प्रयुक्त रंग को परिभाषित करता है। सिर्फ़ अपने vimrc फ़ाइलों के लिए सिंटैक्स हाइलाइटिंग के बारे में सोचें।

तो आप अपने .vimrc फ़ाइल में कमांड का उपयोग कर सकते हैं:

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

आपको :अपने vimrc में आदेशों के सामने रखने की आवश्यकता नहीं है ।
FDinoff

termbgVIM 7.3 में उबंटू सर्वर 12.10 पर स्थापित के रूप में एक कानूनी आदेश प्रतीत नहीं होता है।
डॉटनचेन

4
फिर termbgVIM 7.3 में उबंटू सर्वर 12.10 पर स्थापित होने का कानूनी पैरामीटर नहीं लगता है।
dotancohen

वास्तव में, नियमित टर्मिनल termमें पृष्ठभूमि रंग नहीं हो सकता है, जबकि रंग टर्मिनल ctermहो सकता है।
दीमा तिस्नेक

शब्द निकाले गए लेकिन आप ctermfg, guifg, आदि को भी अग्रभूमि को नियंत्रित करने के लिए जोड़ सकते हैं।
fatal_error

16

अन्य के लिए (अब कम अशुभ से) लोग एक खोज इंजन के माध्यम से यहाँ समाप्त होते हैं और गैर-ASCII वर्णों को उजागर नहीं कर सकते हैं, इसे आज़माएं (इसे अपने .vimrc में डालें):

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

यह नियमित रूप से नहीं टकराने का अतिरिक्त लाभ है (फ़ाइल एक्सटेंशन [फ़ाइल एक्सटेंशन] आधारित) वाक्यविन्यास परिभाषाएँ।


मुझे E319: Sorry, the command is not available in this version: au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" Press ENTER or type command to continueलिनक्स मिंट 17.3
नासर

3
हालांकि लक्ष्य को पहले से परिभाषित वाक्यविन्यास परिभाषाओं के साथ संघर्ष नहीं करने के लिए कहा गया है , यदि आप चाहते हैं कि आप इसे containedin=ALLअंतिम पंक्ति के अंत में जोड़ सकते हैं , तो इसे बना सकते हैं au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" containedin=ALL। मैं इसके लायक व्याकुलता पाता हूं (जब यूनिकोड की अनुमति दी जाती है), तो यहां मूल जवाब एक बयान के अंदर गैर- if
असिसी

1
autocmd BufRead ....जब तक आपके पास एक बहुत अच्छा कारण नहीं है, तब तक यह हमेशा आपके लिए एक ऑटोग्रुप में शामिल करने के लिए सुरक्षित होता है ...
Cbhihe

6

यह रेगेक्स भी काम करता है। यह briceolion.com से "vim remove non-ascii characters" के लिए पहला Google हिट था और इसके साथ :set hlsearchहाइलाइट होगा:

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

1
सवाल गैर-अस्सी के चरित्रों को उजागर करने के लिए कह रहा है , उन्हें हटाने के लिए नहीं
चुतसू

1
यह इंगित करने के लिए धन्यवाद, मैंने अपना उत्तर संपादित कर लिया है। यह देखने के लिए बहुत अधिक खिंचाव नहीं था कि यह रेगेक्स भी इस तरह से प्रश्न का उत्तर देता है जो अन्य उत्तरों से अलग है। मेरा मूल उत्तर :%s/[^[:alnum:][:punct:][:space:]]//gcजो पहले हाइलाइट किया गया था , फिर बदल दिया गया।
ग्रांट बोमन

4

यदि आप गैर-मुद्रण योग्य वर्णों में भी रुचि रखते हैं तो इसका उपयोग करें:/[^\x00-\xff]/

मैं इसे एक फ़ंक्शन में उपयोग करता हूं:

 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

आपका फ़ंक्शन यहां काम नहीं करता है, यह उजागर नहीं करता है और यह एन्कोडिंग को भी गड़बड़ करता है। आप स्थानीय एन्कोडिंग को क्यों बदल रहे हैं?
वर्नर

बदलने की कोशिश encकरने के लिए fenc। मैंने एन्कोडिंग को बदल दिया क्योंकि मेरी डिफ़ॉल्ट एन्कोडिंग है (2013 में) latin1। यदि वर्ण लैटिन 1 है तो फ़ंक्शन गैर मुद्रण योग्य वर्णों को उजागर नहीं करता है। आप ERRORअपने रंग सिंटैक्स फ़ाइल में कुंजी होना चाहिए पर प्रकाश डाला देखें । यह मेरा है:hi Error guifg=Black guibg=Orange
रेमन

2

इस विषय पर अन्य उत्तरों और मेरे द्वारा यहां दिए गए उत्तर के आधार पर मैंने इसे अपने साथ जोड़ा है .vimrc, ताकि मैं टाइप करके गैर-अस्की हाइलाइटिंग को नियंत्रित कर सकूं <C-w>1। यह टिप्पणियों के अंदर भी दिखाता है, हालांकि आपको प्रत्येक फ़ाइल सिंटैक्स के लिए टिप्पणी समूह को जोड़ना होगा जो आप उपयोग करेंगे। यही है, यदि आप एक zsh फ़ाइल को संपादित करेंगे, तो आपको zshCommentलाइन में जोड़ना होगा

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

अन्यथा यह गैर-असिसी चरित्र नहीं दिखाएगा (आप सभी समूहों में गैर-अस्की चरित्र दिखाना सुनिश्चित करना चाहते हैं, तो आप इन्टिन = सभी को भी सेट कर सकते हैं)। यह जांचने के लिए कि टिप्पणी को किसी भिन्न फ़ाइल प्रकार पर कैसे कॉल किया जाता है, वांछित प्रकार की फ़ाइल खोलें और :syविम पर दर्ज करें , फिर टिप्पणी के लिए सिंटैक्स आइटम खोजें।

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

किसी भी तरह उपरोक्त जवाबों में से कोई भी मेरे लिए काम नहीं किया।

इसलिए मैंने इस्तेमाल किया :1,$ s/[^0-9a-zA-Z,-_\.]//g

यह उन अधिकांश पात्रों को रखता है जिनकी मुझे दिलचस्पी है।


1
यह उन पात्रों को हटा देता है, जहां सेशन ने हाइलाइटिंग के लिए कहा है ।
बर्नहार्ड वैगनर

क्या आपका मतलब यह नहीं है [^ 0-9a-zA-Z, \ -_ \।], अर्थात?
1226 पर बेन26941

0

किसी ने पहले ही सवाल का जवाब दिया है। हालाँकि, जिन लोगों को अभी भी समस्या हो रही है, उनके लिए टिप्पणियों (या मामले में किसी भी वाक्यविन्यास समूह) में गैर-अस्की चरित्रों को उजागर करने का एक और समाधान है। यह सबसे अच्छा नहीं है, लेकिन यह एक अस्थायी सुधार है।

एक कोशिश कर सकते हैं:

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

इसमें अन्य समाधानों से मिश्रित भाग हैं। आप हटा सकते हैं contained, लेकिन, दस्तावेज़ीकरण से, अपने आप को फिर से शुरू करने की संभावित समस्या हो सकती है (जैसा कि मैं समझता हूं)। अन्य परिभाषित पैटर्न देखने के लिए, syn-containsअनुभाग में यह होगा।

:help syn-containedin
:help syn-contains 

से पुनर्प्राप्त समस्या: आइटम को उच्च हाइलाइट प्राथमिकता पर सेट करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.