রেজেক্স অনুসন্ধান প্যাটার্ন দ্বারা ভাঁজ করা


13

আমি মানের সাদা অংশে পৃথক কলাম সহ একটি সরল পাঠ্য ফাইল পেয়েছি। এটার মত:

AU 3030 .... ... ....  
AU 3031 .... ... ....  
AU 3032 .... ... .... 
AU 3033 .... ... .... 
IT 48100 ... .. .....
IT 40100 ... .. .....
IT 48123 ... .. .....
UK 3333 ... ... ..... 
UK 4444 ... ... .....
UK 5555 ... ... .....

আমি এই রেজেক্সটিও পেয়েছি যা প্রথম কলামে একই মানটির সাথে যে কোনও সংলগ্ন লাইনের সাথে মিলবে (ধরুন ফাইলটি প্রথম কলামে সাজানো আছে) শেষ ব্যতীত:

/^\(\([A-Z0-9]\+\)\s\+.*\n\)\(\2\)\@=

(বা এটিকে কম "লোমশ" করার জন্য):

/^\v([A-Z0-9]+)\s+.*\n(\1)@=

যে লাইনের সাথে মেলে না তার উপর লাইনগুলি ভাঁজ করা কি সম্ভব? এই ফলাফল হচ্ছে:

+-- 4 lines AU ....
+-- 3 lines IT ....
+-- 3 lines UK ....

উত্তর:


14

কি set foldmethod=exprএবং ব্যবহার 'foldexpr'একটি তেজ স্ক্রিপ্ট অভিব্যক্তি ভাঁজ শুরু পয়েন্ট নির্ধারণ নির্ধারিত হবে।

set foldmethod=expr
set foldexpr=get(split(getline(v:lnum-1)),0,'')!=get(split(getline(v:lnum)),0,'')?'>1':'='

এটি এর চেয়ে জটিল দেখায়, কারণ আমরা সহজেই স্পেস ব্যবহার করতে পারি না :set, তবে ফাঁকা স্থান এবং একটি নতুন লাইন বা 2 দিয়ে দেখে মনে হচ্ছে:

get(split(getline(v:lnum - 1)), 0, '') != get(split(getline(v:lnum)), 0, '')
    \ ? '>1'
    \ : '='

সংক্ষিপ্ত বিবরণ

মূলত এটি প্রতিটি লাইনের প্রথম শব্দটিকে আগের লাইনের সাথে তুলনা করে। যদি শব্দগুলি পৃথক হয় তবে লাইনটি ভাঁজটির শুরু >1। অন্যথায় এটি একই ভাঁজ স্তর রাখে =,।

বিশদ গৌরব

  • set foldmethod=expr ভাঁজগুলি নির্ধারণ করার জন্য ভিমকে একটি ভিম স্ক্রিপ্ট এক্সপ্রেশন ব্যবহার করতে বলুন
  • 'foldexpr' বিকল্পটি ভিম স্ক্রিপ্ট এক্সপ্রেশন ধারণ করে
  • >1যখন একটি ভাঁজ শুরু হবে এবং =কখন ভাঁজ স্তরটি চলতে হবে তখন ফেরত পাওয়া তিনটি দিয়ে শর্তটির মূল্যায়ন
  • v:lnum'foldexpr'ভাঁজগুলি আপডেট করার জন্য যে চলমান লাইনটি চলছে is
  • বর্তমান লাইন ( v:lnum) এবং পূর্ববর্তী লাইন ( v:lnum - 1) এর মাধ্যমে সামগ্রীগুলি পানgetline()
  • এর মাধ্যমে প্রতিটি লাইন শব্দের মধ্যে বিভক্ত করুন split()
  • get()সদ্য বিভক্ত শব্দের প্রথম সূচক পেতে ব্যবহার করুন
  • ''একটি ফাঁকা রেখার ক্ষেত্রে একটি ডিফল্ট মান ব্যবহার করুন । যেমনget(words, 0, '')
  • ত্রৈমাসিকের শর্ত অংশে পূর্ববর্তী লাইনের প্রথম শব্দের সাথে বর্তমান লাইনের প্রথম শব্দটির সাথে তুলনা করুন

দ্রষ্টব্য: এই পদ্ধতিতে খুব বড় নথি সহ কিছু কার্য সম্পাদনের সমস্যা থাকতে পারে

আরও সহায়তার জন্য দেখুন:

:h 'foldmethod'
:h 'foldexpr'
:h getline(
:h v:lnum
:h split(
:h get(
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.