۱۳۸۷ دی ۳۰, دوشنبه

vimrc. من

تقریبا تمام مدتی که به صورت جدی برنامه‌نویسی کردم از Vim استفاده کردم، توی این مدت خیلی چیزا در مورد Vim یاد گرفتم، فهمیدم که بعضی از امکاناتش رو دوست دارم و میخوام نگه دارم، بعضی‌ها رو کلا نمی‌خوام و بعضی‌ها رو اگه یجور دیگه بودن دوست داشتم. تا حالا چندین بار دوستام ازم خواستن که فایل تنظیمات Vim خودم رو بهشون بدم، تصمیم گرفتم که یه پست در موردش بنویسم (همراه با کمی توضیح) که اگر vimrc. رو گم کردم، یه کپی اینجا داشته باشم (هرچند که این همش نیست، بعضی از تنظیماتی که استفاده می‌کنم خیلی احمقانه هستن و بعضی‌ها کاملا اختصاصی، مثل مسیر tag های یه پروژه)



۱. غیرفعال کردن سازگاری با vi (اگر می‌خواستم از vi استفاده کنم، که Vim رو اجرا نمی‌‌کردم ;)

نکته: ۴ (۲ تا ۵) نکته زیر کاملا به Coding Styles شما و پروژه‌ایی که در اون مشارکت می‌کنید وابسته هست، مثلا من ترجیح میدم که به‌جای Tab، از Space استفاده کنم، اینجوری کد من که مثلا برای طول هر خط ۷۸ کاراکتر نوشته شده، روی دستگاه من که هر Tab معادل ۴ تا Space هست همونجوری نشون داده میشه که روی یه Vim که هر Tab معادل ۸تا کاراکتر هست. اما بعضی از پروژه‌ها (مثل کرنل لینوکس) استفاده از Tab رو ترجیح میدن، پس قبل از فرستادن Patch به Upstream حتما Coding Styles اون پروژه رو مطالعه کنید.

۲. با استفاده از expandtab، هر Tab رو با استفاده از تعدادی Space جایگزین میکنید، مثلا با یکبار زدن Tab به جای اینکه یه tab در مد insert اضافه بشه، چندین Space اضافه میشه. (در حالت پیش‌فرض این خصوصیت غیرفعال هست، با توجه به نکته نوشته شده در بالا، انتخاب کنید که آیا این تنظیم را نیاز دارید یا نه)

۳. تعداد Space هایی که برای هر مرحله از indent استفاده میشه.

۴. تعداد Space هایی که در هنگامی که در مد insert قرار دارید، به ازای هربار فشردن Tab، یا Backspace اضافه یا کم میشه.

۵. هرچند Space یک Tab محسوب بشه.

۶. اینکه Backspace در مد insert چجوری کار کنه، حالتی که من استفاده میکنم کاملترین حالته، اینکه هم در انتها و ابتدای خط (eol و start) و هم در حالت indent کار میکنه.

۷. تعداد رنگهای مورد استفاده در Vim (کاملا بسته به نوع شبیه‌ساز ترمینال و colorscheme مورد استفاده است).

۸. نمایش شماره خطوط

۹. وضعیت indent خط فعلی به خط بعد نیز کپی می‌شود (یعنی خط بعد متاثر از وضعیت خط قبل از خود باشد)

۱۰. در هنگامی که به زبانهای برنامه‌نویسی شبه C کد می‌نویسید، به صورت هوشمندانه خطوط را مرتب می‌کند (مثلا یک مرحله indent بیشتر بعد از })

۱۱. همزمان با کامل شدن مورد جستجو، جستجو رو انجام میده، در حالت پیش‌فرض پس از کامل شدن متن مورد جستجو و وارد کردن آن موارد پیدا شده نمایشن داده می‌‌شوند.

۱۲. من دوست ندارم موارد پیدا شده بر اساس جستجوی انجام شده های‌لایت بشه (کاملا سلیقه‌ایی)

۱۳. نمایش سطر و ستون محل فعلی کرسر.

۱۴. پنهان کردن (نه کشتن!) Bufferایی که بسته میشه.

۱۵ و ۱۶. من نه دوست دارم در مواقع خطا صدای بوق بشنوم، نه اینکه صفحه نمایش flash کنه.

۱۷. نحوه folding، که من استفاده از markerهای خود Vim برای folding رو ترجیح میدم.

۱۸. وقتی که با Vim کار می‌کنید، خیلی از متون وارد register میشن، فایلهای مورد استفاده در bufferها لیست میشن، یه‌سری خطوط مارک میشن و ... که همگی مفیدن، اما متاسفانه همه این موارد پس از بسته شدن Vim از دست میرن، اگر که دوست دارید این موارد هنگامی که مجددا Vim رو باز می‌کنید همچنان در دسترس باشند، باید از امکانات viminfo. استفاده کنید. این خط به vim میگه که ۱۰ فایل ویرایش شده آخر را به همراه مارکهای آنها نگه دارد، ۱۰۰خط آخر را در register نگه دارد، ۲۰ دستور آخر را که در مد دستور وارد شده‌اند حفظ کند، اگر که در هنگام فراخوانی Vim فایل خاصی مشخص نشده باشد، کل بافر قبلی را بارگذاری کند و در نهایت نام فایلی که تمامی این اطلاعات باید در آن ذخیره شوند و در هنگام فراخوانی مجدد Vim اطلاعات این فایل بازیابی شوند.

۱۹ و ۲۰. تکمیل فرامین در مد فرمان (با استفاده از Tab) و درصورتی که چندین مورد یافت شد، همگی نمایش داده شوند و تا هنگام تکمیل طولانی‌ترین گزینه فعال باشد.

۲۱ و ۲۲. کوچک یا بزرگ بودن حروف در هنگام جستجو نادیده گرفته می‌شوند مگر اینکه عبارت جستجو حاوی یک کاراکتر با حروف بزرگ باشد.

۲۳. Vim میتونه عنوان پنجره terminal باز شده رو بازنویسی کنه.

۲۴. غیرفعال کردن خیلی از promptهایی که شما مجبورید برای رهایی از دستشون Enter رو فشار بدید، مثلا پیغامی که در هربار اجرای Vim نمایش داده میشه (توجه: اون a خیلی چیزا رو غیرفعال می‌کنه!).

۲۶ تا ۲۹. استفاده از امکانات بسیار مفید Vim در هنگام ویرایش فایلهایی که افزونه‌های مرتبط به آنها نصب شده باشد، مثلا رنگ کردن کد، auto-completion و ....

۱۳۸۷ دی ۱۲, پنجشنبه

مهاجرت به Ext4

همونطور که احتمالا میدونید لینوس به عنوان هدیه کریسمس، کرنل ۲.۶.۲۸ رو منتشر کرد. در بین امکانات جدید اضافه شده، پایدار شدن فایل سیستم سازگار با قبل و جانشین Ext3، یعنی Ext4 برای ما کاربران معمولی شاید مهمترین اتفاق باشه.

از مهمترین خصوصیات Ext4 میشه به فایل‌سیستم/فایلهای بزرگتر، تخصیص متاخر (delayed allocation)، تطبیق سریعتر فایل‌سیستم (faster fsck)، قابلیت تخصیص چند بلوکی (multiblock allocation) و ... اشاره کرد.

روزی (در واقع شبی) که من لپ‌تاپم رو خریدم و اومدم خونه که جنتو روش نصب کنم، دو تا اشتباه بزرگ (باور کنید به‌خاطر خواب‌آلودگی بود!) کردم:
  • home رو جدا نکردم
  • درایوها رو Ext3 فرمت کردم (XFS رو ترجیح میدادم)
بعد از انتشار کرنل جدید، تصمیم گرفتم که هر دوی این اشتباهات رو جبران کنم (fsck های طولانی روی لپ‌تاپ واقعا اعصاب خورد کنه)، اگر که شما هم این اشتباهات رو انجام دادید و می‌خواهید که جبران کنید، شاید بد نباشه که بدونید من چجوری این کار رو انجام دادم:
اول از همه شما مطمئنا باید کرنل خودتون رو به ۲.۶.۲۸ ارتقا بدید (هر چند که پشتیبانی از Ext4 در کرنل‌های قدیمی‌تر هم وجود دارد، اما Ext4 در ۲.۶.۲۸ پایدار شد).

علاوه بر اینکه باید Ext4 رو در کرنل جدید فعال کنید، باید CONFIG_LSF رو هم فعال کنید، هر چند که در حالت عادی روی هارددرایو یک لپ‌‌تاپ به چنین چیزی احتیاج ندارید، اما چون پشتیبانی از فایلهای بزرگ یک خصیصه مهم در Ext4 هست، فعال نبودنش باعث میشه که نتونید درایو رو mount کنید.

بعد من با استفاده از یک LiveCD، صد گیگابایت از هارد رو آزاد کردم و یک درایو جدید فرمت نشده به‌جاش ساختم.
حالا به کرنل جدید بوت کنید و درایو جدید ساخته شده رو فرمت کنید.

شما به یک نسخه جدید (مثلا ۱.۴۱.۳) از e2fsprogs برای فرمت کردن به Ext4 احتیاج دارید.

mkfs.ext4 /dev/XXX

(XXX رو با اسم درایو جدیدی که ساختید عوض کنید)

یک شاخه جدید بسازید و درایو جدید رو اونجا mount کنید:

mkdir /mnt/new-home
mount -t ext4 /dev/XXX /mnt/new-home

حالا وقتشه که بریم در حالت تک‌کاربر و محتویات home قبلی رو منتقل کنیم به درایو جدید:

init 1
cd /home
cp -ax * /mnt/new-home
cd /
mv /home /home.old
mount /dev/XXX /home

حالا با زدن Ctrl-D از حالت تک‌کاربر خارج بشید و ... تموم شد!

برای اینکه بعد از هر ریبوت مجبور نباشید home رو mount کنید، این خط رو به فایل fstab اضافه کنید:

/dev/XXX /home ext4 defaults 0 2

اگر همه چیز مرتب بود، می‌تونید با خیال راحت home.old/ رو پاک کنید.

اگر از نتیجه راضی هستید، میتونید / رو هم به Ext4 تبدیل کنید، اما یادتون نره که چنین کاری رو با boot/ نکنید، چون هیچ نسخه منتشرشده‌ایی از GRUB وجود نداره که از Ext4 پشتیبانی کنه‌ (هرچند که اگر هم که وجود داشت، دلیلی برای اینکار وجود نداره، چون هیچ چیز عایدتون نخواهد شد!)