वर्तनी फ़ाइल में URL और ईमेल पतों को अनदेखा करें


12

क्या कोई तरीका है जो HTTP URL और ईमेल पतों को वर्तनी की त्रुटियों के रूप में चिह्नित नहीं करता है? या, आम तौर पर, मान्य वर्तनी के अवशेषों को सूचीबद्ध करने का एक तरीका?

जवाबों:


16

आप कस्टम सिंटैक्स नियम जोड़ सकते हैं, और उन्हें @nospellकीवर्ड दे सकते हैं, यह विम को इस सिंटैक्स मैच में वर्तनी जाँच लागू नहीं करने के लिए कहेगा। उदाहरण के लिए:

:syn match UrlNoSpell "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell

ऊपर पाठ फ़ाइलों के लिए काम करेगा, और कुछ फ़ाइलपेट (जैसे मार्कडाउन), लेकिन सभी फ़ाइलपेट के लिए नहीं।

ध्यान दें कि मैंने यहां एक बहुत ही सरल रेगेक्स का उपयोग किया है; देखें कि मैं कुछ विकल्पों के लिए पाठ से URL को पार्स कैसे कर सकता हूं


अन्य फ़िलिपीस के लिए, आपको थोड़ा और काम करने की आवश्यकता है। उदाहरण के लिए, pythonफ़ाइलों के लिए, टिप्पणियां pythonComment समूह में शामिल हैं /usr/share/vim/vim74/syntax/python.vim:

syn match   pythonComment   "#.*$" contains=pythonTodo,@Spell

इसे ओवरराइड करने के लिए, हमें करने की आवश्यकता है:

:syn match UrlNoSpellComment "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonComment
:highlight def link UrlNoSpellComment Comment

चाल, जिसमें हमारे कस्टम वाक्य रचना मैच के साथ शामिल किया जा सकता पहले से मिलान किया वाक्य रचना मिलान की सूची में जोड़ने के लिए है containedin=यह देखने के लिए विम बताता UrlNoSpellregex भीतरpythonComment मैचों।

हमें highlightसही रंग सेट करने के लिए भी उपयोग करने की आवश्यकता है , क्योंकि ये विरासत में नहीं मिले हैं।

आपको कई स्थानों पर ऐसा करने की आवश्यकता है, उदाहरण के लिए पायथन स्ट्रिंग्स के लिए:

:syn match UrlNoSpellString "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonString
:highlight def link UrlNoSpellString String

हमें 2 अलग सिंटैक्स मिलान समूहों की आवश्यकता है ताकि हम सही सिंटैक्स हाइलाइटिंग लागू कर सकें।

बेशक, अन्य फ़िलिस्तियों के लिए आपको अन्य containedin=सिंटैक्स मैचों का उपयोग करने की आवश्यकता है ... एएफएआईके है , कोई "सार्वभौमिक" समाधान नहीं है, लेकिन सही लोगों को ढूंढना /usr/share/vim/vim74/syntax/*.vimबहुत मुश्किल नहीं होना चाहिए।


ध्यान दें कि उपर्युक्त सभी कमांड को सिंटैक्स फ़ाइलों के बाद निष्पादित किया जाना चाहिए ; ऐसा करने के 2 तरीके हैं:

  • कमांड या की-मैपिंग से, इसे हर बार मैन्युअल रूप से लागू किया जाना चाहिए। जैसे

    fun! NoUrlSpell()
        if &filetype == 'python'
            :syn match UrlNoSpellComment "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonComment
            :highlight def link UrlNoSpellComment Comment
            :syn match UrlNoSpellString "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonString
            :highlight def link UrlNoSpellString String
        elseif &filetype == 'ruby'
            " ...
        else
            syn match   pythonComment   "#.*$" contains=pythonTodo,@Spell
        endif
    endfun
    command NoUrlSpell :call NoUrlSpell()
    
  • में कमांड डालते हैं ~/.vim/after/syntax/[filetype].vim। विम इन फ़ाइलों को उठाएगा और डिफ़ॉल्ट सिंटैक्स फ़ाइलों के बाद उन्हें निष्पादित करेगा (देखें:) :help after-directory


3

मार्टिन Tournoij 's अन्यथा उत्कृष्ट जवाब के रूप में मेरे लिए उम्मीद व्यवहार करने के लिए विफल रहता है - शायद वजह से करने के लिए अपने लाभ diraol की अभूतपूर्व python-modeप्लगइन बजाय अजगर के लिए विम के डिफ़ॉल्ट वाक्य रचना फ़ाइल।

पायथन टिप्पणियों, स्ट्रिंग्स, या डॉकस्ट्रिंग्स के तहत यूआरआई को उजागर करने से बचने के python-modeलिए, अपने उपयोगकर्ता-विशिष्ट ~/.vim/after/syntax/python.vimफ़ाइल में निम्नलिखित संक्षिप्त एक-लाइनर जोड़ें :

syntax match NoSpellUriPython '\w\+:\/\/[^[:space:]]\+' transparent contained containedin=pythonComment,python.*String contains=@NoSpell

बस। महत्वपूर्ण रूप से, ध्यान दें कि यह एक एकल पंक्ति में मार्टिन के उत्तर में बारह अलग-अलग रेखाएं होती हैं जो संकुचित होती हैं । कैसे? प्राथमिक, मेरा प्रिय विम-आधारित वाटसन। हम जोड़ते हैं:

  • transparentकीवर्ड, विम का निर्देश देते हुए अपनी मूल वाक्य रचना (जैसे, टिप्पणी, तार) से इस बच्चे वाक्य रचना के लिए मुख्य आकर्षण गुण वारिस के। यह हमें highlight def linkप्रत्येक बाल वाक्यविन्यास समूह के लिए स्पष्ट रूप से आराम करने से बचने में सक्षम बनाता है ।
  • containedकीवर्ड, अतीत अपनी मूल वाक्य रचना की सीमाओं का विस्तार से इस बच्चे वाक्य रचना को रोकने (जैसे, टिप्पणी के लिए EOL, तार के लिए स्ट्रिंग सीमांकक)।
  • सभी पेरेंट सिंटैक्स समूह containedinकीवर्ड पर अल्पविराम द्वारा सीमांकित किए जाते हैं । .*Regex ऑपरेटर हमें चतुराई से मिलान करने के लिए सक्षम बनाता है सभी अजगर स्ट्रिंग वाक्य रचना समूहों (यानी, pythonString, pythonUniString, pythonRawString, pythonUniRawString, pythonDocstring) कम से कम दर्द और अधिक से अधिक आगे संगतता के साथ।

यद्यपि तकनीकी रूप से मान्य है, मार्टिन के उत्तर में एम्बेड की गई विमस्क्रिप्ट DRY (डोंट रिपीट योरसेल्फ) सिद्धांत का उल्लंघन करती है। आगे के विवरण के लिए भी इसी तरह का उत्तर देखें

लेकिन रुकिए ... और भी है।

ग्रेट ग्लोरी के लिए अनकैप्ड-फॉर इंप्रूवमेंट्स

मैं दोनों विम के अत्यधिक भोली डिफ़ॉल्ट वर्तनी जाँच और तृतीय-पक्ष प्लगइन्स (उदाहरण के लिए, स्पेलुन्कर , जो बिना शर्त वर्तनी को केवल कोड टिप्पणियों और स्ट्रिंग्स के बजाय पूरे बफर की जाँच करता है) से काफी नाराज हूँ जो मैंने तय किया है ... वास्तव में कुछ करने के लिए उसके बारे में। </gasp>

अच्छी तरह से परीक्षण किया विम नीचे झलकी समझदारी से बचा जाता है अजगर टिप्पणियों और तार के भीतर निम्न में से सभी वर्तनी जांच:

  • यूआरआई (ऊपर के रूप में)।
  • CamelCase पहचानकर्ता।
  • snake_case पहचानकर्ता।
  • UPPERCASE पहचानकर्ता।
  • @-संशोधित पहचानकर्ता (जैसे, @muhdecorator)।
  • "-delimited filetyped फ़ाइल नाम (जैसे, "muh_module.py")।
  • :-delimited substrings (जैसे, :func:में: func: `re.sub`)।
  • `-Delimited substrings (जैसे, re.subमें: func:` re.sub`)।

निम्नलिखित में से कुछ या सभी को अपनी उपयोगकर्ता-विशिष्ट ~/.vim/after/syntax/python.vimफ़ाइल में जोड़ें और हांफते हुए हांफें क्योंकि विम वास्तव में वर्तनी की जाँच करता है:

" Avoid spell checking URIs.
syntax match NoSpellPythonUri /\v\w+:\/\/[^[:space:]]+/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell

" Avoid spell checking both CamelCase-formatted identifiers and uppercase
" identifiers. Since most languages (excluding Raku) prohibit Unicode in
" identifiers, these matches are intentionally confined to ASCII codepoints
" (e.g., "[A-Z]" rather than "[[:upper:]]").
syntax match NoSpellPythonCaps /\v<[A-Z]([A-Z0-9]{-1,}|[a-z0-9]+[A-Z0-9].{-})>/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell

" Avoid spell checking snake_case-formatted identifiers.
syntax match NoSpellPythonSnake /\v<\w+_.{-1,}>/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell

" Avoid spell checking "@"-prefixed identifiers.
syntax match NoSpellPythonDecorator /\v\@[a-zA-Z].{-}>/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell

" Avoid spell checking ":"-delimited substrings.
syntax match NoSpellPythonColons /\v:[^:]+:/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell

" Avoid spell checking "`"-delimited substrings.
syntax match NoSpellPythonTicks /\v`[^`]+`/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell

" Avoid spell checking '"'-delimited filetyped filenames matched as a
" double-quoted substring containing a filename prefix, a period, and one to
" four characters comprising a filetype.
syntax match NoSpellPythonPath /\v"[^"]+.[^"]{1,4}"/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell

बेशक, उपरोक्त सभी (और संभवतः होना चाहिए) एक गॉडज़िला जैसी नियमित अभिव्यक्ति से मेल खाते एक एकल-लाइनर के लिए कम किया जा सकता है कि कोई भी खुद को कभी भी बनाए रखने या पढ़ने में सक्षम नहीं होगा। सभी की पवित्रता के लिए, मैंने ऐसा नहीं किया।

यदि कोई ऐसा व्यक्ति नहीं है जो अन्य लोकप्रिय भाषाओं में उपरोक्त को विस्तार देते हुए GitHub- होस्टेड Vim प्लगइन बनाना चाहे, तो यह बहुत अच्छा होगा। विम का डिफ़ॉल्ट वर्तनी जाँच कार्यान्वयन लगभग वहाँ है, लोग; इसे सिर्फ ओपन-सोर्स समुदाय से मदद की ज़रूरत है।

तब तक, StackOverflow आपके साथ हमेशा हो सकता है!


2
मैंने यहाँ उत्तर लिखते समय इस पूरे विम सिंटैक्स हाइलाइटिंग चीज़ का पता लगाया। मुझे हमेशा नहीं पता था कि मैं क्या कर रहा हूँ जो ईमानदार है, इसलिए विशेष रूप से कुछ पुराने उत्तर कम-से-इष्टतम हो सकते हैं
मार्टिन टूरनोइज

तुम बहुत मामूली हो, मार्टिन। आपके "बर्फ को तोड़ने" के जवाब के बिना, मैं और कई अन्य लोग भी नहीं जानते होंगे कि कहां से शुरू करना है। इस संपादक पार्टी को शुरू करने के लिए धन्यवाद! रोम एक दिन में नहीं बनाया गया हो सकता है, लेकिन कम से कम हम इसे एक बार में देख सकते हैं।
सेसिल करी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.