فهرست مطالب

ادیتور vi با تلفظ /ˈviːˈaɪ/ در سال ۱۹۷۶ توسط آقای Bill Joy نوشته شده است.
vi دارای دو مُد command و insert است. در هر حال فقط یک مد فعال است. یعنی یا در مد command هستید یا در مد insert قرار دارید.
vi دستورات فراوانی دارد که در این مقاله به اصلیترین موارد و مواردی که در اثر تجربه، بیشتر از آنها استفاده میکنم اشاره میکنم.
توصیه میکنم در هنگام خواندن این مقاله، یک فایل متنی بلند مثل توافقنامهی یک نرمافزار را انتخاب کنید. یک کپی از آن بگیرید. آن را در vi باز کنید و هر دستور را بر روی فایل باز شده اجرا کنید تا موارد را به صورت عملی فرا بگیرید.
فرض بر این است که شما هم اکنون در محیط یک توزیع لینوکس به سر میبرید. در این صورت به احتمال قریب به یقین vi بر روی توزیع شما نصب است.
vi را تایپ کنید و ++enter++ را بزنید. وارد برنامه vi می شوید.i را بزنید.:w test.txt. این دستور متن نوشته شده را تحت نام test.txt در مسیر جاری ذخیره میکند.:w را بنویسید فایل را تحت همین نام test.txt ذخیره میکند یعنی دستور :w (بدون نام فایل)، معادل save است.i را بزنید تا وارد مد insert شوید . به انتهای خط اول بروید و ++enter++ را بزنید. در خط دوم عبارت Good practice! را تایپ کنید.:w. فایل تحت همان نام test.txt ذخیره میشود.:q . چون فایل بعد از آخرین save تغییری نکرده است از vi خارج خواهید شد و به خط فرمان بر میگردید.!!! info "نکته"
با فشردن دگمه ++escape++ کنترل به مد command بر میگردد. زمانی که در مد command هستید با فشردن دگمه i وارد مد insert میشوید. این روش تنها راه ورود به مد insert نیست و همین عمل ورود به مد insert به وسیلهی دگمه i ، مفهوم خاصی دارد که در ادامه به آن میپردازیم.
یک فایل متنی بلند را انتخاب کنید و آن را در مسیری که خط فرمان به آن اشاره میکند کپی کنید. فرض میکنیم نام این فایل EULA.txt است.
vi EULA.txt فایل EULA.txt در ویرایشگر vi باز خواهد شد.i را بزنید تا وارد مد insert شوید و متنی را تایپ کنید.:q! را تایپ کنید. در این حالت vi مانع خروج شما نخواهد شد.!!! info "نکته"
دستوراتی که تاکنون در مد command اجرا کردیم با کولُن : شروع شدهاند و هنگام تایپ، دستور در نوار پایینی نمایش داده میشود.
از دستوراتی که در بالا استفاده کردهایم میتوان جدول زیر را ایجاد کرد:
| دستور | محیط | توضیحات |
|---|---|---|
vi |
خط فرمان | طریقه ورود به vi را آموختیم. |
:w filename |
vi command mode | آموختیم چگونه فایلی را در vi ایجاد و برای اولین بار آن را با نام دلخواه save کنیم. |
:q |
vi command mode | طریقه خروج از vi را آموختیم. |
i |
vi command mode | آموختیم با زدن دگمه i از مد command به مد insert میرویم. |
| ++escape++ | vi insert mode | با زدن دگمه ++escape++ از مد insert خارج و وارد مد command یعنی آماده پذیرش دستورات میشویم. |
vi filename |
خط فرمان | آموختیم که چگونه یک فایل موجود را در vi باز کنیم. |
:q! |
vi command mode | آموختیم چگونه بدون save کردن آخرین تغییرات، از vi خارج شویم. |
:x و یا:wq |
vi command mode | save کن و خارج شو! |
اکثر سیستمهای موجود در زمان نوشتن برنامهی vi ، دارای کلیدهای جهتی یا arrow key ها نبودند . به همین دلیل vi تدابیری برای حرکت در فایل اندیشیده است.
توجه داشته باشید که در vi موس کار نمیکند!
بدیهی است که مطالب زیر جز دستورات vi میباشند و می بایست در مد command اجرا شوند .
h مشابه دگمهی ++arrow-left++ نشانگر را به سمت چپ حرکت میدهد.l مشابه دگمهی ++arrow-right++ نشانگر را به سمت راست حرکت میدهد.j مشابه دگمهی ++arrow-down++ نشانگر را به خط پایین میبرد.k مشابه دگمهی ++arrow-up++ نشانگر را به خط بالایی میبرد.دگمه ++escape++ را بزنید تا اطمینان حاصل کنید در مد command هستید.
dd این کار خط فعلی را حذف میکند. خط حذف شده در داخل clipboard جای میگیرد.dnd با عنایت به اینکه n یک عدد است، n خط با احتساب خط فعلی، را حذف میکند. خطوط پاک شده در داخل clipboard قرار میگیرند. برای مثال d2d خط فعلی و خط بعد از آن را cut میکند و دستور d10d ، خط فعلی و ۹ خط بعد از آن را حذف میکند.دگمه ++escape++ را بزنید تا اطمینان حاصل کنید در مد command هستید.
dd این کار خط فعلی را پاک میکند. خط پاک شده در داخل clipboard جای میگیرد.p را بزنید. p محتوای clipboard را در خط بعد از خطی که cursor در آن قرار دارد، paste میکند.u را بزنید. u عمل undo را انجام میدهد. فشردن متوالی u باعث undo شدن تغییرات تا لحظهی بازگشت به نسخه اصلی فایل میشود.دگمه ++escape++ را بزنید تا اطمینان حاصل کنید در مد command هستید.
h, j, k,l) به ابتدای جایی که میخواهید از آن نقطه تا انتهای خط حذف بشود، بروید.D را بزنید. از نقطه فعلی cursor تا انتهای خط cut خواهد شد و در clipboard قرار خواهد گرفت.دگمه ++escape++ را بزنید تا اطمینان حاصل کنید در مد command هستید.
cc این کار خط فعلی را کاملا پاک میکند و به مد insert میرود و آماده ورود کاراکترهای بعدی میشود. بعد از اتمام ورود متن دلخواه، دگمه ++escape++ را بزنید.cnc با عنایت به اینکه n یک عدد است با احتساب خط فعلی n خط را پاک میکند و به مد insert میرود تا کاراکترهای جایگزین این خطوط را بخواند. به عنوان مثال c2c یا c5c اولین دستور دو خط و دومی ۵ خط را پاک میکند و به مد insert میرود. بدیهی است بعد از اتمام ورود کاراکترها میبایست ++escape++ را بزنید.دگمه ++escape++ را بزنید تا اطمینان حاصل کنید در مد command هستید.
h, j, k, l) به ابتدای جایی که میخواهید از آن به بعد را ویرایش کنید بروید.C (C بزرگ)را بزنید. کاراکتر زیر cursor تا انتهای خط پاک میشود و ادیتور به مد insert میرود. بعد از اتمام ویرایش دگمه ++escape++ را بزنید.دگمه ++escape++ را بزنید تا اطمینان حاصل کنید در مد command هستید.
i کاراکترهای ورودی را در مکان cursor درج میکند.a کاراکترهای ورودی را در نقطه بعد از cursor درج میکند. a اول کلمه append است.I کاراکترهای ورودی را در ابتدای خط فعلی درج میکند.A کاراکترهای ورودی را در انتهای خط فعلی Append یا درج میکند.دستورات فوق علیرغم عجیب به نظر رسیدنشان، بسیار ساده و قابل فهم هستند . فایل تست خود را باز کنید و دستورات را روی آن اجرا کنید تا تفاوتهای ساده آنها را متوجه شوید.
++escape++ را بزنید تا اطمینان حاصل کنید که در مد command هستید.
0 (تنها دگمه 0) معادل دگمه ++home++ است. cursor را به ابتدای خط فعلی میبرد.$ (تنها کاراکتر $) معادل دگمه ++end++ است. cursor را به انتهای خط فعلی میبرد.w (تنها دگمه w) نشانگر یا cursor را به ابتدای کلمه بعدی منتقل میکند. در صورت رسیدن به آخرین کلمهی خط جاری، در صورت فشردن مجدد، cursor به ابتدای اولین کلمه خط بعد منتقل می شود.b (تنها دگمه b) نشانگر یا cursor را به ابتدای کلمه قبلی میبرد. در صورت رسیدن به ابتدای اولین کلمه خط جاری، در صورت تکرار دستور، cursor به ابتدای آخرین کلمهی خط قبلی میرود.++escape++ را بزنید تا اطمینان حاصل کنید که در مد command هستید.
x (تنها x): کاراکتری که cursor روی آن قرار گرفته است را پاک میکند.nx (تنها nx): با عنایت به اینکه n یک عدد است، n کاراکتر از نقطه فعلی cursor به بعد را پاک میکند. مثلا عبارت 5x، کاراکتر زیر cursor را به همراه ۴ کاراکتر بعد از آن حذف میکند.r (تنها r): برای replace کاراکتر به کار میرود. cursor را روی کاراکتری که میخواهید آن را با چیز دیگری جایگزین کنید قرار دهید. حال r را فشار دهید و بلافاصله کاراکتر جایگزین را بزنید.++escape++ را بزنید تا اطمینان حاصل کنید که در مد command هستید.
h, j, k, l) به ابتدای کلمهای که میخواهید وبرایش کنید بروید.cw مختصر عبارت change word. کلمه بعد از cursor پاک میشود و vi به طور اتوماتیک به مد insert میرود و آماده دریافت کاراکترهای ورودی میشود. بعد از اتمام نوشتن دگمه ++escape++ را بزنید. در واقع با زدن cw ویرایشگر vi از نقطه فعلی cursor تا انتهای کلمه را پاک میکند.cnw با عنایت به این نکته که n یک عدد است، تعداد n کلمه بعد از cursor را پاک میکند و به صورت اتوماتیک وارد مد insert و آماده گرفتن کاراکترهای ورودی میشود. طبیعی است بعد از اتمام ویرایش و ورود کاراکترها باید دگمه ++escape++ را بزنید. مثالهایی از این مورد میتواند c2w برای ویرایش ۲ کلمه از نقطه فعلی cursor یا c5w برای ویرایش ۵ کلمه از نقطه فعلی cursor باشد.دگمه ++escape++ را بزنید تا اطمینان حاصل کنید که در مد insert هستید.
:0 این دستور cursor را به خط اول فایل میبرد.:$ این دستور cursor را به خط آخر فایل میبرد.:n با عنایت به این نکته که n یک عدد است cursor را به خط n میبرد.دگمه ++escape++ را بزنید تا اطمینان حاصل کنید که در مد insert هستید.
Ctrl+f عملکرد آن مشابه دگمه ++page-down++ است. به اندازه یک صفحه به پایین پرش میکند.Ctrl+b مشابه ++page-up++ عمل میکند. به اندازه یک صفحه به بالا پرش میکند.Ctrl+d به اندازه نیم صفحه به پایین پرش میکند.Ctrl+u نیم صفحه به بالا پرش میکند.دگمه ++escape++ را بزنید تا اطمینان حاصل کنید در مد insert هستید.
h, j, k, l) به ابتدای کلمهای که میخواهید آنرا پاک کنید بروید.dw اختصار عبارت delete word. کاراکترهای کلمه فعلی، از نقطه زیر cursor تا انتهای کلمه به همراه کلیه space های بعد از این کلمه و قبل از کلمه بعدی حذف میشوند و در داخل clipboard قرار میگیرند.dnw با عنایت به اینکه n یک عدد است، n کلمه از نقطه زیر cursor به بعد را حذف میکند و در داخل clipboard قرار میدهد.دگمه ++escape++ را بزنید تا اطمینان حاصل کنید که در مد insert هستید.
h, j, k, l) به خطی که میخواهید آنرا کپی کنید بروید.yy را وارد کنید. یعنی دوبار دگمه y را بزنید. این دستور خط فعلی را در داخل clipboard قرار میدهد. حال میتوانید با استفاده از کلیدهای جهتی به نقطهی دلخواه بروید و با فشردن دگمه p متن کپی شده را در خط بعد از نشانگر paste کنید.yny با عنایت به اینکه n یک عدد است، با احتساب خط فعلی، تعداد n خط را در داخل clipboard قرار میدهد تا در جای دلخواه آنرا paste کنید.بدیهیترین راه اینست که در مد insert در پایان خط ++enter++ را بزنید تا خط جدید ایجاد شود!
++escape++ را بزنید تا اطمینان حاصل کنید در مد command هستید.
o (تنها o کوچک) خطی جدید در زیر خط فعلی ایجاد میکند و به صورت اتوماتیک به مد insert میرود و آماده ورود کاراکترها میشود.O (تنها O بزرگ) مانند o کوچک با این تفاوت که خطی جدید در بالای خط فعلی ایجاد میکند و به مد insert میرود.++escape++ را بزنید تا اطمینان حاصل کنید در مد command هستید.
/search از محل قرارگیری cursor به سمت انتهای فایل به جستجوی عبارت وارد شده (در اینجا search) میپردازد. در صورت یافتن موردی، cursor به ابتدای عبارت یافت شده منتقل میشود. جهت این جستجو از بالا به پایین است.?search از محل قرارگیری cursor به سمت ابتدای فایل به دنبال عبارت وارد شده میگردد و مانند دستور قبلی در صورت یافتن موردی، cursor به ابتدای عبارت یافت شده منتقل میشود. جهت این جستجو از پایین به بالا است.n و N استفاده کنید. n مورد بعدی در جهت جستجو را نشان میدهد در حالیکه N مورد بعدی در خلاف جهت جستجو را نشان میدهد.++escape++ را بزنید تا اطمینان حاصل کنید در مد command هستید.
:= تعداد کل خطوط فایل را نمایش میدهد.:-= شماره خط فعلی که cursor در آن قرار گرفته را نمایش میدهد.++escape++ را بزنید تا اطمینان حاصل کنید در مد command هستید.
>> خط فعلی را یکبار به سمت راست دندانه (indent) میدهد. در صورت تکرار دستور مجددا دندانه خواهد داد.<< در صورتی که خط فعلی دندانه (indent) داشته باشد یک دندانه را حذف میکند. در صورت تکرار و به شرط داشتن دندانه، یکبار دیگر یک دندانهی دیگر را حذف میکند.:r filename محتوای فایل filename را در خط بعد از خط فعلی cursor اضافه میکند.:w filename مشابه دستور save as مرسوم در برنامهها است. محتوای موجود در ویرایشگر را در فایلی به نام filename ذخیره میکند. توجه کنید چنانچه قبل از اجرای این دستور فایلی که بر روی آن کار میکردید دارای نام بوده است شما همچنان در حال کار بر روی آن فایل باقی میمانید. در صورتی که فایل دیگری با نام filename وجود داشته باشد ذخیره سازی انجام نمی شود و برنامه خطا میدهد.:w! filename فایل موجود را تحت نام filename ذخیره میکند. اگر فایل دیگری با این نام وجود داشته باشد، فایل موجود رونویسی میشود.:w مشابه دستور save در برنامههاست. فایل باز شده را تحت همان نام قبلی ذخیره میکند.:i,jw filename با عنایت به این نکته که i و j عددهایی حاوی شماره خط آغاز و شماره خط پایان است، محتوای دو خط نام برده شده و خطوط مابین آن ها را در فایل جدیدی تحت نام filename ذخیره میکند.جدول زیر فشرده شدهی دستورات فوق است:
| دستور | مد بعدی vi / shell command line |
توضیحات |
|---|---|---|
i |
insert | ورود به مد insert. کاراکترهای ورودی در نقطه فعلی cursor اضافه میشوند. |
a |
insert | ورود به مد insert. کاراکترهای ورودی بعد از cursor اضافه میشوند. |
I |
insert | ورود به مد insert. کاراکترهای ورودی به ابتدای خط فعلی اضافه میشوند. |
A |
insert | ورود به مد insert. کاراکترهای ورودی به انتهای خط فعلی Append میشوند. |
h |
command | معادل دگمهی ++arrow-left++. نشانگر یا cursor را یک کاراکتر به سمت چپ میبرد. |
l |
command | معادل دگمهی ++arrow-right++. نشانگر را یک کاراکتر یه سمت راست میبرد. |
j |
command | معادل دگمهی ++arrow-down++. نشانگر یا همان cursor را یک خط پایین میبرد. |
k |
command | معادل دگمهی ++arrow-up++. نشانگر را یک خط به بالا میبرد. |
:wq |
shell command line | ذخیره فایل فعلی و خروج از vi |
:x |
shell command line | ذخیره فایل فعلی و خروج از vi |
:q |
command / shell command line | در صورتی که فایل از لحظه آخرین ذخیره تغییر نکرده باشد از vi خارج میشود. در غیر این صورت پیغام خطا میدهد. |
:q! |
shell command line | از vi خارج میشود ولو اینکه آخرین تغییرات ذخیره نشده باشد. |
w |
command | نشانگر را به ابتدای کلمهی بعدی منتقل میکند. |
b |
command | نشانگر یا cursor را به ابتدای کلمه قبلی منتقل میکند. |
0 |
command | معادل دگمه ++home++. نشانگر را به ابتدای خط فعلی میبرد. |
$ |
command | معادل دگمه ++end++. نشانگر یا cursor را به انتهای خط فعلی میبرد. |
u |
command | عمل undo را انجام میدهد. |
p |
command | محتوای clipboard را در خط بعد از خط فعلی نشانگر paste میکند. |
x |
command | کاراکتر زیر cursor را پاک میکند. |
nx |
command | تعداد n کاراکتر از نقطه زیر cursor به بعد را پاک میکند. |
>> |
command | خط موجود را یکبار به سمت راست دندانه (indent) میدهد. |
<< |
command | در صورت وجود دندانه در خط موجود یک دندانه (indent) را حذف میکند. |
o |
insert | یک خط بعد از خط فعلی ایجاد میکند و cursor در آن قرار میگیرد و vi به مد insert میرود. |
O |
insert | یک خط در بالای خط فعلی ایجاد میکند و cursor به آن منتقل میشود و ادیتور در مد insert آماده دریافت کاراکترهای ورودی میشود. |
r |
command | کاراکتر زیر cursor را با کاراکتری که بعد از r خواهد خواند جایگزین میکند. |
:0 |
command | نشانگر را به خط اول منتقل میکند. |
:n |
command | نشانگر را به خط n میبرد. |
:$ |
command | نشانگر را به خط آخر میبرد. |
cw |
insert | کلمه فعلی از نقطهای که cursor در آن قرار گرفته است را پاک میکند و به مد insert میرود و آماده ورود کارکترهای جایگزین میشود. |
cnw |
insert | از نقطه ای که cursor قرار گرفته است n کلمه را پاک میکند و با ورود اتوماتیک به مد insert، آماده دریافت کاراکترهای جدید میشود. |
dd |
command | خط فعلی را به طور کامل حذف میکند. |
dnd |
command | با احتساب خط فعلی n خط را حذف میکند. |
D |
command | کاراکترهای موجود در خط، از نقطه cursor به بعد را حذف میکند. |
C |
insert | کاراکترهای موجود در خط فعلی را از نقطه cursor به بعد پاک میکند و به مد insert میرود تا کاراکترهای جایگزین را بخواند. |
cc |
insert | کل محتوای خط فعلی را پاک میکند و به طور اتوماتیک به مد insert میرود و کاراکترهای ورودی را جایگزین کاراکترهای قبلی میکند. |
cnc |
insert | با احتساب خط فعلی n خط را پاک میکند تا محتوای جدیدی را جایگزین نماید. |
dw |
command | کلمه فعلی از نقطه cursor به بعد را حذف میکند. |
dnw |
command | تعداد n کلمه از نقطه فعلی cursor به بعد را حذف میکند. |
yy |
command | محتوای خط فعلی را در داخل clipboard کپی میکند. |
yny |
command | با احتساب خط فعلی، محتوای n خط در داخل clipboard کپی میشود. |
/search |
command | لغت search را از نقطه فعلی cursor به سمت پایین جستجو میکند. برای مورد بعدی n و برای مورد قبلی N را بزنید. |
?search |
command | لغت search را از نقطه فعلی cursor به سمت بالا جستجو میکند. برای مورد بعدی n و برای مورد قبلی N را بزنید. |
:= |
command | تعداد کل خطهای فایل را میدهد. |
:-= |
command | شماره خط فعلی را میدهد. |
:r filename |
command | محتوای فایل filename را میخواند و آنرا در خط بعد از خط فعلی cursor قرار میدهد. |
:w filename |
command | معادل save as. فایل را تحت نام filename ذخیره میکند. |
:w |
command | معادل save. فایل را تحت نام فعلی ذخیره میکند. |
:i,jw filename |
command | از خط i تا خط j فایل فعلی را در فایل filename ذخیره میکند. |
:w! filename |
command | فایل فعلی را تحت نام filename ذخیره میکند. اگر فایلی هم اکنون به آن نام وجود داشته باشد آن را رونویسی میکند. |
Ctrl+f |
command | معادل دگمه ++page-down++ به اندازه یک صفحه به پایین پرش میکند. |
Ctrl+b |
command | معادل دگمه ++page-up++. به اندازه یک صفحه به بالا میرود. |
Ctrl+d |
command | به اندازه نیم صفحه به پایین پرش میکند. |
Ctrl+u |
command | به اندازه نیم صفحه به بالا پرش میکند. |