কিভাবে একটি ভাঁজ-এক্সপ্রেস লিখতে?


10

আমি ফোল্ড-এক্সপ্রেস ( :h fold-expr) সম্পর্কে সহায়তা পৃষ্ঠাটি পড়েছি তবে এটি এক্সপ্রেশনটিতে কী সিনট্যাক্স ব্যবহার করেছে তা ব্যাখ্যা করে নি।

এখানে চারটি উদাহরণ ছিল:

  1. :set foldexpr=getline(v:lnum)[0]==\"\\t\"
  2. :set foldexpr=MyFoldLevel(v:lnum)
  3. :set foldexpr=getline(v:lnum)=~'^\\s*$'&&getline(v:lnum+1)=~'\\S'?'<1':1
  4. :set foldexpr=getline(v:lnum-1)=~'^\\s*$'&&getline(v:lnum)=~'\\S'?'>1':1

আমি বুঝতে পেরেছি যে v:lnumলাইনটি একটি ইন্ডেনশন স্তর প্রয়োজন, এবং এই এক্সপ্রেশন দুটি একটি ফাংশনে কল।

1,3 এবং 4 এক্সপ্রেশন সম্পর্কে কি? কেউ দয়া করে আমাকে সেগুলি ব্যাখ্যা করতে পারেন?


আমার বোধগম্যতা হল যে অভিব্যক্তিটি একটি সংখ্যা ফেরত পাঠাবে এবং সেই সংখ্যাটি কোন স্তরে প্রদত্ত রেখাটি ভাঁজ করা হবে তা নির্ধারণ করতে ব্যবহৃত হবে। 0 ভাঁজ হয় না, 1 হ'ল বাহ্যতম ভাঁজ, 2 একটি স্তর 1 স্তরের অভ্যন্তরে নীচে ভাঁজ হয় এবং আরও
tommcdo

উত্তর:


12

থেকে :help 'foldexpr':

এটি প্রতিটি লাইনটির ভাঁজ স্তর অর্জনের জন্য মূল্যায়ন করা হয়

foldexprমূল্যায়ন করা হয়, তাই এটি VimL কোড করা প্রয়োজন; "বিশেষ বাক্য গঠন" বা এর মতো কোনও উল্লেখ নেই। এই মূল্যায়নের ফলাফলটি কী ভিমকে ভাঁজ বিবেচনা করে বা না তা নিয়ন্ত্রণ করে।

সম্ভাব্য মানগুলি

  0                     the line is not in a fold
  1, 2, ..              the line is in a fold with this level
  "<1", "<2", ..        a fold with this level ends at this line
  ">1", ">2", ..        a fold with this level starts at this line

এই না সম্পূর্ণ তালিকা; আপনার প্রশ্নের উদাহরণগুলিতে কেবল ব্যবহৃত জিনিসগুলি। :help foldexprসম্পূর্ণ তালিকা জন্য দেখুন ।


প্রথম

প্রথমটি মোটামুটি সহজ একবার যখন আমরা কিছু স্পেস যুক্ত করি এবং ব্যাকস্ল্যাশগুলি সরিয়ে ফেলা হয় তবে আমাদের :setকমান্ডে এটি কাজ করা দরকার :

getline(v:lnum)[0] == "\t"
  1. getline(v:lnum) পুরো লাইন পায়।
  2. [0] এর প্রথম চরিত্রটি পায়
  3. এবং == "\t"এটি কোনও ট্যাব চরিত্র কিনা তা পরীক্ষা করে।
  4. ভিএমএলের "সত্য" বা "মিথ্যা" নেই, এটি কেবল মিথ্যাটির জন্য "0" এবং সত্যের জন্য "1" ব্যবহার করে। সুতরাং যদি এই লাইনটি কোনও ট্যাব দিয়ে শুরু হয়, তবে এটি ফোল্ডলেভেল 1 এ ভাঁজ হয় it যদি এটি না হয় তবে এটি কোনও ভাঁজ (0) এ নেই।

আপনি যদি ট্যাবগুলির সংখ্যা গণনা করতে এটি প্রসারিত করেন তবে আপনার ইনডেন্টেশন-ভিত্তিক ভাঁজ হবে (কমপক্ষে, যখন expandtabসক্ষম নয়)।


তৃতীয়

তৃতীয়টি আসলে প্রথমটির মতো বেশি জটিল নয়; প্রথম উদাহরণ হিসাবে, আমরা প্রথমে এটি আরও পাঠযোগ্য করে তুলতে চাই:

getline(v:lnum) =~ '^\s*$' && getline(v:lnum + 1) =~ '\S' ? '<1' : 1
  1. আমরা পুরো লাইনটি সাথে পাই getline(v:lnum)
  2. আমরা সঙ্গে কোন RegExp যেমন মেলে =~করার '^\s*$'; ^শুরুতে অ্যাঙ্কর \sমানে , যে কোনও সাদা *স্থানের অক্ষর, এর অর্থ পূর্ববর্তী শূন্য বা তার বেশি বার পুনরাবৃত্তি $করা এবং শেষে অ্যাঙ্কারগুলি। সুতরাং এই রিজএক্সপেক্টটি কেবল শ্বেতস্থান সহ ফাঁকা রেখা বা লাইনগুলির সাথে মিলবে (সত্য প্রত্যাবর্তন) ।
  3. getline(v:lnum + 1)পরের লাইন পায়
  4. আমরা এটির সাথে মেলে \S, যা এই লাইনের যে কোনও জায়গায় কোনও অ-সাদা অংশের অক্ষরের সাথে মেলে ।
  5. যদি এই 2 শর্তগুলি সত্য হয় তবে আমরা <1অন্যথায়, এর মূল্যায়ন করি 1। এই "তিন" সঙ্গে সম্পন্ন করা হয় ifC থেকে পরিচিত এবং কিছু অন্যান্য ভাষাসমূহ: condition ? return_if_true : return_if_false
  6. <1মানে একটি ভাঁজ এই লাইনে শেষ হয়, এবং এর 1অর্থ ভাঁজ এক।

সুতরাং, যদি আমরা একটি ভাঁজ শেষ করি যদি লাইনটি ফাঁকা হয় এবং পরবর্তী লাইনটি ফাঁকা না থাকে । অন্যথায়, আমরা ভাঁজটি 1 এ আছি বা :h foldexprএটি যেমন বলে:

এটি খালি রেখার দ্বারা পৃথক করে অনুচ্ছেদে একটি ভাঁজ তৈরি করবে


চতুর্থ

চতুর্থ তৃতীয়টির মতো একই আচরণ করে, তবে এটি কিছুটা ভিন্ন উপায়ে করে। প্রসারিত, এটি:

getline(v:lnum - 1) =~ '^\s*$' && getline(v:lnum) =~ '\S' ? '>1' : 1

যদি পূর্ববর্তী লাইন একটি ফাঁকা লাইন, এবং বর্তমান লাইন একটি অ-ফাঁকা লাইন, আমরা একটি এই লাইন (চালু ভাঁজ শুরু >1,) যদি না, আমরা 1 foldlevel সেটিং করছি।


উত্তরভাষ

সুতরাং 3 টি উদাহরণে যুক্তিটি সত্যই সহজ। বেশিরভাগ অসুবিধাটি জায়গাগুলির অভাবে এবং কিছু ব্যাকস্ল্যাশ ব্যবহারে আসে।

আমি সন্দেহ করি যে কোনও ফাংশন কল করার কিছুটা ওভারহেড থাকে এবং যেহেতু প্রতিটি লাইনটির জন্য এটি মূল্যায়ন করা হয় আপনি একটি সুন্দর পারফরম্যান্স পেতে চান। আমি জানি না যদিও আধুনিক মেশিনগুলির মধ্যে তফাতটি কতটা দুর্দান্ত এবং আপনি যদি কোনও কার্যকারিতা ব্যবহার না করেন তবে আপনি কোনও ফাংশন (২ য় উদাহরণ হিসাবে) ব্যবহার করার পরামর্শ দিবেন। নথকে মনে রাখবেন: "অকালীন অপটিমাইজেশন হ'ল সমস্ত মন্দের মূল"

এই প্রশ্নটি স্ট্যাকওভারফ্লোতেও রয়েছে , যার কিছুটা আলাদা উত্তর রয়েছে। তবে আমার অবশ্যই ভাল ;-)


3

আপনি মূলত জিজ্ঞাসা করছেন যে এই এক্সপ্রেশনগুলির অন্যান্য উপাদানগুলি কী, যা :helpতাদের পরিবর্তে কারও জন্য কল করে পাওয়া যাবে :

v:lnum: the line being evaluated
getline(): get the line of text for a line number
==: equals
=~: matches
<cond>?<if-true>:<if-false>: evaluates to <if-true> if <cond> is true, else to <if-false>

আমি এই অর্থগুলি নীচের অংশগুলি দ্বারা তাদের অর্থটি ব্যাখ্যা করার জন্য ভেঙে ফেলেছি:

1 কোনও ট্যাব দিয়ে শুরু হওয়া সমস্ত লাইনের জন্য 1 এবং অন্যান্য লাইনের জন্য 0 প্রদান করবে:

v:lnum                      the current line number
getline(v:lnum)             the text of the current line
getline(v:lnum)[0]          the first character of the current line
getline(v:lnum)[0]==\"\\t\" the first char of the current line is 'tab'

3 অনুচ্ছেদের পরে ফাঁকা লাইনে ভাঁজ শেষ:

 getline(v:lnum)=~'^\\s*$'                                       current line is only spaces
                              getline(v:lnum+1)=~'\\S'           next line has non-space
(getline(v:lnum)=~'^\\s*$' && getline(v:lnum+1)=~'\\S') ? '<1'   if both of these: <1
                                                              :1 otherwise: 1
(getline(v:lnum)=~'^\\s*$' && getline(v:lnum+1)=~'\\S') ? '<1':1

4 অনুচ্ছেদের সূচনা করে ফাঁকা লাইনে ভাঁজ শুরু হয়:

(getline(v:lnum-1)=~'^\\s*$'                                     previous line only spaces
                                getline(v:lnum)=~'\\S'           this line has non-space
(getline(v:lnum-1)=~'^\\s*$' && getline(v:lnum)=~'\\S') ? '>1'   if both of these: >1
                                                              :1 otherwise: 1
(getline(v:lnum-1)=~'^\\s*$' && getline(v:lnum)=~'\\S') ? '>1':1 

শব্দের অর্থ <1, >1ইত্যাদি এই এক্সপ্রেশন নিচে ঠিক:help fold-expr


1

দুর্ঘটনাক্রমে আমার উত্তর মন্তব্য হিসাবে পোস্ট করেছে এবং তা তাড়াতাড়ি জমা দিয়েছে। ডার্ন মোবাইল।

আমার বোধগম্যতা হল যে অভিব্যক্তিটি একটি সংখ্যা ফেরত পাঠাবে এবং সেই সংখ্যাটি কোন স্তরে প্রদত্ত রেখাটি ভাঁজ করা হবে তা নির্ধারণ করতে ব্যবহৃত হবে। 0 ভাঁজ হয় না, 1 হ'ল বাহ্যতম ভাঁজ, 2 স্তর 1 স্তরের অভ্যন্তরে নীচে ভাঁজ হয় এবং আরও।

উদাহরণগুলির মত প্রকাশগুলি দেখে মনে হয় তারা সত্য বা মিথ্যাতে মূল্যায়ন করবে। ভিমস্ক্রিপ্টের কোনও সঠিক বুলিয়ান ধরণ নেই, সুতরাং এটি সত্যই 1 বা 0 হবে যা বৈধ ভাঁজ স্তরগুলি।

নেমযুক্ত ভাঁজগুলির জন্য মঞ্জুরি দিয়ে আপনি 1 বা 0 বা আরও জটিল হিসাবে ফিরে আসার মতো সহজ, ভিমস্ক্রিপ্ট ব্যবহার করে আপনার নিজের প্রকাশটি লিখতে পারেন।


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