چالش ذهنی برای جایگزینی یک متن با استفاده از Vim

Image: http://amzn.to/2umsBaY طرح مسالهبرای انجام کاری نیاز داشتم، که قسمتی از متن که به حالت CamelCase بود را به حالت snake_case تبدیل کنم. مانند متن شکل زیرمتن اولیهو می‌خواستم نتیجه‌ی کارم به صورت شکل زیر بشه.متن نهائیتعداد تغییرات به نسبت زیاد بود و عملا به صورت دستی انجام دادنش هم زمان‌بر بود و هم احتمالش زیاد بود که اشتباه کنم.راستش بهینه بودن کار چندان برام اهمیتی نداشت. فقط می‌خواستم کارم انجام بشه و مطلبی یاد بگیرم که در آینده باز بتونم از دانشش استفاده کنم.ویرایشگر متنی که استفاده می‌کنم ابزار Vim است.روش‌هایی ابتدائی این بود که از ابزارهای خارج از ویرایشگر (مثل sed, python و golang) استفاده کنم. این راهی بود که چندین بار قبل‌ترها استفاده کرده بودم اما مزه‌ی ماندن در محیط ویرایشگر برام بیشتر بود و اینکه اگر یاد بگیرم که چطور این کار رو انجام بدهم، تا هم به کیفیت کارم کمک کنه و هم اینکه کارم رو خیلی سریع‌تر انجام بده.خیلی روش‌های مختلفی رو تست کردم، اینجا تنها روشی که بهش رسیدم رو می‌نویسم.گام اول پیدا کردن CamelCase هانیاز دارم که کلمه‌ای مانند FilesAppended رو به کلمه‌ی مثل files_appended تبدیل کنم. پس اول این رشته‌ها رو پیدا می‌کنم. از Regular Expression برای پیدا کردن رشته‌ها استفاده کردم.طبق شکل اول بدست آوردن متن چندان سخت نیست.کافیه تمام رشته‌هایی که با jmx شروع می‌شن و تا " می‌رسن رو بندازم دور، بعد تمام رشته‌هایی که به [ ختم می‌شوند رو نگه داریم، که می‌شه عبارت زیر. برای تستش می‌تونید به این صفحه مراجعه کنید.jmx.+",(.+)\]گام دوم تبدیل CamelCase به snake_caseمرحله دوم این است که متنی که پیدا می‌شه رو با متن دلخواهمون جایگزین کنیم. با کمی سرچ تو اینترنت، دنبال اسکریپتی گشتم که CamelCase رو به snake_case تبدیل کند، که به اسکریپت زیر رسیدم و من هم این اسکریپت رو توی یک فایل دخیره (camel_to_snake.sh) کردم که بتونم صداش بزنم (احتیاط کنید تو دریای تفسیر کردن خط زیر غرق نشید، من خودم هم زیاد ازش سر در نیاوردم، البته نیازی هم نداشتم. همین که کارم رو انجام داد برام کافی بود).متن کد تبدیل CamelCase به snake_caseنتیجه اجرا یک چیزی شبیه به این می‌شه (همون چیزی که می‌خواستم)نتیجه‌ی اجرا برنامه بر روی متن نمونهگام آخر: اعمال تغییراتدر محیط Vim با زدن کلید Colon (:) ‌یک خط فرمان، مثل زیر در Vim باز می‌شه که از طریقش می‌شه یک متن رو با متن دیگه جایگزین کرد. مثلا در اینجا وقتی بخواهیم Hadoop رو با HBase جایگزین کنم کافیه متن زیر رو تایپ کنم و صفحه مثل شکل بعدش نمایش داده می‌شه:%s/Hadoop/Hbase/gcجایگزین کردن یک متن با متن دیگر در Vimبرگردیم به مسئله خودم. اما اگر بخواهیم به جای اینکه با یک متن جایگزین باشه اول یک دستوری روی متن اول اجرا کنه و خروجی دستور جایگزین بشه، کافیه بعد از / دومی به صورت زیر بنویسیم. مثلا در مثال زیر تمام کلمات Hadoop با خروجی دستور date جایگزین می‌شوند.:%s/Hadoop/\=system("date")/gcالان تقریبا به انتهای کار رسیدیم و مجروح آماده است. کافیه که اسکریپتی که پیدا کردیم روی کل متن صدا بزنیم. به صورت زیر اجرا می‌کنیم.نوشتن دستور برای جایگزین کردن متندستور بالا از دو قسمت تشکیل شده یک قسمت همون الگوییه که دنبالش بودیم. قسمت دوم هم دستوریه که روی متن‌های پیدا شده صدا زده می‌شه (و یک ستاره * کنار خروجی دستور هم قرار می‌ده).که بعد از enter زدن اولین خط رو به صورت زیر تغییر می‌ده و بقیه رو هم به همین شکل یا زدن کلید a اعمال می‌کنیم.جایگزین کردن متن با خروجی دستوردر این مرحله دو تا دستور به استفاده کردم. یکی system و دیگری submatch است. دستور system یک دستور سیستمی رو اجرا می‌کنه. دستور submatch هم گروهی که match شده رو بر می‌گردونه. که عدد داخلش 1 یعنی گروه اول و عدد 0 به معنی تمام متنیه که پیدا شده.جمع‌بندیدر این مطلب، با استفاده از امکانات یک ویرایشگر، جایگزینی یک متن با یک متن رو به صورت تقریبا خودکار انجام دادم. این کار شاید دستی بودنش یک خرده بیشتر زمان می‌برد اما چیزی که مهمه اینه که عادت بهبود مستمر رو در خودمون زنده نگه داریم و نکته‌ی دیگه اینکه یاد بگیریم که به صورت مستمر یاد بگیریم. در کارهای ساده هم می‌توان خلاقیت زد و به صورت مستمر ذهن رو به چالش کشید.راستش، من فکر نمی‌کنم هدف اصلی ما در زندگی یادگیری باشه، هدف رساندن ارزش به کسانی است که با ما در ارتباط هستند (از جمله خودمون)، یادگیری و رشد مداوم تنها ابزاری هستند که به ما کمک می‌کنند ارزش بیشتری به اطرافیانمون برسانیم.تا یادم نرفته بگم که کدها رو می‌تونید از این gist بردارید و در این صفحه می‌تونید متن Regular expression رو تست کنید.خوشحال می‌شم که در کامنت بهمون بگید که شما این مساله رو چطور حل می‌کنید و راه‌حل پیشنهادی شما چیست.