থেকে :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"
getline(v:lnum) পুরো লাইন পায়।
[0] এর প্রথম চরিত্রটি পায়
- এবং
== "\t"এটি কোনও ট্যাব চরিত্র কিনা তা পরীক্ষা করে।
- ভিএমএলের "সত্য" বা "মিথ্যা" নেই, এটি কেবল মিথ্যাটির জন্য "0" এবং সত্যের জন্য "1" ব্যবহার করে। সুতরাং যদি এই লাইনটি কোনও ট্যাব দিয়ে শুরু হয়, তবে এটি ফোল্ডলেভেল 1 এ ভাঁজ হয় it যদি এটি না হয় তবে এটি কোনও ভাঁজ (0) এ নেই।
আপনি যদি ট্যাবগুলির সংখ্যা গণনা করতে এটি প্রসারিত করেন তবে আপনার ইনডেন্টেশন-ভিত্তিক ভাঁজ হবে (কমপক্ষে, যখন expandtabসক্ষম নয়)।
তৃতীয়
তৃতীয়টি আসলে প্রথমটির মতো বেশি জটিল নয়; প্রথম উদাহরণ হিসাবে, আমরা প্রথমে এটি আরও পাঠযোগ্য করে তুলতে চাই:
getline(v:lnum) =~ '^\s*$' && getline(v:lnum + 1) =~ '\S' ? '<1' : 1
- আমরা পুরো লাইনটি সাথে পাই
getline(v:lnum)
- আমরা সঙ্গে কোন RegExp যেমন মেলে
=~করার '^\s*$'; ^শুরুতে অ্যাঙ্কর \sমানে , যে কোনও সাদা *স্থানের অক্ষর, এর অর্থ পূর্ববর্তী শূন্য বা তার বেশি বার পুনরাবৃত্তি $করা এবং শেষে অ্যাঙ্কারগুলি। সুতরাং এই রিজএক্সপেক্টটি কেবল শ্বেতস্থান সহ ফাঁকা রেখা বা লাইনগুলির সাথে মিলবে (সত্য প্রত্যাবর্তন) ।
getline(v:lnum + 1)পরের লাইন পায়
- আমরা এটির সাথে মেলে
\S, যা এই লাইনের যে কোনও জায়গায় কোনও অ-সাদা অংশের অক্ষরের সাথে মেলে ।
- যদি এই 2 শর্তগুলি সত্য হয় তবে আমরা
<1অন্যথায়, এর মূল্যায়ন করি 1। এই "তিন" সঙ্গে সম্পন্ন করা হয় ifC থেকে পরিচিত এবং কিছু অন্যান্য ভাষাসমূহ: condition ? return_if_true : return_if_false।
<1মানে একটি ভাঁজ এই লাইনে শেষ হয়, এবং এর 1অর্থ ভাঁজ এক।
সুতরাং, যদি আমরা একটি ভাঁজ শেষ করি যদি লাইনটি ফাঁকা হয় এবং পরবর্তী লাইনটি ফাঁকা না থাকে । অন্যথায়, আমরা ভাঁজটি 1 এ আছি বা :h foldexprএটি যেমন বলে:
এটি খালি রেখার দ্বারা পৃথক করে অনুচ্ছেদে একটি ভাঁজ তৈরি করবে
চতুর্থ
চতুর্থ তৃতীয়টির মতো একই আচরণ করে, তবে এটি কিছুটা ভিন্ন উপায়ে করে। প্রসারিত, এটি:
getline(v:lnum - 1) =~ '^\s*$' && getline(v:lnum) =~ '\S' ? '>1' : 1
যদি পূর্ববর্তী লাইন একটি ফাঁকা লাইন, এবং বর্তমান লাইন একটি অ-ফাঁকা লাইন, আমরা একটি এই লাইন (চালু ভাঁজ শুরু >1,) যদি না, আমরা 1 foldlevel সেটিং করছি।
উত্তরভাষ
সুতরাং 3 টি উদাহরণে যুক্তিটি সত্যই সহজ। বেশিরভাগ অসুবিধাটি জায়গাগুলির অভাবে এবং কিছু ব্যাকস্ল্যাশ ব্যবহারে আসে।
আমি সন্দেহ করি যে কোনও ফাংশন কল করার কিছুটা ওভারহেড থাকে এবং যেহেতু প্রতিটি লাইনটির জন্য এটি মূল্যায়ন করা হয় আপনি একটি সুন্দর পারফরম্যান্স পেতে চান। আমি জানি না যদিও আধুনিক মেশিনগুলির মধ্যে তফাতটি কতটা দুর্দান্ত এবং আপনি যদি কোনও কার্যকারিতা ব্যবহার না করেন তবে আপনি কোনও ফাংশন (২ য় উদাহরণ হিসাবে) ব্যবহার করার পরামর্শ দিবেন। নথকে মনে রাখবেন: "অকালীন অপটিমাইজেশন হ'ল সমস্ত মন্দের মূল" ।
এই প্রশ্নটি স্ট্যাকওভারফ্লোতেও রয়েছে , যার কিছুটা আলাদা উত্তর রয়েছে। তবে আমার অবশ্যই ভাল ;-)