# فيم (محرر نصوص)

فيم (بالإنجليزية: Vim)‏ هو محرر نصوص طُور وأطلق من قبل برام مولينار عام 1991 لأجهزة حواسيب أميجا. تم إنشاء فيم كنسخة ممتدة للمحرر في آي Vi مع وجود العديد من الخصائص الإضافية المصممة لتكون مفيدة في تحرير الشيفرة المصدرية للبرامج. الاسم الكامل لفيم هو في آي المحسن Vi IMproved، وبسبب كونه متعدد المنصات فهو منتشر الاستعمال على أنظمة التشغيل الشبيهة بيونكس. وينضم فيم إلى عائلة البرمجيات الحرة والبرمجيات المفتوحة المصدر وتندرج بعض بنود رخصة استخدامه تحت مظلة العمل الخيري لتشجيع المستخدمين على التبرع لأطفال أوغندا وتعتبر هذه الرخصة متوافقة مع رخصة جنو العمومية، وعلى الرغم من تخصيصه لأنظمة أميجا في بدايته إلا انه تم تطويره للعمل على معظم منصات أنظمة التشغيل وفي عام 2006 تم انتقائه كأشهر محرر نصوص من قبل قراء مجلة لينكس جورنال.

## نظرة تاريخية

بدأ برام مولينار العمل على تطوير فيم لأجهزة أميجا في عام 1988 وفي عام 1991 قام بإطلاق النسخة الأولى من فيم وهي النسخة 1.14، وقام برام مولينار بتطوير فيم على المحرر «ستيفي» الذي قام بتطويره كل من تيم ثومبسون وتوني أندروس وجي أر (فرِد) وكان مخصصا لأنظمة «أتاري أس تي».

## واجهة المحرر

مثل في آي، لا تقتصر واجه فيم على القوائم والأيقونات وانما تمتد إلى أوامر تحريرية على واجهة المستخدم النصية، كما ويوجد أيضا لفيم واجهة رسومية تسمى «جي فيم» حيث تم إضافة قوائم وأدوات إلى الأوامر المشهورة في الواجهة الرسومية المبنية على واجهة سطر الأوامر الأصلية، وبالطبع هذا لا يعني ان واجهة سطر الأوامر تفتقد إلى ما يوجد في الواجهة الرسومية بل على العكس من ذلك حيث يعتبر اسخدام واجهة سطر الأوامر فعالا أكثر من أي أنماط أخرى للتحرير.
يحوي فيم على مقالة بسيطة تقود المستخدمين الجدد إلى طريقهم في عملية تحرير النصوص وتعليمهم أنماط الاستخدام وكيفية تنفيذ الأوامر ويمكن قراءة هذه المقالة بتنفيذ الأمر «فيم»، هذا بالإضافة إلى وجود دليل الاستخدام "Vim Users Manual" الذي يحوي كل شيء يحتاجه المستخدم لتحرير النصوص على فيم، ويمكن قراءة دليل الاستخدام من نفس محرر النصوص أو من الويب. كما ويحوي فيم أدوات للمساعدة ويمكن استعمالها بتنفيذ الأمر «الأمر help:» وهذه الأدوات تساعد المستخدمين على تصفح الأوامر والإضافات.

## التخصيص

تعد عملية التخصيص في فيم من أهم نقاط القوة في هذا المحرر الفعال حيث يمكن السيطرة على الواجهة الرئيسية للمحرر بالتحكم بعدد كبير من خيارات التخصيص المتواجدة بهدف جعل المحرر بيئة مريحة لكل مستخدم حسب احتياجاته، وكجزء من عملية التخصيص يمكن لكل مستخدم أن يقوم بتعيين مفاتيح التحكم في لوحة المفاتيح التي يرغب بها لتنفيذ أمر معين فعلى سبيل المثال يمكن للمستخدم أن يقوم بتعيين المفاتيح (ALT + F5) لتنفيذ أمر حفظ الملف بينما قد يكون ذلك غير مريح لمستخدم اَخر فيقوم بتعيين المفاتيح (CTRL + S) لحفظ تعديلات الملف. هناك عدد هائل من الإضافات (Plugins) الموجودة للمحرر فيم والتي تقوم بإضافة وظائف جديدة للمحرر أو توسيع نطاق وظائف موجودة في الأصل ويتم كتابة هذه الإضافات باستخدام لغة برمجة نصية مخصصة لأغراض التطوير على منصة المحرر وتسمى فيم سكريبت "(vimscript)" ويمكن أيضا تطوير الإضافات باستخدام لغات برمجة أخرى مثل لوا (Lua) «تم دعم هذه اللغة في الإصدارة رقم 7.3 من فيم» وبيرل (Perl) وبايثون (Python) وروبي (Ruby) وتكل (Tcl) «أو تي سي أل» وراكيت (Racket) «المعروفة رسميا باسم PLT Scheme». و نظراً لهذه المرونة التي يقدمها فيم فقد ظهرت الكثير من المشاريع التي تقوم بتجميع النصوص البرمجية المعقدة ووضعها بين أيدي المستخدمين لتحويل فيم إلى أداة لتنفيذ مهام معقدة ومحددة وأيضا لتطوير الإضافات وإضافة نكهات مختلفة لتصرفات ووظائف المحرر، وكمثال لذلك هناك المشروع «فيم أوت لاينر» (VimOutliner) الذي يسمح لمستخدمي الأنظمة الشبيهة بيونكس القيام بتنظيم النصوص في المقاطع المختلفة على شكل هيكلية شجرية (Tree Structure)، وهناك أيضاً المشروع كريم الذي يهدف إلى جعل فيم بيئة تحرير نصية أشبه ببيئة (النقر والكتابة).

## الإضافات والتحسينات على المحرر في آي

من البديهي أن يكون فيم متوافقا مع في آي نظراً لبناء فيم منذ البداية على أساس المحرر في آي من ناحية الوظائف والتصرفات ولكن ذلك يكون مرئياً في حالة تفعيل نمط محاكاة في آي، أما عند عند تثبيط نمط المحاكاة فإن فيم يحوي الكثير من التحسينات التي تجعله يتفوق على في آي وتجدر الإشارة هنا إلى أن فيم لن يكون متوافقاً بنسبة 100% مع في آي حتى في حالة تفعيل نمط المحاكاة نظراً لمواصفات يونكس المنفردة (Single Unix Specification) بالإضافة لمواصفات ومعايير بوسيكس (POSIX) ومن الأمثلة على عدم توافق فيم مع في آي هو أن فيم لا يدعم نمط في آي المفتوح (vi's open mode) انما يدعم النمط المرئي (visual mode).
و من الأمثلة على التحسينات التي أضافها فيم فوق في آي:
* الإكمال التلقائي للكلمات والجمل ومقارنة النصوص ودمج الملفات «و هو ما يعرف أيضاً ب فيم ديف (vimdiff)».
* نظام شامل ومتكامل للمساعدة.
* تعبير نمطي موسع (regular expressions).
* تطوير المحرر باستخدام لغات البرمجة النصية سواء أكانت اللغة النصية الخاصة أو لغات نصية أخرى مثل بيرل (Perl) وبايثون (Python) وروبي (Ruby) وتكل (Tcl) وغيرها.
* واجهة رسومية لمنصة المحرر والمعروفة ب «جي فيم» (gvim).
* إضافات محدودة شبيهة ببيئة التطوير المتكاملة.
* تحكم بفأرة الحاسوب في الواجهة الرسومية وواجهة سطر الأوامر.
* طي الجمل (كما هو الحال في محررات النصوص عند النقر على إشارة + لإظهار الجمل وإشارة - لطيها).
* تحرير الملفات المضغوطة وملفات الأرشيف مثل ملفات جي زيب (gzip)، بي زيب 2 (bzip2)، زيب (zip)، وتار (tar).
* تحرير الملفات عبر بروتوكولات الملفات والاتصال مثل أس أس أتش (SSH)، بروتوكول نقل الملفات المسمى أف تي بي (FTP)، وبروتوكول نقل النص الفائق أتش تي تي بي (HTTP).
* الحفاظ على حالة التحرير (session state preservation).
* مدقق أخطاء لغوي.
* تقسيم شاشة التحرير بشكل أفقي وعامودي مما يتيح للمستخدم القدرة على تحرير أكثر من ملف في نفس الوقت وعلى نفس نافذة التحرير.
* دعم علامات التبويب حيث يمكن للمستخدم فتح أي عدد من علامات التبويب لتحرير الملفات.
* دعم معايير اليونيكود بالإضافة لدعم لغات بشرية عديدة.
* دعم تعليم الصيغة (syntax highlighting).
* دعم عملية البحث بطرق عديدة.
* دعم تأريخ مكان المؤشر (cursor position histories).
* دعم إرجاع الحالة وتكرير الحالة (undo/redo).
و الكثير الكثير من الميزات الأخرى سواء أكانت جزء من المحرر نفسه أو على شكل إضافة.

## الأنظمة المدعومة

بينما كان في آي مخصصاً للعمل على بيئات يونكس فإن فيم تم دعمه على عدد كبير من المنصات والأنظمة منها:
* أميغا أو أس (AmigaOS) «المنصة الابتدائية»
* أتاري (Atari)
* لينكس مينت (MINT)
* بي أو أس (BeOS)
* دوس (DOS)
* ميكروسوفت ويندوز 95/98/مي/أن تي/2000/أكس بي/سيرفر 2003/فيستا/سيرفر 2008/7
* أي بي أم أو أس 2 وأو أس 390 (IBM OS/2 and OS/390)
* مورف أو أس (MorphOS)
* أوبن في أم أس (OpenVMS)
* كيو أن أكس (QNX)
* ريسك أو أس (RISC OS)
* يونكس (Unix)
* جنو/لينكس (GNU/Linux)
* بي أس دي (BSD)
* ماك أو أس (Mac OS) حيث تقوم شركة أبل الأمريكية بتنصيب فيم في كل نسخ نظامها ماك أو أس أكس
* أندرويد (Android)
* أي أو أس(iOS)

## تواريخ الإصدارات

| التاريخ | الإصدارة | التعديلات والإضافات |
| يونيو، 1987 | غير متوفر | قام تيم ثومبسون بإطلاق الإصدارة "ستيفي" لمستخدمي المحرر في آي وهي استنساخ ل في آي على منصة أتاري أس تي وقام تيم أيضا بوضع الشيفرة المصدرية على يوزنت |
| يونيو، 1988 | غير متوفر | قام توني أندروس بتطوير ستيفي ونقله إلى يونكس وأو أس 2 وقام أيضاً بإطلاق الإصدارة 3.10 ووضع الشيفرة المصدرية على يوزنت |
| 1988 | 1.0 | قام برام مولينار بتطوير [[في آي إيميتيشن]] (Vi IMitation) لنظام أميغا بالاعتماد على الإصدارة ستيفي ولم يتم نشر هذه النسخة |
| نوفمبر 2, 1991 | 1.14 | الإصدارة الأولى لأميغا على جهاز فرد فيش |
| 1992 | 1.22 | تم نقل فيم لأنظمة يونكس وأصبح فيم الاًن ينافس في آي. |
| ديسمبر 14, 1993 | 2.0 | النسخة الأولى ل فيم تحت الاسم الجديد (Vi IMproved) |
| أغسطس 12, 1994 | 3.0 | أضافة الدعم لأكثر من نافذة |
| مايو 29, 1996 | 4.0 | إضافة واجهة المستخدم الرسومية |
| فبراير 19, 1998 | 5.0 | إضافة دعم تعليم الصيغة (syntax highlighting) وبداية الدعم للبرمجة النصية |
| أبريل 6, 1998 | 5.1 | تصليح الكثير من الأخطاء البرمجية وإضافة الكثير من التحسينات |
| أبريل 27, 1998 | 5.2 | دعم السطور الطويلة وايجاد متصفح الملفات وغير ذلك من الإضافات والتحسينات. |
| أغسطس 31, 1998 | 5.3 | تصحيح أخطاء برمجية وإضافة تحسينات. |
| يوليو 25, 1999 | 5.4 | بدء دعم تشفير الملفات وإضافة تحسينات |
| سبتمبر 19, 1999 | 5.5 | تصحيح أخطاء برمجية وإضافة تحسينات. |
| يناير 16, 2000 | 5.6 | تصحيح أخطاء برمجية وإضافة تحسينات. |
| يونيو 24, 2000 | 5.7 | تصحيح أخطاء برمجية وإضافة تحسينات. |
| مايو 31, 2001 | 5.8 | تصحيح أخطاء برمجية وإضافة تحسينات. |
| سبتمبر 26, 2001 | 6.0 | طي الملفات وتفعيل نظام الإضافات ودعم عدة لغات بشرية. |
| مارس 24, 2002 | 6.1 | تصحيح أخطاء برمجية وإضافة تحسينات. |
| يونيو 1, 2003 | 6.2 | دعم جي تي كاي 2 (GTK2)، وإضافة الدعم للغة العربية، وإضافة الأمر (أمر try:)، بالإضافة لتعديلات بسيطة وتصحيح أخطاء برمجية. |
| يونيو 7, 2004 | 6.3 | تصحيح أخطاء برمجية وإضافة تحسينات وتحديثات في الترجمات |
| أكتوبر 15, 2005 | 6.4 | تصحيح أخطاء برمجية وتحديثات على لغات بيرل وبيثون وروبي. |
| مايو 7, 2006 | 7.0 | إضافة المدقق اللغوي والمكمل اللغوي للكلمات، إضافة صفحات العلامات التبويبية، إبراز وتمييز السطر والعامود اللحظيين وغيرها الكثير من الإضافات. |
| مايو 12, 2007 | 7.1 | تصحيح أخطاء برمجية |
| أغسطس 9, 2008 | 7.2 | إضافة الدعم للفاصلة العائمة واعادة كتابة شاشة الرسم الرمزي بالإضافة إلى تصليح أخطاء برمجية وإضافة ملفات تعليم الصيغة للغات جديدة |
| أغسطس 15, 2010 | 7.3 | إضافة الدعم للغة لوا (Lua) بالإضافة إلى بيثون 3 (Python3) وتشفير "(Blowfish (cipher" وأخيرا إضافة وظائف التكرار والاعادة المستمرة. |

## قائمة بأشهر أوامر فيم

نسرد تالياً قائمة بأهم أوامر التحرير النصية الخاصة ب فيم:

### العمل مع الملفات

| الأمر | التوصيف |
| :e مسار الملف | فتح الملف المراد تحريره وفي حالة عدم وجوده سيتم إنشاء ملف جديد بالاسم المشار اليه في مسار الملف |
| :w مسار الملف | حفظ الملف وفي حالة عدم وجوده سيتم إنشاء ملف جديد بالاسم المشار اليه في مسار الملف |
| :q | الخروج من محرر النصوص |
| :q! | الخروج من محرر النصوص مع التأكيد على عدم حفظ التعديلات |
| :wq | حفظ الملف والخروج من محرر النصوص |
| :x | ان قام المستخدم بالتغيير فسيقوم فيم بحفظ التغيرات والخروج من بيئة المحرر وان لم يقم المستخدم بالتغيير فسيتم الخروج فقط من دون الحفظ |

### التحرك في الملف

| الأمر | التوصيف |
| j | تحريك المؤشر إلى الأعلى لمسافة سطر واحد لكل حركة |
| k | تحريك المؤشر إلى الأسفل لمسافة سطر واحد لكل حركة |
| l | تحريك المؤشر إلى اليمين لمسافة حرف واحد لكل حركة |
| h | تحريك المؤشر إلى اليسار لمسافة حرف واحد لكل حركة |
| e | تحريك المؤشر إلى نهاية الكلمة |
| E | تحريك المؤشر إلى نهاية أول فراغ بعد الكلمة |
| b | تحريك المؤشر إلى بداية الكلمة |
| B | تحريك المؤشر إلى بداية أول فراغ بعد الكلمة |
| 0 | تحريك المؤشر إلى بداية السطر |
| ^ | تحريك المؤشر إلى بداية أول كلمة غير فراغية في السطر |
| $ | تحريك المؤشر إلى نهاية السطر |
| H | تحريك المؤشر إلى أول سطر على شاشة العرض |
| M | تحريك المؤشر إلى سطر الذي يمثل نصف شاشة العرض |
| L | تحريك المؤشر إلى اَخر سطر على شاشة العرض |
| :n | تحريك المؤشر إلى السطر رقم n |

### إدراج النصوص والكتابة

| الأمر | التوصيف |
| i | ادخال الكلمة فبل المؤشر |
| I | إدخال الكلمات إلى أول السطر الحالي |
| a | إلصاق بعد المؤشر |
| A | إلصاق أسفل السطر الحالي |
| o | فتح سطر جديد تحت السطر الحالي |
| O | فتح سطر جديد فوق السطر الحالي |
| C | تبقى الجملة على ما هي عليه ويتم تغيير كل السطر ابتدائا من الكلمة التي استدعي فيها هذا الأمر |
| ESC | الخروج من نمط التعديل. |

### حذف النصوص

| الأمر | التوصيف |
| x | حذف الحرف الكامن فوق المؤشر |
| X | حذف الحرف الكامن قبل الحرف الذي يقع فوق المؤشر |
| dd | حذف السطر الذي يقع عليه المؤشر |
| :d | حذف السطر الذي يقع عليه المؤشر |

### استخدام النمط المرئي (visual mode)

| الأمر | التوصيف |
| v | البدء بتعليم أو انتقاء الحروف، بإمكانك استخدام الحروف المذكورة سالفاً للتحرك في الاتجاهات (j, k, l, h) |
| V | البدء بتعليم أو انتقاء السطور |
| ESC | الخروج من النمط المرئي |

### تحرير النصوص

| الأمر | التوصيف |
| ~ | تغيير حالة الحرف من حرف كبير إلى حرف صغير، على سبيل المثال تغيير الحرف (A) إلى الحرف (a) ويمكن تنفيذ ذلك في نمط سطر الأوامر والنمط المرئي |
| > (V) | إزاحة لليمين لتطبيق المسافة البادئة |
| <(V) | إزاحة لليسار لتطبيق المسافة البادئة |
| c (V) | تغيير النص المعلم |
| y (V) | نسخ النص المعلم |
| d (V) | حذف النص المعلم |
| yy أو:y أو Y | نسخ السطر الواقع عليه المؤشر |
| dd أو:d | حذف السطر الواقع عليه المؤشر |
| p | لصق النص المنسوخ أو المحذوف (عملية الحذف في فيم هي عبارة عن عملية قص أو قلع وليست حذف بالمعنى التام وبالتالي النص المحذوف يمكن إلصاقه) |
| P | لصق الحروف قبل المؤشر وفي حالة نسخ السطور يتم اللصق في السطر الذي يسبق السطر الذي يحوي المؤشر |

### الإعادة والتكرار (السابقة واللاحقة)

| الأمر | التوصيف |
| u | إعادة حالة التحرير إلى الحركة السابقة وتتم إعادة الحركات حركة واحدة لكل كبسة على الحرف u |
| U | إعادة حالة التحرير إلى الحالة التي كان عليها السطر قبل بدء التعديل عليه |
| CTRL + r | إعادة حالة التحرير إلى الحركة اللاحقة وتتم إعادة الحركات حركة واحدة لكل مرة يتم فيها تنفيذ CTRL + r |

### البحث في النصوص

| الأمر | التوصيف |
| /{الكلمة أو الجملة أو النمط} | بتنفيذ هذا الأمر يمكنك البحث عن كلمة محددة أو جملة أو حتى ايجاد الكلمات أو النصوص التي تتبع نمط معين وذلك باستخدان التعبير النمطي |
| nvis | في حالة وجود أكثر من نتيجة لعملية البحث فباستخدام هذا الأمر تستطيع الوصول إلى نتيجة البحث اللاحقة |
| N | في حالة وجود أكثر من نتيجة لعملية البحث فباستخدام هذا الأمر تستطيع الوصول إلى نتيجة البحث السابقة |