পাইথন কীওয়ার্ড আর্গুমেন্টটি হাইলাইট করার জন্য ভিম সিনট্যাক্স প্যাটার্ন


17

আমি ভিএম রেজিএক্সপিএস শেখার সাথে লড়াই করছি (আমি অন্য কোনও রেজিএক্সপক্সও খুব ভাল জানি না), তাই মূল সমস্যাটি হ'ল রেজিএক্সএক্স সংজ্ঞা দেওয়া যা মিলবে

some_function_call(simple_value, keyword=value)

এই উদাহরণে কীওয়ার্ড।

সুতরাং এটি কোনও শব্দের সাথে মিল থাকা উচিত যদি এটি প্যারেনের ভিতরে থাকে এবং এর পরে সমান চিহ্ন থাকে।

পরবর্তী সমস্যাটি হল কীভাবে সিআইএফ ফাইলগুলি ভিএম-তে সংজ্ঞায়িত করা যায়। আমি এটির সাহায্যের প্রশংসা করব, তবে এটি শেখা এতটা কঠিন হওয়া উচিত নয়, তাই আমি সম্ভবত নিজেরাই এটি করতে পারি।

উত্তরের উপর ভিত্তি করে সম্পাদনা করুন আমি পাইথনের জন্য আমার নিজস্ব সিনট্যাক্স স্ক্রিপ্ট রেখেছি। এটি নিখরচায় চেষ্টা করুন। লিঙ্ক বিবরণ এখানে প্রবেশ করুন


গিথুবটিতে কী-ওয়ার্ড হাইলাইট করার জন্য একটি খোলামেলা বিষয় রয়েছে যা আমি আপ-টু-টু ডেট পাইথন সিনট্যাক্স ফাইলটিতে অন্তর্ভুক্ত করব যার সম্পর্কে আমি অবগত: github.com/hdima/python-syntax/issues/44 আপনি পরে সেখানে যাচাই করতে চাইতে পারেন। এটি কীভাবে করবেন তা যদি আপনি বুঝতে পারেন তবে দয়া করে সেখানকার লোকদের জানান (বা আমাকে বার্তা দিন যাতে আমি একটি পুল অনুরোধ তৈরি করতে পারি) এই বৈশিষ্ট্যটি সবার জন্য উপলব্ধ রয়েছে।
সিবাউমার্ট

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 এ কী বৈধ তা বিবেচনা করে , এটি এমন কোনও কাজ নয় যা আমি গ্রহণ করতে ইচ্ছুক।

Allyচ্ছিকভাবে, আমি মনে করি আপনি এটি ব্যবহার করে ফাংশন কলগুলি হাইলাইট করতে ব্যবহার করতে পারেন 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

@ ব্যবহারকারী1685095 বিল্টিন ফাংশনগুলি pythonBuiltinডিফল্টভাবে সিনট্যাক্স গ্রুপে তালিকাভুক্ত করা হয় syntax/python.vim। যাইহোক, এটা কার্যকারিতা ও builtin ভেরিয়েবল মধ্যে পার্থক্য করে না ( True, Falseএবং Noneরয়েছে pythonBuiltin)। আপনি সম্ভবত আপনার ব্যবহারের জন্য সংজ্ঞাগুলি অনুলিপি করতে পারেন।
মারু

ঠিক আছে, আমি hdima / python এবং vim-polyglot এর মতো vim ডিফল্ট এর পরে আরও সংশোধিত বাক্য গঠন ব্যবহার করেছি। এগুলি সমস্ত কীওয়ার্ডের মতো বিল্টিন ফাংশনকে সংজ্ঞায়িত করে যার গুরুত্বপূর্ণ পরিণতি হয়। কেবল অন্তর্নির্মিত ফাংশনগুলিই হাইলাইট করা হয় না, একই নামগুলির সাথে কেবল একই পরিবর্তনশীল এবং একই নাম সহ অন্যান্য মডিউলগুলিতে ফাংশনগুলি হাইলাইট করা হয়। query(...).***filter***()ফিল্টারটি হাইলাইট করা হয় যেমন বিল্টিন ফিল্টার ফাংশনগুলির সাথে এর কোনও সম্পর্ক নেই।
ব্যবহারকারী1685095

@ ব্যবহারকারী1685095 ডিফল্ট syntax.vimতাদের কীওয়ার্ড তৈরি করে। দেখুন github.com/vim/vim/blob/master/runtime/syntax/python.vim#L184
muru

1
@ ব্যবহারকারী1685095 অদ্ভুত। আমার কাছে অতিরিক্ত syntax/python.vimফাইল নেই (কেবলমাত্র ডিফল্ট, এবং আপনি যে আচরণটি করছেন তা আমি দেখতে পাচ্ছি না: i.stack.imgur.com/LgF6F.png , এবং আমি কীওয়ার্ড সংজ্ঞার সাথে একমত - এটি সবচেয়ে নিকটতম ফিট, এবং আমি কীওয়ার্ডগুলির মতো ক্ষেত্রে nonkeyword.keywordম্যাচ হয়েছে বলে মনে করবেন না vari ভেরিয়েবলের ক্ষেত্রে খেয়াল করুন যে এই বিল্টিনগুলি ভেরিয়েবল, এগুলি ফাংশন অবজেক্টযুক্ত ভেরিয়েবল এবং এটিকে অন্য কোনও ভেরিয়েবলের মতো বরাদ্দ করা যেতে পারে othing কিছুই আপনাকে বাধা দেয় না sorted = filterএবং এর sortedমতো ব্যবহার করতে বাধা দেয় না filter
মুড়ু

8

আপনি যেখান থেকে শুরু করতে পারেন তা এখানে:

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

decomposing:

/(       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

@ নোব 4 উত্তর ছাড়াও আপনি নিম্নলিখিতগুলি করতে পারেন:

  • ফাইল তৈরি করুন ~/.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

আপনার সহযোগিতার জন্য ধন্যবাদ. আমি জানতাম না যে বিদ্যমান নিয়মগুলিকে সংশোধন না করে আমি আমার কাস্টম বাক্য গঠনটি যুক্ত করতে পারি। আপনার প্যাটার্নটি কীওয়ার্ড আর্গুমেন্টের সাথে মেলে না যদি এটি কার্যক্রমে প্রথম যুক্তি হয়। আমি নিজেই এটি ঠিক করার চেষ্টা করব (এটি করার জন্য আমি এখনই রিজেক্সপস শিখছি)। তাড়াতাড়ি আমি কীভাবে করব তা শিখব আমি একটি মন্তব্য পোস্ট করব।
user1685095

আমি ভিএম সন্ধানের মাধ্যমে এই রেজিএক্সপাকে চেষ্টা করছি এবং আমি মনে করি এটি ফাংশন কলের সাথে একটি মাত্র কীওয়ার্ডের সাথে মেলে। তাদের সবার সাথে মেলে আমার এটি দরকার '
user1685095

@ ব্যবহারকারী1685095: হ্যাঁ আপনি ঠিক বলেছেন আমার প্যাটার্নটি ভাল নয়। আমি এটির উন্নতি করার চেষ্টা করব এবং আমার উত্তর সম্পাদনা করব।
স্ট্যাটক্স

3

আমি দেখতে পেলাম যে @ ওল্ফির উত্তরটি একটি মূল শব্দ হিসাবে একটি টিপলকে মোড়কে আঁকিয়েছে এবং এতে লাইনব্রোকন কীওয়ার্ড আর্গুমেন্টগুলি ক্যাপচার করতেও সমস্যা হয়েছিল।

তার রেজেক্স দ্বারা অনুপ্রাণিত হয়ে আমি আমার python.vimসিনট্যাক্স ফাইলটি রাখার জন্য নিম্নলিখিতগুলি নিয়ে এসেছি । (মনে রাখবেন যে আমি মূলত শিরুন / ভিম-পলিগ্লোটpython.vim থেকে সিনট্যাক্স ফাইলটি ব্যবহার করছি )

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

চূড়ান্ত চেকটি রঙিন শর্তাবলীর থেকে হাইলাইট করা থামায়। আপনি চাইলে অপসারণ করতে পারেন।


দুঃখিত, আপনি দেরী করেছেন। আমি নিজের জন্য সিনট্যাক্স ফাইল তৈরি করেছি।
ব্যবহারকারী1685095

সেটা ঠিক আছে; যদি অন্য কেউ একই ইস্যুতে চালিত হয় তবে আমি আশা করি তারা এখানে দেখার চেষ্টা করতে পারে।
ওল্ফি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.