وزن: 3
توضیحات: داوطلبان باید قادر به ویرایش فایلهای متنی با استفاده از vi باشند. این هدف شامل پیمایش در vi، حالتهای اصلی vi، درج، ویرایش، حذف، کپی و جستجوی متن است.
حوزههای کلیدی دانش:
- پیمایش در یک سند با استفاده از vi
- استفاده از حالتهای پایه vi
- درج (insert)، ویرایش (edit)، حذف (delete)، کپی (copy) و جستجوی متن
اصطلاحات و ابزارهای کاربردی:
- vi
- /, ?
- h,j,k,l
- i, o, a
- c, d, p, y, dd, yy
- ZZ, :w!, :q!, :e!
نیاز به یادگیری نحوه استفاده از ویرایشگرهای متن در Linux انکارناپذیر است. هر مدیر سیستم و مهندس، هر روز با فایلهای پیکربندی (configuration) که معمولاً متن ساده (plain text) هستند سر و کار دارد و اغلب این کار صرفاً با یک یا چند ابزار خط فرمان (command-line) انجام میشود (مثل nano، vi یا emacs).
ویرایشگر vi (visual editor) تقریباً روی همه سیستمهای Linux و UNIX وجود دارد. در واقع اگر یک سیستم فقط یک ویرایشگر داشته باشد، احتمال زیادی وجود دارد که همان vi باشد؛ پس ارزش دارد که کار با vi را بلد باشید.
با استفاده از vi میتوانیم یک فایل موجود را ویرایش کنیم یا از صفر یک فایل جدید بسازیم. همچنین میتوانیم از این ویرایشگر فقط برای خواندن یک فایل متنی استفاده کنیم.
ویرایشگر vi حتی در نشستهای ssh هم عالی است!
بیشتر توزیعهای Linux امروزه به جای vi کلاسیک، ویرایشگر vim (مخفف Vi IMproved) را ارائه میکنند. Vim با vi سازگار رو به بالا (upward compatible) است و علاوه بر حالت استاندارد متنی vi، حالت گرافیکی (gvim) هم دارد. دستور vi معمولاً یک alias یا یک symbolic link به برنامه vim است.
نسخههای مختلفی از vim وجود دارد: tiny، small، normal، big و huge. میتوانیم با دستور زیر ببینیم چه نسخهای از vim در حال اجراست و چه قابلیتهایی در آن وجود دارد (در اینجا ubuntu 16.04):
root@ubuntu16-1:~# vi --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:44:48)
Included patches: 1-1689
Extra patches: 8.0.0056
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by pkg-vim-maintainers@lists.alioth.debian.org
Huge version without GUI. Features included (+) or not (-):
+acl +farsi +mouse_netterm +tag_binary
+arabic +file_in_path +mouse_sgr +tag_old_static
+autocmd +find_in_path -mouse_sysmouse -tag_any_white
-balloon_eval +float +mouse_urxvt -tcl
-browse +folding +mouse_xterm +terminfo
++builtin_terms -footer +multi_byte +termresponse
+byte_offset +fork() +multi_lang +textobjects
+channel +gettext -mzscheme +timers
...
برای خواندن، ساختن یا تغییر دادن یک فایل با vi، کافی است نام فایل را به آن بدهید:
vi filename
{% hint style="info" %}
اگر فقط vi(یا vim) را تایپ کنید و Enter بزنید، صفحه معرفی نسخه vi(m) نمایش داده میشود:
VIM - Vi IMproved
~
~ version 7.4.1689
~ by Bram Moolenaar et al.
~ Modified by pkg-vim-maintainers@lists.alioth.debian.org
~ Vim is open source and freely distributable
~
~ Help poor children in Uganda!
~ type :help iccf<Enter> for information
~
~ type :q<Enter> to exit
~ type :help<Enter> or <F1> for on-line help
~ type :help version7<Enter> for version info
{% endhint %}
خب شروع کنیم vi(m) را یاد بگیریم.
Vim در واقع سه حالت دارد: insert mode، command mode و escape (last-line) mode. از حالت پیشفرضی که با باز کردن Vim میبینید شروع میکنیم: command mode.
- command mode: وقتی
vim filenameرا برای ویرایش فایل اجرا میکنید، Vim با command mode شروع میشود. در این حالت، تمام کلیدهای حرفی/عددی به «دستور» نگاشت شدهاند و به جای وارد کردن کاراکترها، فرمان اجرا میکنند (save، quit، search/replace، حرکت در فایل، اجرای macro و ...). - insert mode: برای ورود به insert mode، کلید
i(برای “insert”) را بزنید؛ حالا کلیدها همان رفتاری را دارند که انتظار دارید و میتوانید متن تایپ کنید. تا زمانی که بخواهید اصلاح انجام دهید، فایل را ذخیره کنید یا کاری انجام دهید که مخصوص command mode یا escape (last-line) mode است. برای خروج از insert mode، کلید Escape را بزنید. - escape (last-line) mode: وقتی Escape را میزنید دوباره به command mode برمیگردید. اگر بخواهید فایل را ذخیره کنید یا در سند جستجو کنید چه؟ کافی است
:را بزنید تا Vim وارد escape (last-line) mode شود. در این حالت Vim منتظر است یک دستور مانند:wبرای نوشتن فایل یا:qبرای خروج وارد کنید.
اگر اینها پیچیده به نظر میرسند، در عمل اینطور نیست؛ فقط چند روز زمان لازم است تا مغز شما به جابهجایی بین حالتها عادت کند و کلیدهای مهم برای حرکت، دستورات و ... را به خاطر بسپارید.
اولین چیزی که باید یاد بگیرید این است که چگونه در فایل حرکت کنید. وقتی در command mode هستید، بهتر است کلیدهای زیر و کارشان را به خاطر بسپارید:
| کلید | کارکرد |
|---|---|
| h | یک کاراکتر به چپ در خط جاری |
| j | رفتن به خط بعدی |
| k | رفتن به خط قبلی |
| l | یک کاراکتر به راست در خط جاری |
| w | رفتن به کلمه بعدی در خط جاری |
| e | رفتن به انتهای کلمه بعدی در خط جاری |
| b | رفتن به ابتدای کلمه قبلی در خط جاری |
| Crtl-f | اسکرول یک صفحه به جلو |
| Ctrl-b | اسکرول یک صفحه به عقب |
اگر قبل از هر کدام از این فرمانها یک عدد تایپ کنید، آن فرمان به همان تعداد تکرار میشود. به این عدد repetition count یا به طور خلاصه count میگویند. مثلاً
5hپنج کاراکتر به چپ حرکت میکند. میتوانید از count برای بسیاری از فرمانهای vi استفاده کنید.
| کلید | کارکرد |
|---|---|
| H | رفتن به بالای صفحه |
| M | رفتن به وسط صفحه |
| L | رفتن به پایین صفحه |
| کلید | کارکرد |
|---|---|
| W | پرش رو به جلو به ابتدای یک word (word میتواند شامل علائم نگارشی باشد) |
| E | پرش رو به جلو به انتهای یک word (word میتواند شامل علائم نگارشی باشد) |
| B | پرش رو به عقب به ابتدای یک word (word میتواند شامل علائم نگارشی باشد) |
| کلید | کارکرد |
|---|---|
| 0 | پرش به ابتدای خط |
| ^ | پرش به اولین کاراکتر غیر-خالیِ خط |
| $ | پرش به انتهای خط |
| g_ | پرش به آخرین کاراکتر غیر-خالیِ خط |
| gg | رفتن به اولین خط سند |
| G | رفتن به آخرین خط سند |
حالا که میتوانید یک فایل را در vi باز کنید، در آن حرکت کنید و از آن خارج شوید، وقت آن است که یاد بگیرید چطور متن داخل فایل را ویرایش کنید.
| کلید (برای درج) | کارکرد |
|---|---|
| i | درج متن قبل از نشانگر تا زمانی که زده شود |
| I | درج متن در ابتدای خط جاری تا زمانی که زده شود |
| a | اضافه کردن متن بعد از نشانگر تا زمانی که زده شود |
| A | اضافه کردن متن در انتهای خط جاری تا زمانی که زده شود |
| o | باز کردن یک خط جدید زیر خط جاری و درج متن تا زمانی که زده شود |
| O | باز کردن یک خط جدید بالای خط جاری و درج متن تا زمانی که زده شود |
| کلید (برای تغییر) | کارکرد |
|---|---|
| r | جایگزینی یک کاراکتر زیر نشانگر (بدون نیاز به ) |
| R | جایگزینی کاراکترها از موقعیت نشانگر تا زمانی که زده شود |
| cw | تغییر کلمه جاری با متن جدید از کاراکتر زیر نشانگر تا زمانی که زده شود |
| cNw | تغییر N کلمه از کاراکتر زیر نشانگر تا زمانی که زده شود؛ مثلاً c5w پنج کلمه را تغییر میدهد |
| C | تغییر (جایگزینی) کاراکترهای خط جاری تا زمانی که زده شود |
| cc | تغییر (جایگزینی) کل خط جاری و توقف هنگام زدن |
| Ncc یا cNc | تغییر (جایگزینی) N خط بعدی، از خط جاری شروع میکند و هنگام متوقف میشود |
| کلید (برای حذف) | کارکرد |
|---|---|
| x | حذف یک کاراکتر زیر نشانگر |
| Nx | حذف N کاراکتر از کاراکتر زیر نشانگر |
| dw | حذف یک کلمه که از کاراکتر زیر نشانگر شروع میشود |
| dNw | حذف N کلمه از کاراکتر زیر نشانگر؛ مثلاً d5w پنج کلمه را حذف میکند |
| d^ | حذف از ابتدای خط تا موقعیت نشانگر |
| d$ و D | حذف باقیمانده خط از موقعیت نشانگر |
| dd | حذف کل خط جاری |
| Ndd یا dNd | حذف N خط از خط جاری؛ مثلاً 5dd پنج خط را حذف میکند |
| کلید (برای cut و paste) | کارکرد |
|---|---|
| yy | کپی (yank/cut) خط جاری داخل buffer |
| Nyy یا yNy | کپی (yank/cut) N خط بعدی (به همراه خط جاری) داخل buffer |
| p | گذاشتن (paste) خط(ها) از buffer بعد از خط جاری |
| P | گذاشتن (paste) خط(ها) از buffer قبل از خط جاری |
| کلید | کارکرد |
|---|---|
| /string | جستجوی رو به جلو برای وقوع رشته در متن |
| ? string | جستجوی رو به عقب برای وقوع رشته در متن |
| n | رفتن به وقوع بعدی رشته جستجو |
| N | رفتن به وقوع بعدی رشته جستجو در جهت مخالف |
| کلید | کارکرد |
|---|---|
| :s/old/new/ | جایگزینی اولین old با new فقط در همان خط |
| :s/old/new/g | جایگزینی همه old با new فقط در همان خط |
| :%s/old/new/g | جایگزینی همه old با new در کل فایل |
| :%s/old/new/gc | جایگزینی همه old با new در کل فایل با گرفتن تأیید |
| :%s/old/new/gic | مثل بالا، اما بدون حساسیت به حروف بزرگ/کوچک |
| :noh | حذف highlight نتایج جستجو |
اگر در insert mode هستید، Escape را بزنید. سپس : را وارد کنید؛ یک خط در پایین صفحه با نشانگری آماده دریافت ورودی میبینید.
| کلید | کارکرد |
|---|---|
| :w | نوشتن (save) فایل روی همان نام فایل موجود، بدون خروج از برنامه |
| :w file | اگر نام فایل ندارید یا میخواهید روی file name دیگری ذخیره کنید |
| :q | خروج (اگر تغییرات ذخیره نشده باشد، شکست میخورد) |
| :q! | خروج بدون ذخیره کردن |
| :wq | نوشتن (save) و خروج (اگر فایل قابل نوشتن نباشد خطا میدهد) |
| :wq! | تلاش برای نوشتن و خروج (اگر قابل نوشتن نباشد، بدون ذخیره خارج میشود) |
| ZZ و :x | خروج و ذخیره فایل در صورت تغییر |
| q! یا ZQ | خروج و دور انداختن تغییرات ذخیره نشده |
Escape را بزنید تا به حالت command mode برگردید.
وقتی میخواهید فایل را ذخیره کنید و خارج شوید، به مجوزها (permissions) دقت کنید. فرمان زیر فایل جاری را با استفاده از sudo مینویسد:
:w !sudo tee %
:w– نوشتن فایل (در واقع buffer).!sudo– فراخوانی شل با دستور sudo.tee– خروجیِ دستور نوشتن (:w) با tee تغییر مسیر داده میشود.%– نماد%همان نام فایل جاری است.
| کلید | کارکرد |
|---|---|
| :e | (مخفف :edit) بارگذاری مجدد فایل از دیسک |
| :e! | دور انداختن تغییرات محلی و بارگذاری مجدد |
{% hint style="success" %}
خیلی وقتها لازم میشود برای دیدن نتیجه فایل در حال ویرایش، یک دستور را در شل اجرا کنیم. این کار معمولاً به دو روش انجام میشود:
- میتوانید نشست خود را suspend کنید (
Ctrl-Z) و سپس دستور را در شل اجرا کنید. البته این کار تعداد زیادی کلید دارد! - به جای آن میتوانید از قابلیت داخلی vim برای «اجرای دستور شل» استفاده کنید:
:!cmdیک دستور شل را اجرا میکند، خروجی را نشان میدهد و قبل از بازگشت به buffer جاری از شما تأیید میگیرد. {% endhint %}
کمک لازم دارید؟ میتوانید از :help یا :help keyword استفاده کنید تا vim راهنمای مربوط به keyword را باز کند.
.
.
.
https://developer.ibm.com/tutorials/l-lpic1-103-8/
https://www.tecmint.com/learn-vi-and-vim-editor-tips-and-tricks-in-linux/
https://www.geeksforgeeks.org/vi-editor-unix/
https://www.linux.com/tutorials/vim-101-beginners-guide-vim/
https://www.cs.colostate.edu/helpdocs/vi.html
https://www.endpoint.com/blog/2009/03/10/vim-tip-of-day-running-external
.
