۱۲ – مقدمه‌ای ملایم بر ویرایشگر vi

می‌گویند روزی یک مسافر در نیویورک از رهگذری پرسید چطور می‌تواند به سالن معروف موسیقی کلاسیک شهر، یعنی Carnegie Hall برسد.
رهگذر پاسخ داد:
«تمرین، تمرین، تمرین!»

یادگیری خط فرمان لینوکس هم مثل پیانیست شدن نیست که در یک بعدازظهر تمام شود؛ سال‌ها تمرین می‌خواهد. در این فصل، با ویرایشگر متنی vi (تلفظ: "وی آی") آشنا می‌شویم؛ یکی از برنامه‌های بنیادین در سنت یونیکس.
ویرایشگر vi به خاطر رابط کاربری دشوارش کمی بدنام است، اما وقتی ببینید یک کاربر حرفه‌ای پشت صفحه‌کلید نشسته و شروع به کار می‌کند، در واقع شاهد نوعی هنر خواهید بود. در این فصل استاد نمی‌شویم، اما یاد می‌گیریم چطور در vi «آهنگ کلیدهای ساده» را بنوازیم.


چرا باید vi را یاد بگیریم؟

در دوران ویرایشگرهای گرافیکی و ابزارهای ساده‌ای مثل nano، چرا باید سراغ vi برویم؟ سه دلیل خوب وجود دارد:

  1. همیشه در دسترس است.
    وقتی سیستم رابط گرافیکی ندارد (مثلاً یک سرور راه‌دور یا سیستمی با تنظیمات خراب X)، vi نجات‌دهنده است. nano با وجود محبوبیت روزافزونش هنوز همه‌جا نصب نیست.
    طبق استاندارد POSIX، هر سیستم یونیکسی باید vi داشته باشد.

  2. سبک و سریع است.
    برای خیلی از کارها، باز کردن vi از جست‌وجوی ویرایشگر گرافیکی در منوها و صبر کردن برای بارگذاری چند مگابایت فایل راحت‌تر است.
    علاوه بر این، vi برای سرعت تایپ طراحی شده؛ کاربران حرفه‌ای vi بدون برداشتن دست از صفحه‌کلید می‌توانند همه‌چیز را ویرایش کنند.

  3. نمی‌خواهیم کاربران دیگر لینوکس و یونیکس فکر کنند ترسو هستیم!
    خب، شاید فقط دو دلیل خوب وجود داشت.


کمی پیش‌زمینه تاریخی

اولین نسخه‌ی vi در سال ۱۹۷۶ توسط بیل جوی (Bill Joy)، دانشجوی دانشگاه برکلی کالیفرنیا نوشته شد؛ کسی که بعدها یکی از بنیان‌گذاران شرکت Sun Microsystems شد.
نام vi از واژه‌ی visual گرفته شده، چون برای ویرایش روی ترمینال‌های تصویری با مکان‌نما طراحی شده بود.
قبل از ظهور این ویرایشگرهای تصویری، ویرایشگرهای خطی وجود داشتند که فقط روی یک خط متن در هر لحظه کار می‌کردند. برای اعمال تغییر، باید به خط خاصی می‌رفتید و دستور حذف یا افزودن متن می‌دادید.
با آمدن ترمینال‌های تصویری (به‌جای ترمینال‌های چاپی مثل تل‌تایپ‌ها)، امکان ویرایش دیداری فراهم شد.

vi در واقع یک ویرایشگر خطی قدرتمند به نام ex را درون خود دارد، و می‌توانیم هنگام استفاده از vi از دستورات ex هم بهره ببریم.

امروزه بیشتر توزیع‌های لینوکس نسخه‌ی اصلی vi را شامل نمی‌شوند، بلکه نسخه‌ی پیشرفته‌تری به نام vim (مخفف vi improved) را دارند که توسط Bram Moolenaar نوشته شده است.
vim به‌طور قابل توجهی از vi اصلی بهتر است و معمولاً در لینوکس با نام vi لینک (یا alias) شده.
در ادامه، فرض می‌کنیم برنامه‌ی «vi» در واقع همان vim است.


شروع و خروج از vi

برای اجرای vi، کافی‌ست در خط فرمان بنویسیم:

[me@linuxbox ~]$ vi

سپس صفحه‌ای مشابه زیر ظاهر می‌شود:

~
~                        VIM - Vi Improved
~
~                         version 7.1.138
~                    by Bram Moolenaar et al.
~           Vim is open source and freely distributable
~
~                    Sponsor Vim development!
~         type  :help sponsor<Enter>    for information
~
~         type  :q<Enter>               to exit
~         type  :help<Enter>  or  <F1>  for on-line help
~         type  :help version7<Enter>   for version info
~
~                  Running in Vi compatible mode
~         type  :set nocp<Enter>        for Vim defaults

اولین چیزی که باید یاد بگیریم (مثل nano) این است که چطور خارج شویم.
برای خروج، دستور زیر را وارد کنید (دو نقطه بخشی از دستور است):

:q

اگر تغییراتی در فایل داده باشید و هنوز ذخیره نکرده باشید، vi ممکن است از خروج جلوگیری کند.
در این صورت می‌توانید با افزودن علامت تعجب، به آن بگویید «واقعاً می‌خواهم خارج شوم»:

:q!

💡 نکته: اگر در vi «گم» شدید، دوبار کلید Esc را فشار دهید تا دوباره کنترل را به دست بگیرید.

حالت سازگاری (Compatibility Mode)

در نمونه‌ی صفحه‌ی آغازین که در بالا دیدیم (گرفته‌شده از Ubuntu 8.04)، جمله‌ای نوشته بود:
"Running in Vi compatible mode"
یعنی ویرایشگر vim در حال اجرا در حالتی است که رفتار آن بیشتر شبیه vi اصلی است تا حالت پیشرفته‌ی خود vim.
اما در این فصل، ما می‌خواهیم vim را در حالت پیشرفته‌اش اجرا کنیم. برای این کار چند راه وجود دارد:

  1. ساده‌ترین راه: به‌جای اجرای vi، مستقیماً vim را اجرا کنید.

  2. اگر جواب داد، بهتر است در فایل ~/.bashrc این خط را اضافه کنید تا همیشه همین‌طور باشد:

    alias vi='vim'
    
  3. یا می‌توانید این دستور را بزنید تا تنظیم لازم در فایل پیکربندی vim اضافه شود:

    echo "set nocp" >> ~/.vimrc
    

    (گزینه‌ی nocp یعنی No Compatibility Mode یا همان غیرفعال کردن حالت سازگاری.)

توزیع‌های مختلف لینوکس vim را به شکل‌های متفاوتی بسته‌بندی می‌کنند.
بعضی نسخه‌ها فقط یک نسخه‌ی حداقلی (minimal) از vim را نصب می‌کنند که امکانات محدودی دارد.
اگر در تمرین‌های بعدی متوجه شدید بعضی قابلیت‌ها کار نمی‌کنند، نسخه‌ی کامل vim را نصب کنید.


حالت‌های ویرایش (Editing Modes)

بیایید دوباره vi را باز کنیم، اما این‌بار نام فایلی را که هنوز وجود ندارد به آن بدهیم تا یک فایل جدید بسازیم:

[me@linuxbox ~]$ rm -f foo.txt
[me@linuxbox ~]$ vi foo.txt

اگر همه‌چیز درست پیش برود، صفحه‌ای مشابه این خواهید دید:

~
~
~
~
~
"foo.txt" [New File]

علامت‌های (~) در ابتدای خطوط نشان می‌دهند که در آن خطوط هیچ متنی وجود ندارد؛ یعنی فایل خالی است.
فعلاً هیچ چیز تایپ نکنید.


ویرایشگر vi حالت‌مند است

دومین نکته‌ی مهم (بعد از یاد گرفتن خروج) این است که vi یک ویرایشگر حالت‌مند است (modal editor).
وقتی vi را اجرا می‌کنیم، به‌صورت پیش‌فرض در حالت فرمان (command mode) قرار دارد.
در این حالت تقریباً هر کلید یک دستور است.
پس اگر همین‌طور شروع به تایپ کنید، vi دستورات مختلفی اجرا می‌کند و احتمالاً صفحه را به‌هم می‌ریزد.


ورود به حالت درج (Insert Mode)

برای افزودن متن باید وارد حالت درج شویم.
کافی‌ست کلید i را فشار دهیم.
بعد از آن، اگر vim در حالت پیشرفته باشد (نه در حالت سازگاری)، در پایین صفحه پیامی می‌بینید مثل:

-- INSERT --

حالا می‌توانید متن تایپ کنید. مثلاً:

The quick brown fox jumped over the lazy dog.

برای خروج از حالت درج و برگشت به حالت فرمان، کلید Esc را فشار دهید.


ذخیره کردن تغییرات

برای ذخیره کردن فایل باید در حالت فرمان (command mode) باشیم و یک دستور ex وارد کنیم.
این کار با فشار دادن ":" انجام می‌شود. پس از آن، در پایین صفحه علامت : ظاهر می‌شود.

سپس برای نوشتن (ذخیره) فایل بنویسید:

:w

فایل روی دیسک ذخیره می‌شود و پیغامی مشابه این خواهید دید:

"foo.txt" [New] 1L, 46C written

نکته: در مستندات vim، حالت «فرمان» معمولاً با نام normal mode معرفی می‌شود
و دستورات ex (مثل :w, :q) در بخشی به نام command mode آمده‌اند —
پس اگر در منابع رسمی دیدید که اسامی فرق می‌کنند، گیج نشوید.

حرکت دادن مکان‌نما (Moving The Cursor Around)

در حالت فرمان (Command Mode)، ویرایشگر vi تعداد زیادی دستور برای جابه‌جایی مکان‌نما دارد — بعضی از آن‌ها با برنامه‌ی less مشترک‌اند.
در جدول زیر مجموعه‌ای از پرکاربردترین آن‌ها را می‌بینید:

کلید حرکت مکان‌نما
l یا کلید یک کاراکتر به راست
h یا کلید یک کاراکتر به چپ
j یا کلید یک خط پایین‌تر
k یا کلید یک خط بالاتر
0 (صفر) ابتدای خط فعلی
^ اولین کاراکتر غیر فاصله در خط فعلی
$ انتهای خط فعلی
w ابتدای کلمه یا نشانه‌گذاری بعدی
W ابتدای کلمه بعدی (بدون توجه به نشانه‌گذاری‌ها)
b ابتدای کلمه یا نشانه‌گذاری قبلی
B ابتدای کلمه قبلی (بدون توجه به نشانه‌گذاری‌ها)
Ctrl+f یا Page Down یک صفحه پایین‌تر
Ctrl+b یا Page Up یک صفحه بالاتر
عددG رفتن به شماره خط مشخص (مثلاً 1G می‌رود به خط اول)
G رفتن به آخرین خط فایل

چرا از کلیدهای h، j، k، l برای حرکت استفاده می‌شود؟
زیرا زمانی که vi ساخته شد، همه‌ی ترمینال‌ها کلید جهت‌نما نداشتند.
بنابراین این چهار کلید معمولی روی صفحه‌کلید به‌گونه‌ای انتخاب شدند که بتوان بدون برداشتن دست از صفحه‌کلید، مکان‌نما را جابه‌جا کرد.


تقریباً همه‌ی دستورات در vi را می‌توان با یک عدد تکرار همراه کرد.
مثلاً دستور 5j باعث می‌شود مکان‌نما ۵ خط پایین‌تر برود.
به همین ترتیب، 3w مکان‌نما را ۳ کلمه جلو می‌برد.


ویرایش پایه (Basic Editing)

بیشتر ویرایش‌ها شامل چند کار ساده هستند:
درج متن، حذف متن، و جابه‌جایی آن (برش و چسباندن).
vi همه‌ی این عملیات را به شیوه‌ی خاص خودش انجام می‌دهد و حتی یک undo محدود هم دارد.
اگر در حالت فرمان کلید u را بزنید، آخرین تغییر اعمال‌شده برگردانده (undo) می‌شود — در تمرین‌های بعدی به کارمان می‌آید.


افزودن متن (Appending Text)

vi چند روش مختلف برای ورود به حالت درج دارد. قبلاً از دستور i برای درج استفاده کردیم.
بیایید دوباره به فایل foo.txt برگردیم:

The quick brown fox jumped over the lazy dog.

اگر بخواهیم متنی را به انتهای این جمله اضافه کنیم، متوجه می‌شویم دستور i به‌تنهایی کار نمی‌کند، چون نمی‌توان مکان‌نما را بعد از آخرین کاراکتر خط برد.
برای این کار، vi دستوری به نام a (مخفف append) دارد.
کافی است مکان‌نما را به انتهای خط ببریم و a را بزنیم.
vi مکان‌نما را یک موقعیت جلو می‌برد و وارد حالت درج می‌شود. حالا می‌توانیم بنویسیم:

The quick brown fox jumped over the lazy dog. It was cool.

بعد از اتمام تایپ، کلید Esc را بزنید تا از حالت درج خارج شوید.


چون معمولاً می‌خواهیم به انتهای خط متن اضافه کنیم، vi میانبری برای این حالت دارد: دستور A.
این دستور مکان‌نما را به انتهای خط می‌برد و مستقیماً وارد حالت درج می‌کند.

بیایید امتحان کنیم:

  1. با دستور 0 مکان‌نما را به ابتدای خط برگردانید.
  2. سپس A را بزنید و خطوط زیر را اضافه کنید:
The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
Line 5

در پایان، کلید Esc را بزنید تا از حالت درج خارج شوید.

🔹 می‌بینید که دستور A کاربردی‌تر از a است، چون خودش قبل از شروع نوشتن، مکان‌نما را به انتهای خط می‌برد.

باز کردن یک خط جدید (Opening A Line)

یکی دیگر از روش‌های درج متن در vi این است که یک خط جدید باز کنیم.
این کار یک خط خالی بین دو خط موجود اضافه می‌کند و هم‌زمان ویرایشگر را وارد حالت درج می‌سازد.
دو نوع دستور برای این کار وجود دارد:

دستور خط جدید را باز می‌کند در...
o پایین خط فعلی
O بالای خط فعلی

بیایید این دو را امتحان کنیم.
مکان‌نما را روی "Line 3" بگذارید و کلید o را بزنید:

The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
Line 5

نتیجه: یک خط خالی زیر خط سوم باز می‌شود و vi وارد حالت درج (insert mode) می‌گردد.
کلید Esc را بزنید تا از حالت درج خارج شوید،
سپس کلید u را فشار دهید تا تغییر لغو (undo) شود.

حالا کلید O (حرف بزرگ) را بزنید تا خط جدیدی بالای مکان‌نما باز شود:

The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
Line 5

باز هم با Esc از حالت درج خارج شوید،
و با زدن u تغییر را برگردانید.


حذف متن (Deleting Text)

ویرایشگر vi روش‌های گوناگونی برای حذف متن دارد. تقریباً تمام آن‌ها از دو کلید اصلی استفاده می‌کنند: x و d.

🔹 کلید x

کاراکترِ قرارگرفته در محل مکان‌نما را حذف می‌کند.
می‌توان قبل از آن عدد گذاشت تا چند کاراکتر حذف شود.

🔹 کلید d

برای حذف‌های پیشرفته‌تر استفاده می‌شود.
می‌تواند با عدد (تعداد تکرار) و سپس دستور حرکت (movement command) همراه شود تا محدوده‌ی حذف را مشخص کند.


دستور حذف می‌کند
x کاراکتر فعلی
3x کاراکتر فعلی و دو کاراکتر بعدی
dd کل خط فعلی
5dd خط فعلی و چهار خط بعدی (جمعاً پنج خط)
dW از موقعیت فعلی مکان‌نما تا ابتدای کلمه‌ی بعد
d$ از موقعیت فعلی تا انتهای خط
d0 از موقعیت فعلی تا ابتدای خط
d^ از موقعیت فعلی تا اولین کاراکتر غیر فاصله در خط
dG از خط فعلی تا انتهای فایل
d20G از خط فعلی تا خط بیستم فایل

👣 تمرین:
مکان‌نما را روی کلمه‌ی "It" در خط اول متن قرار دهید.
چند بار کلید x را بزنید تا بقیه‌ی جمله حذف شود.
سپس چند بار کلید u را فشار دهید تا عمل حذف واگردانده (undo) شود.


⚠️ توجه:
نسخه‌ی اصلی vi فقط یک سطح undo دارد (یعنی فقط آخرین تغییر را برمی‌گرداند)،
اما نسخه‌ی پیشرفته‌تر یعنی vim از چند سطح undo پشتیبانی می‌کند — می‌توانید چند تغییر متوالی را پیاپی برگردانید.

تمرین حذف با دستور d

دوباره حذف را با دستور d تمرین کنیم.
مکان‌نما را روی کلمه‌ی “It” بگذارید و دستور زیر را بزنید:

dW

نتیجه:

The quick brown fox jumped over the lazy dog. was cool.
Line 2
Line 3
Line 4
Line 5

این دستور از محل مکان‌نما تا ابتدای کلمه‌ی بعدی را حذف می‌کند (یعنی همان “It ” را).

حالا برای حذف از محل مکان‌نما تا انتهای خط، بنویسید:

d$

نتیجه:

The quick brown fox jumped over the lazy dog.
Line 2
Line 3
Line 4
Line 5

و اگر بخواهید از خط فعلی تا انتهای فایل حذف شود، دستور زیر را بزنید:

dG

نمایش روی صفحه به شکل زیر خواهد بود:

~
~
~
~
~

برای برگرداندن همه‌ی حذف‌ها، سه بار کلید u را بزنید تا فایل به حالت قبل بازگردد.


برش، کپی و چسباندن متن

(Cutting, Copying, and Pasting Text)

دستور d فقط حذف نمی‌کند — در واقع متن را برش (cut) می‌دهد و آن را در یک buffer (نوعی کلیپ‌بورد داخلی) ذخیره می‌کند.
بعداً می‌توانیم محتوای آن را با دستورهای زیر بازیابی کنیم:

برای کپی بدون حذف از دستور y (مخفف yank) استفاده می‌شود، که دقیقاً مثل d عمل می‌کند ولی متن را حذف نمی‌کند.


دستور کپی می‌کند
yy کل خط فعلی
5yy خط فعلی و چهار خط بعدی
yW از موقعیت فعلی تا ابتدای کلمه‌ی بعدی
y$ از موقعیت فعلی تا انتهای خط
y0 از موقعیت فعلی تا ابتدای خط
y^ از موقعیت فعلی تا اولین کاراکتر غیر فاصله
yG از خط فعلی تا انتهای فایل
y20G از خط فعلی تا خط بیستم فایل

تمرین: کپی و چسباندن

مکان‌نما را روی خط اول بگذارید و بنویسید:

yy

(کل خط اول را کپی می‌کند.)

سپس مکان‌نما را به آخرین خط ببرید (G) و بنویسید:

p

نتیجه:

The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
Line 5
The quick brown fox jumped over the lazy dog. It was cool.

اگر اشتباه کردید، با زدن u تغییر را لغو کنید.

اکنون، با مکان‌نما روی آخرین خط، بنویسید:

P

تا خط کپی‌شده بالای خط فعلی درج شود:

The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
The quick brown fox jumped over the lazy dog. It was cool.
Line 5

تمرین کنید تا رفتار دستورات p و P را کاملاً درک کنید.
در پایان، فایل را به حالت اولیه بازگردانید (مثلاً با undo).


ترکیب خطوط (Joining Lines)

ویرایشگر vi برای مفهوم «خط» بسیار دقیق است؛
به همین دلیل، نمی‌توانید مکان‌نما را در انتهای یک خط ببرید و با حذف کاراکتر پایان خط، آن را به خط پایین بچسبانید.

برای این کار، vi دستور خاصی دارد: J (حرف بزرگ).
توجه کنید که این دستور با j فرق دارد (j برای حرکت مکان‌نما است، J برای ادغام خطوط).

اگر مکان‌نما را روی خط ۳ بگذارید و بنویسید:

J

نتیجه چنین می‌شود:

The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3 Line 4
Line 5

یعنی خط سوم و چهارم با هم یکی شده‌اند.

جست‌وجو و جایگزینی در vi

(Search and Replace)

ویرایشگر vi می‌تواند مکان‌نما را بر اساس جست‌وجوی متون جابه‌جا کند — چه در یک خط، چه در کل فایل.
همچنین می‌تواند عملیات جست‌وجو و جایگزینی (Search-and-Replace) را با یا بدون تأیید کاربر انجام دهد.


🔹 جست‌وجو در یک خط

(Searching Within a Line)

دستور f برای جست‌وجوی یک کاراکتر در همان خط استفاده می‌شود و مکان‌نما را به اولین وقوع آن می‌برد.

مثلاً:

fa

مکان‌نما را به اولین حرف a در خط فعلی منتقل می‌کند.

اگر بخواهید همان جست‌وجو را دوباره تکرار کنید، کافی‌ست ; (نقطه‌ویرگول) بزنید.


🔹 جست‌وجو در کل فایل

(Searching the Entire File)

برای جست‌وجوی یک کلمه یا عبارت در کل فایل از دستور / استفاده می‌کنیم.

مثلاً وقتی بنویسید:

/Line

و سپس Enter بزنید، vi مکان‌نما را به اولین محل وجود کلمه‌ی “Line” می‌برد.

اگر دوباره همان عبارت را می‌خواهید در ادامه‌ی فایل پیدا کنید، کافی است بنویسید:

n

(یعنی “next match”)

🔁 هر بار که n را بزنید، vi به تطابق بعدی می‌رود تا وقتی که دیگر تطابقی وجود نداشته باشد.


مثال:

The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
Line 5

اگر مکان‌نما روی خط اول باشد و بنویسید:

/Line

به خط دوم منتقل می‌شوید.
اگر بعدش n بزنید، به خط سوم می‌روید، و به همین ترتیب تا پایان.

⚙️ توجه: vi از regular expressions هم پشتیبانی می‌کند (الگوهای متنی پیشرفته).
در فصل‌های بعدی به‌صورت کامل به آن پرداخته می‌شود.


🔹 جست‌وجو و جایگزینی سراسری

(Global Search-and-Replace)

برای انجام عملیات جست‌وجو و جایگزینی از دستور ex استفاده می‌شود.
ساختار کلی آن به این شکل است:

:[range]s/old/new/[flags]

مثلاً برای اینکه در کل فایل، واژه‌ی “Line” به “line” تغییر کند:

:%s/Line/line/g

توضیح جزء به جزء دستور بالا

جزء معنا
: آغاز یک دستور ex
% محدوده‌ی تمام خطوط فایل (می‌توانست 1,5 یا 1,$ هم باشد)
s عملیات جایگزینی (substitute)
/Line/line/ الگوی جست‌وجو و متن جایگزین
g حالت “global” در هر خط → تمام تکرارهای کلمه در همان خط جایگزین می‌شوند (اگر حذف شود، فقط اولین مورد در هر خط تغییر می‌کند)

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

The quick brown fox jumped over the lazy dog. It was cool.
line 2
line 3
line 4
line 5

🔹 جایگزینی با تأیید کاربر

(Search-and-Replace with Confirmation)

اگر بخواهید vi قبل از هر جایگزینی از شما اجازه بگیرد، حرف c را به انتهای دستور اضافه کنید:

:%s/line/Line/gc

در این حالت vi قبل از هر جایگزینی سؤال می‌پرسد:

replace with Line (y/n/a/q/l/^E/^Y)?

کلیدهای پاسخ در حالت تأیید

کلید عملکرد
y انجام جایگزینی در این مورد
n رد کردن این مورد
a انجام جایگزینی برای این و تمام موارد بعدی
q یا Esc خروج از فرآیند جایگزینی
l جایگزینی این مورد و سپس خروج (مخفف “last”)
Ctrl-e / Ctrl-y پیمایش پایین / بالا برای دیدن بافت متنی مورد جایگزینی

به این ترتیب با y جایگزینی انجام می‌شود،
با n رد می‌شود،
و با a تمام موارد بعدی به‌صورت خودکار جایگزین می‌گردند.

ویرایش چند فایل هم‌زمان در vi

(Editing Multiple Files)

گاهی لازم است چند فایل را به‌صورت هم‌زمان ویرایش کنیم — مثلاً وقتی باید تغییر مشابهی را در چند فایل انجام دهیم، یا بخواهیم متنی را از فایلی به فایل دیگر کپی کنیم.
در vi می‌توان چند فایل را هم‌زمان باز کرد، کافی است هنگام اجرا آن‌ها را در خط فرمان بنویسیم:

vi file1 file2 file3 ...

شروع کار با چند فایل

ابتدا از vi فعلی خارج شوید و تغییرات را ذخیره کنید:

:wq

سپس برای تمرین، یک فایل جدید ایجاد کنید تا با فایل قبلی کار کنیم.
مثلاً در دایرکتوری خانه، خروجی دستور ls را در یک فایل جدید ذخیره کنید:

[me@linuxbox ~]$ ls -l /usr/bin > ls-output.txt

حالا هر دو فایل را هم‌زمان با vi باز کنید:

[me@linuxbox ~]$ vi foo.txt ls-output.txt

vi اجرا می‌شود و اولین فایل (foo.txt) را روی صفحه نمایش می‌دهد:

The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
Line 5

جابه‌جایی بین فایل‌ها

(Switching Between Files)

برای رفتن از یک فایل به فایل بعدی، بنویسید:

:n

برای برگشت به فایل قبلی:

:N

⚠️ اگر در فایلی تغییری داده باشید و هنوز ذخیره نکرده‌اید، vi اجازه‌ی تعویض فایل را نمی‌دهد.
برای نادیده گرفتن تغییرات و اجبار به جابه‌جایی، از علامت تعجب استفاده کنید:

:n!

مدیریت فایل‌های باز با buffers

در vim (و برخی نسخه‌های vi) می‌توانید فهرست فایل‌های باز را ببینید با دستور:

:buffers

خروجی چیزی شبیه زیر خواهد بود:

  1 %a   "foo.txt"                      line 1
  2      "ls-output.txt"                line 0
Press ENTER or type command to continue

در اینجا:

برای جابه‌جایی به فایل دیگر از دستور زیر استفاده کنید:

:buffer 2

در این مثال، vi از فایل foo.txt (buffer 1) به ls-output.txt (buffer 2) می‌رود.


باز کردن فایل جدید در همان جلسه

(Opening Additional Files For Editing)

می‌توان در حین ویرایش، فایل جدیدی به جلسه‌ی فعلی اضافه کرد.
برای این کار از دستور :e (مخفف edit) استفاده کنید.

فرض کنید دوباره vi را فقط با فایل اول باز کرده‌اید:

[me@linuxbox ~]$ vi foo.txt

حالا فایل دوم را اضافه کنید:

:e ls-output.txt

فایل دوم روی صفحه ظاهر می‌شود.

می‌توانید دوباره بررسی کنید چه فایل‌هایی باز هستند:

:buffers

خروجی:

  1 #    "foo.txt"                      line 1
  2 %a   "ls-output.txt"                line 0
Press ENTER or type command to continue

🔸 نکته مهم:
فایل‌هایی که با دستور :e باز می‌شوند، دیگر با :n یا :N قابل جابه‌جایی نیستند.
برای سوئیچ بین آن‌ها باید از دستور زیر استفاده کنید:

:buffer [شماره‌ی buffer]

مثلاً:

:buffer 1

به این ترتیب vi تبدیل می‌شود به یک محیط چندفایلی بسیار کارآمد —
جایی که می‌توانید با دقت بین فایل‌ها جابه‌جا شوید، ویرایش کنید و بدون خروج از محیط، تمام تغییرات را مدیریت نمایید.

کپی کردن محتوا از یک فایل به فایل دیگر

(Copying Content From One File Into Another)

در هنگام ویرایش چند فایل با vi، گاهی می‌خواهیم بخشی از یک فایل را به فایل دیگر منتقل کنیم.
این کار به‌سادگی با همان دستورهای yank (کپی) و paste (چسباندن) که قبلاً یاد گرفتیم انجام می‌شود.


🔹 مثال عملی

فرض کنید دو فایل باز داریم:
foo.txt و ls-output.txt

ابتدا به buffer 1 (فایل foo.txt) بروید:

:buffer 1

در این حالت صفحه‌ی فایل اول را می‌بینید:

The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
Line 5

حالا مکان‌نما را روی خط اول بگذارید و آن خط را کپی (yank) کنید:

yy

سپس به فایل دوم بروید:

:buffer 2

در این فایل خروجی دستور ls -l /usr/bin وجود دارد (فقط بخشی از آن را می‌بینید):

total 343700
-rwxr-xr-x 1 root root 31316 2007-12-05 08:58 [
-rwxr-xr-x 1 root root 8240  2007-12-09 13:39 411toppm
...

حالا مکان‌نما را روی اولین خط بگذارید و با دستور زیر، محتوای کپی‌شده از فایل قبلی را در زیر مکان‌نما بچسبانید:

p

نتیجه:

total 343700
The quick brown fox jumped over the lazy dog. It was cool.
-rwxr-xr-x 1 root root 31316 2007-12-05 08:58 [
-rwxr-xr-x 1 root root 8240  2007-12-09 13:39 411toppm
...

به این ترتیب، بخشی از فایل اول را به فایل دوم انتقال دادید —
بدون نیاز به خروج از vi یا استفاده از ابزارهای خارجی.


وارد کردن کل محتوای یک فایل در فایل دیگر

(Inserting an Entire File Into Another)

علاوه بر انتقال بخشی از متن، می‌توانید تمام محتوای یک فایل را در فایل دیگری وارد کنید.

برای امتحان، از جلسه‌ی vi فعلی خارج شوید و فقط فایل ls-output.txt را باز کنید:

[me@linuxbox ~]$ vi ls-output.txt

نمایش فایل مشابه زیر است:

total 343700
-rwxr-xr-x 1 root root 31316 2007-12-05 08:58 [
-rwxr-xr-x 1 root root 8240  2007-12-09 13:39 411toppm
...

اکنون مکان‌نما را روی سومین خط قرار دهید،
و این دستور را وارد کنید:

:r foo.txt

دستور :r (مخفف read) محتویات فایل مشخص‌شده را قبل از مکان‌نما وارد می‌کند.


نتیجه نهایی:

total 343700
-rwxr-xr-x 1 root root 31316 2007-12-05 08:58 [
-rwxr-xr-x 1 root root 8240  2007-12-09 13:39 411toppm
The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
Line 5
-rwxr-xr-x 1 root root 111276 2008-01-31 13:36 a2p
-rwxr-xr-x 1 root root 25368  2006-10-06 20:16 a52dec
...

خلاصه:

هدف دستور توضیح
کپی خط از فایل فعلی yy کپی (yank) خط فعلی
چسباندن در فایل دیگر p یا P درج بعد یا قبل از مکان‌نما
افزودن کل فایل به فایل دیگر :r filename درج کامل فایل قبل از مکان‌نما

به این ترتیب، vi می‌تواند به‌عنوان یک ویرایشگر چند‌فایلی قدرتمند عمل کند، بدون نیاز به هیچ ابزار اضافی.

ذخیره کردن کارها در vi

(Saving Our Work)

مثل بقیه‌ی بخش‌های vi، برای ذخیره‌ی فایل هم چند روش مختلف وجود دارد.
پیش‌تر با دستور :w آشنا شدیم، اما راه‌های دیگر هم وجود دارند که بسته به موقعیت می‌توان از آن‌ها استفاده کرد.


🔹 ذخیره و خروج سریع

در حالت فرمان (Command Mode) اگر بنویسید:

ZZ

vi فایل فعلی را ذخیره می‌کند و از برنامه خارج می‌شود.
این در واقع معادل ترکیب زیر است:

:wq

یعنی write (ذخیره) و quit (خروج) با هم.


🔹 ذخیره با نام جدید (Save As)

می‌توانید بعد از دستور :w، نام جدیدی بنویسید تا فایل را با نام دیگری ذخیره کند.
مثلاً اگر در حال ویرایش فایل foo.txt هستید و می‌خواهید نسخه‌ی جدیدی با نام foo1.txt بسازید، دستور زیر را بزنید:

:w foo1.txt

نکته:
این دستور فایل را با نام جدید ذخیره می‌کند،
اما نام فایل در حال ویرایش تغییر نمی‌کند
یعنی شما هنوز در حال ویرایش foo.txt هستید، نه foo1.txt.


🧭 جمع‌بندی (Summing Up)

با این مجموعه‌ی دستورات، اکنون می‌توانید تقریباً تمام ویرایش‌های متنی لازم برای مدیریت یک سیستم لینوکسی را انجام دهید:

اگر استفاده از vim را در کارهای روزمره‌تان عادت دهید، در بلندمدت نتیجه‌اش را خواهید دید.
چون ویرایشگرهای مبتنی بر vi به‌قدری در دنیای یونیکس و لینوکس ریشه دارند که ردپایشان را در بسیاری از ابزارهای دیگر (مثل less) خواهید دید.


📚 منابع پیشنهادی برای یادگیری بیشتر

(Further Reading)

با وجود همه‌ی مباحثی که در این فصل یاد گرفتیم، هنوز تنها سطح ابتدایی vi و vim را لمس کرده‌ایم.
برای یادگیری عمیق‌تر، منابع زیر پیشنهاد می‌شوند:

  1. Learning the vi Editor – راهنمای خلاصه ویکی‌بوک در مورد vi و نسخه‌های مشابه آن (مثل vim):
    🔗 https://en.wikibooks.org/wiki/Vi

  2. The Vim Book – کتاب رسمی پروژه‌ی vim، شامل حدود ۵۷۰ صفحه درباره‌ی تمام امکانات این ویرایشگر:
    🔗 ftp://ftp.vim.org/pub/vim/doc/book/vimbook-OPL.pdf

  3. مقاله‌ی ویکی‌پدیا درباره‌ی Bill Joy (خالق vi):
    🔗 https://en.wikipedia.org/wiki/Bill_Joy

  4. مقاله‌ی ویکی‌پدیا درباره‌ی Bram Moolenaar (نویسنده‌ی vim):
    🔗 https://en.wikipedia.org/wiki/Bram_Moolenaar


🔸 حالا شما پایه‌های واقعی کار با vi/vim را بلدید —
ویرایشگر افسانه‌ای که با چند کلید ساده، می‌تواند کل سیستم شما را شکل دهد.