अजगर कीवर्ड तर्क को हाइलाइट करने के लिए सिंटैक्स पैटर्न


17

मैं vim regexps (मैं किसी भी अन्य regexp को अच्छी तरह से नहीं जानता) सीखने के साथ संघर्ष कर रहा हूँ, इसलिए मुख्य समस्या regexp को परिभाषित करने के लिए है जो मेल खाएगी

some_function_call(simple_value, keyword=value)

इस उदाहरण में कीवर्ड।

तो यह एक शब्द से मेल खाना चाहिए अगर यह अंदर मुर्गियाँ है और इसके बाद समान चिह्न है।

अगली समस्या यह है कि वाक्यविन्यास फ़ाइलों को vim में कैसे परिभाषित किया जाए। मैं उस के साथ मदद की सराहना करता हूं, लेकिन यह सीखना मुश्किल नहीं होना चाहिए, इसलिए मैं अपने दम पर ऐसा कर सकता हूं।

EDIT जवाब के आधार पर मैंने अजगर के लिए अपनी खुद की वाक्य रचना स्क्रिप्ट की है। बेझिझक इसे आज़माएं। यहां लिंक विवरण दर्ज करें


कीवर्ड को उजागर करने के लिए गितुब पर एक खुला मुद्दा है, जो कि सबसे अद्यतित पायथन सिंटैक्स फ़ाइल में शामिल है, मुझे इसकी जानकारी है: github.com/hdima/python-syntax/issues/44 आप बाद में वहां देखना चाहते हैं। यदि आप यह पता करते हैं कि यह कैसे करना है, तो कृपया इस सुविधा के लिए वहां के लोगों को बताएं (या मुझे संदेश दें ताकि मैं एक पुल अनुरोध बना सकूं) सभी के लिए उपलब्ध हो।
cbaumhardt

1
हाँ, मैं वही हूँ जिसने इसे खोला है।
user1685095

जवाबों:


12

इन सेटिंग्स के साथ:

syn region FCall start='[[:alpha:]_]\i*\s*(' end=')' contains=FCall,FCallKeyword
syn match FCallKeyword /\i*\ze\s*=[^=]/ contained
hi FCallKeyword ctermfg=yellow

मुझे मिला:

यहां छवि विवरण दर्ज करें

यहाँ:

  1. मैं एक सिंटैक्स क्षेत्र को परिभाषित करता हूं जिसके भीतर कीवर्ड तर्क पाए जा सकते हैं, जो फ़ंक्शन कॉल होगा। containsविकल्प मेरे घोंसला फ़ंक्शन कॉल करने देता है।
  2. उस क्षेत्र के भीतर, मैं मान्य पहचानकर्ता वर्ण ( \i*) के बाद किसी भी स्ट्रिंग से मेल खाता हूं =, लेकिन नहीं ==, ताकि समानता परीक्षण से मिलान न हो।

क्षेत्रों का उपयोग करके, मुझे उन मेलों का घोंसला बनाने की आवश्यकता है, जिनकी मुझे आवश्यकता है, जो कि बहुत ही जटिल (असंभव?) होगा यदि मैं matchनियमित अभिव्यक्तियों के साथ बस गया होता ।

मेरा मानना ​​है कि फ़ंक्शन कॉल और कीवर्ड के मिलान के लिए उपयोग किए जाने वाले नियमित अभिव्यक्तियों को परिष्कृत किया जा सकता है, लेकिन पायथन 3 में क्या मान्य है , इस पर विचार करते हुए , यह एक ऐसा काम नहीं है जिसे मैं करने के लिए तैयार हूं।

वैकल्पिक रूप से, मुझे लगता है कि आप फ़ंक्शन कॉल को हाइलाइट करने के लिए इसका उपयोग कर सकते हैं matchgroup:

syn region FCall matchgroup=FName start='[[:alpha:]_]\i*\s*(' end=')' contains=FCall,FCallKeyword
syn match FCallKeyword /\i*\ze\s*=[^=]/ contained
hi FCallKeyword ctermfg=yellow
hi FName ctermfg=blue

यहां छवि विवरण दर्ज करें


मुझे शायद एक और प्रश्न बनाना चाहिए, लेकिन क्या आपके पास केवल बिल्डिन कार्यों को उजागर करने के बारे में विचार हैं?
user1685095

@ user1685095 बिलियन फ़ंक्शन pythonBuiltinडिफ़ॉल्ट में सिंटैक्स समूह में सूचीबद्ध हैं syntax/python.vim। हालांकि, यह कार्य करता है और अंतर्निहित चर के बीच भेद नहीं करता है ( True, Falseऔर Noneमें भी कर रहे हैं pythonBuiltin)। आप शायद अपने उपयोग के लिए परिभाषाओं की नकल कर सकते हैं।
मूरू

खैर, मैंने अधिक परिष्कृत वाक्यविन्यास का उपयोग किया है फिर एचडीआईएम / अजगर और विम-पॉलीग्लॉट जैसे डिफ़ॉल्ट डिफ़ॉल्ट। वे सभी एक कीवर्ड की तरह अंतर्निहित कार्यों को परिभाषित करते हैं जिनके महत्वपूर्ण परिणाम होते हैं। न केवल अंतर्निहित कार्यों को हाइलाइट किया गया है, बल्कि समान नामों के साथ केवल चर और अन्य मॉड्यूल में समान नाम वाले कार्यों को हाइलाइट किया गया है। जैसे query(...).***filter***()फ़िल्टर को हाइलाइट किया जाता है जबकि इसका बिल्टिन फ़िल्टर फ़ंक्शंस से कोई लेना-देना नहीं है।
user1685095

@ user1685095 डिफ़ॉल्ट syntax.vimउन्हें कीवर्ड बनाता है। Github.com/vim/vim/blob/master/runtime/syntax/python.vim#L184
muru

1
@ user1685095 ऑड। मेरे पास अतिरिक्त syntax/python.vimफ़ाइलें नहीं हैं (केवल डिफ़ॉल्ट है, और मैं आपके द्वारा किए गए व्यवहार को नहीं देखता: i.stack.imgur.com/LgF6F.png , और मैं कीवर्ड परिभाषा से सहमत हूं - यह सबसे निकटतम फिट है, और मैं नहीं लगता कि कीवर्ड तरह के मामलों में मिलान किया जाता है nonkeyword.keywordचर के लिए। के रूप में, ध्यान दें कि इन builtins हैं चर, वे पहले की तरह काम वस्तुओं युक्त चर, और किसी भी अन्य चर की तरह करने के लिए सौंपा जा सकता है। ऐसा करने से कुछ भी नहीं रोकता है आप sorted = filterऔर फिर का उपयोग कर sortedकी तरह filter
मूरू

8

यहाँ आप कहाँ से शुरू कर सकते हैं:

/([^,]\+,\s\(\w\+\)=.*)

सड़ते हुए:

/(       start matching a (
[^,]\+   match multiple characters that are not ,
,\s      match a , and a space
\(       start a matching group
\w\+     match word characters
\)       end the matching group
=.*)      match an = and anything until the closing )

इसमें सुधार की आवश्यकता है लेकिन आप इसे कैसे कर सकते हैं इसका अवलोकन देता है।


6

@ Nobe4 उत्तर के अलावा आप निम्नलिखित कार्य कर सकते हैं:

  • फ़ाइल बनाएँ ~/.vim/after/syntax/python.vim
  • फ़ाइल में थीस लाइन डालें:

    syntax match PythonArg /(.*\,\s*\zs\w\+\ze\s*=.*)/
    hi PythonArg guibg=blue
    
  • अपने पसंदीदा मूल्यों के साथ दूसरे को अपनाएं।

यह एक सिंटैक्स फ़ाइल बनाएगा जो आपके तर्कों के लिए एक सिंटैक्स मिलान जोड़ेगी =और उसके बाद शैली का उपयोग करने के लिए सेट करेगी । यह विषय :h mysyntaxfile-addआपके लिए रोचक होना चाहिए।

इसके अलावा, मैंने अन्य उत्तर की तुलना में एक अलग रेगेक्स का उपयोग किया, यहां विस्तार है (मुझे नहीं पता कि कौन सा बेहतर काम करता है इसलिए आपको संभवतः प्रयास करना होगा:

(      Begin the pattern with a bracket
.*,    Look for any number of any character before a ,
\s*    Zero or more white spaces after the ,
\zs    Start the matching group (what will be highlighted)
\w\+   Match one or more word characters
\ze    End the matching group
\s*    Zero or more white spaces between your argument and the = sign
=      A literal = sign after your argument
.*)    Any number of any characters between your = sign and the closing bracket

मदद के लिये शुक्रिया। मुझे नहीं पता था कि मैं मौजूदा नियमों को संशोधित किए बिना अपने कस्टम सिंटैक्स को जोड़ सकता हूं। यदि यह फ़ंक्शन का पहला तर्क है, तो आपका पैटर्न कीवर्ड तर्क से मेल नहीं खाता है। मैं खुद को ठीक करने की कोशिश करूँगा (मैं ऐसा करने के लिए अभी regexps सीख रहा हूं)। जैसे ही मैं सीखूंगा कि कैसे करना है कि मैं एक टिप्पणी पोस्ट करूंगा।
user1685095

मैं इस खोज के माध्यम से regexp की कोशिश कर रहा हूं और मुझे लगता है कि यह फ़ंक्शन कॉल में केवल एक कीवर्ड से मेल खाता है। मुझे उन सभी से मिलान करने की आवश्यकता है '
user1685095

@ user1685095: हाँ, आप सही हैं मेरा पैटर्न अच्छा नहीं है। मैं इसे सुधारने और अपना उत्तर संपादित करने का प्रयास करूँगा।
statox

3

मैंने पाया कि @ वोल्फ़ी का जवाब एक कीवर्ड के रूप में टपल को खोलना नहीं है और लाइनब्रोकन लॉजिक को कैप्चर करने में भी परेशानी हुई।

उनके रेगेक्स से प्रेरित होकर मैं अपनी python.vimसिंटैक्स फ़ाइल में डालने के लिए आया था । (ध्यान रखें कि मैं मूल रूप python.vimसे sheerun / vim-polyglot से वाक्यविन्यास फ़ाइल का उपयोग कर रहा हूँ )

syn match pythonFunctionKeyword "\v\s{-}\zs\w+\ze\=(\=)@!(\_s)@!" display
syn cluster pythonExpression add=pythonFunctionKeyword
syn region pythonFunctionKwargs start=+(+ end=+)+ contains=@pythonExpression

और रेगेक्स ब्रेकडाउन @ वोल्फी के उत्तर के समान है :

\v      set to very magic mode
\s{-}   capture whitespace, nongreedy
\zs     start of the match (what to actually highlight)
\w+     one or more alphanumeric character, underscore included
\ze     stop matching; anything after this is delimiting only
\=      one single equal sign
(\=)@!  ...not followed by another equal sign
(\_s)@! ...not followed by any whitespace or newline character

ध्यान दें कि यह एक कीवर्ड के रूप में लिखा तर्क रंग नहीं होगा: key = value। जिसे मैं एक अच्छी बात मानता हूं, क्योंकि वह कीवर्ड तर्क के लिए आधिकारिक पीईपी -8 व्हाट्सएप सिफारिश के खिलाफ जाता है


2

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

syntax match PythonArg "\v[\(\,]\s{-}\zs\w+\ze\s{-}\=(\=)@!"
hi PythonArg ctermfg = 214 guifg = #ffaf00

ctermfgकंसोल टर्मिनल के guifgलिए है, गुई के लिए है। बेशक आप जो कुछ भी फैंसी पाते हैं, उसे रंग बदलने के लिए स्वतंत्र हैं। यहाँ एक आसान सूची है

हमेशा की तरह, आप इसे अंदर डालते हैं ~/.vim/after/syntax/python.vim

रेगेक्स ब्रेकडाउन के लिए, यहां आप जाएं:

\v      set to very magic mode
[\(\,]  capture either a ( or a ,
\s{-}   capture whitespace, nongreedy
\zs     start of the match (what to actually highlight)
\w+     one or more alphanumeric character, underscore included
\ze     stop matching; anything after this is delimiting only
\s{-}   once again, capture whitespace.
\=      one single equal sign
(\=)@!  ...not followed by another equal sign

अंतिम चेक रंग की स्थिति से हाइलाइटिंग को रोकता है। आप चाहें तो निकाल सकते हैं।


क्षमा करें, आपको देर हो गई। मैं खुद के लिए वाक्यविन्यास फ़ाइल नौकरानी हूँ।
user1685095

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