ভিম ইতিমধ্যে একক লাইন হিসাবে ভাঁজগুলি প্রদর্শন করে। তবে, ভিমের ভাঁজগুলিতে indent
, একই ইনডেন্টযুক্ত সমস্ত লাইন একটি ভাঁজটিতে অন্তর্ভুক্ত করা হয়েছে। সুতরাং আপনার স্ক্রিনশট, লাইন আপনি "হেডার" (যেমন, একটি শুরু হিসাবে উল্লেখ করা হয় collection_base_url
) হয় না ভাঁজ মধ্যে।
আপনি ভিমের ব্যবহার করে এটমের ভাঁজের অনুরূপ কিছু অর্জন করতে পারেন foldexpr
foldmethod
:
" Finds the indent of a line. The indent of a blank line is the indent of the
" first non-blank line above it.
function! FindIndent(line_number, indent_width)
" Regular expression for a "blank" line
let regexp_blank = "^\s*$"
let non_blank_line = a:line_number
while non_blank_line > 0 && getline(non_blank_line) =~ regexp_blank
let non_blank_line = non_blank_line - 1
endwhile
return indent(non_blank_line) / a:indent_width
endfunction
" 'foldexpr' for Atom-style indent folding
function! AtomStyleFolding(line_number)
let indent_width = &shiftwidth
" Find current indent
let indent = FindIndent(a:line_number, indent_width)
" Now find the indent of the next line
let indent_below = FindIndent(a:line_number + 1, indent_width)
" Calculate indent level
if indent_below > indent
return indent_below
elseif indent_below < indent
return "<" . indent
else
return indent
endif
endfunction
set foldexpr=AtomStyleFolding(v:lnum)
set foldmethod=expr
এটি নীচের মত একটি ভাঁজ এক্সপ্রেশন (দেখুন :help fold-expr
) সংজ্ঞায়িত করে:
- তাত্ক্ষণিকভাবে ইন্ডেন্টড লাইনের আগের লাইনের জন্য, এটি নিম্নলিখিত ব্লকের ইন্ডেন্টেশনটি দেয়।
- ইন্ডেন্টেড লাইনের জন্য এটি ইনডেন্টেশনটি দেয়। (শিফট প্রস্থ দ্বারা বিভক্ত তাই প্রতিটি ইন্ডেন্টেশন স্তর স্তর দ্বারা 1 ফেরত মান বৃদ্ধি করে)
- ইনডেন্টেড লাইনের ব্লকের শেষে লাইনগুলির জন্য, এটি একটি স্ট্রিং প্রদান করে
"<N"
, যেখানে এন ইনডেন্টে সেট করা আছে। এটি ভিমকে বলে যে স্তর N এর একটি ভাঁজ সেই লাইনে শেষ হয়।
হালনাগাদ
@ অ্যালেক্সেন্ডার মন্তব্যগুলিতে জিজ্ঞাসা করেছেন যে রুবের আউটডেনটেডগুলি end
ভাঁজগুলির মধ্যে অন্তর্ভুক্ত করার জন্য এটি বাড়ানো সম্ভব কিনা কিনা । আপনি " Calculate indent level
নিম্নলিখিতটি দিয়ে বিভাগটি প্রতিস্থাপন করে শুরু করতে পারেন :
if indent_below > indent
return indent_below
elseif getline(a:line_number) =~ '^\s*end\s*$'
return "<" . (indent + 1)
else
return indent
endif
যেমনটি হয়, এটি সর্বাধিক শক্তিশালী সমাধান নয় (উদাঃ যদি end
বিবৃতি একই লাইনে থাকে তবে সেমি-কোলনের পরে ব্যর্থ হবে )। এটিকে সমাধান করার জন্য আপনি নিয়মিত-এক্সপ্রেশন এবং আশেপাশের কোডটি টুইঙ্ক করতে পারেন তবে আপনি এখন যেমন ফাইলের প্রকৃত বাক্য গঠনটি বিশ্লেষণের ক্ষেত্রের মধ্যে রয়েছেন, আমি সন্দেহ করি যে ভাল সমাধানের আগে জিনিসগুলি আরও অনেক জটিল হয়ে উঠতে পারে।