2. Vi: предок

Анотація

Vi був першим з існуючих повноекранних редакторів. Це одна з основних програм, яка піддається нападкам з боку противників UNIX®, і яка водночас є одним з кращих аргументів його захисників: хоча Vi досить складний у вивченні, він стає надзвичайно потужним інструментом, коли людина набирається досвіду в його використанні. З допомогою кількох натискань на клавіші користувач Vi може "згорнути гори", і, крім Emacs, небагато текстових редакторів можуть похвалитися тим самим.

Насправді версія, що поставляється з Mandriva Linux - це Vim (від VI iMproved, поліпшений VI), але в цій главі ми називатимемо його Vi.

Якщо ви хочете докладніше вивчити Vi, ви можете глянути на ці документи: Hands-On Introduction to the Vi Editor чи Vim home page.

2.1. Режим вставки, командний режим, режим ex...

Щоб розпочати вивчення Vi, ми використовуємо той же набір команд, що й для Emacs. Тому повернімося до наших двох файлів і наберемо:

$ vi file1 file2

На цьому етапі ви виявите перед собою вікно на зразок цього:

Рисунок 8.4. Вихідна позиція в VIM

Вихідна позиція в VIM

Нині ви перебуваєте у так званому командному режимі з першим відкритим файлом на екрані. У цьому режимі ви не можете вставити текст в файл. Для цього ви повинні переключитися в режим вставки.

Ось кілька клавіатурних команд для вставки тексту:

[Примітка]Примітка

Будь ласка, зверніть увагу, що клавіатурні скорочення повинні вводитися точно так, як показано, Vi розрізняє символи верхнього і нижнього регістрів в командах, тому команда a - це не одне й те ж, що команда A.

  • a і i: для вставки тексту після курсору і перед ним (A і I вставляють текст наприкінці чи початку поточного рядка);

  • o і O: для вставки тексту під поточним рядком і над ним.

У режимі вставки ви побачите рядок --INSERT-- у нижній частині екрана (так ви визначаєте, у якому режимі ви перебуваєте). Це єдиний режим, який дозволить вам вставити текст. Щоб повернутися в командний режим, натисніть клавішу Esc.

У режимі вставки ви можете використовувати клавіші Backspace і DEL для видалення тексту в міру необхідності. Клавіші зі стрілками дозволять вам переміщатися по тексту в командному режимі і у режимі вставки. У командному режимі є й інші комбінації клавіш, які ми розглянемо пізніше.

Переключення в режим ex здійснюється шляхом натискання в командному режимі клавіші :. У нижній лівій частині екрана з'явиться : з курсором. Усе, що ви введете до натискання на клавішу Enter, Vi буде інтерпретувати як команду ex. Якщо ви приберете введену вами команду і сам символ :, ви будете повернуті в командний режим, а курсор повернеться на вихідну позицію у тексті.

[Підказка]Підказка

У режимі ex вам доступно автозавершення команд: введіть перші символи команди і натисніть клавішу Tab, щоб завершити її набір.

Для збереження змін у файлі, введіть в командному режимі :w. Якщо ви хочете зберегти вміст буфера в інший файл, введіть :w <ім'я_файлу>.

2.2. Обробка буферів

Для переміщення в одному і те ж самому буфері між файлами, чиї імена були відзначені у командному рядку, введіть :next для переходу до наступного файлу і :prev для переходу до попереднього файлу. Ви також можете скористатися командою :e <ім'я_файла>, яка дозволяє вам або перейти до потрібного файлу, якщо його уже відкрито, або відкрити інший файл. Також ви можете використовувати завершення імен файлів.

Також як і в Emacs, у вас на екрані може бути кілька буферів. Для цього скористайтеся командою :split.

Щоб змінити буфер, введіть Ctrl-wj для переходу в нижній буфер, або Ctrl-w k для переходу у верхній буфер. Ви також можете використовувати клавіші зі стрілками угору й униз замість j чи k. Команда :close приховує буфер, а команда :q закриває його.

Вам слід знати, що якщо ви спробуєте приховати чи закрити буфер без збереження зроблених змін, команду не буде виконано, а Vi виведе це повідомлення:

No write since last change (use ! to override) (Після останнього зміни не було виконано запис (використовуйте ! для перекриття))

У цьому разі зробіть, як було сказано вище, і наберіть :q! або :close!.

2.3. Редагування тексту і команди переміщення

У Vi крім клавіш режиму редагування Backspace і DEL є багато інших команд для видалення, копіювання, вставки і заміни тексту в командному режимі. Усі наведені нижче команди по суті діляться на дві частини: виконувана дія і її ефект. Діями можуть бути:

  • c: замінити (Change). Редактор видаляє запрошений текст і після виконання цієї команди повертається в режим вставки.

  • d: видалити (Delete).

  • y: скопіювати (Yank). Ми розглянемо його в наступному розділі.

  • .: повторити останню дію.

Ефект визначає групу символів, для якої застосовується команда.

  • h, j, k, l: один символ зліва, внизу, вгорі і справа відповідно[20].

  • e, b, w: кінець, початок поточного слова та початок наступного слова відповідно.

  • ^, 0, $: перший непорожній символ, початок і закінчення поточного рядку відповідно.

  • f<x>: наступний знайдений символ <x>. Наприклад, fe перемістить курсор до наступного знайденого символу e.

  • /<рядок>, ?<рядок>: наступний і попередній знайдений рядок чи регулярний вираз <рядок>. Наприклад, /lafox переміщає курсор до наступного слова lafox.

  • {, }: початок і закінчення поточного параграфа відповідно.

  • G, H: кінець файлу, початок екрана.

Перед кожним з цих “ефективних” символів чи кожної з команд переміщення може йти номер повторень. Для команди G (“Go”) він означає номер рядка у файлі. Базуючись на цій інформації, ви можете створювати будь-які варіанти комбінацій.

Ось кілька прикладів:

  • 6b: перехід на 6 слів назад;

  • c8fk: видалення всього тексту до восьмого знайденого символу k, а потім перехід в режим вставки;

  • 91G: перехід на 91-й рядок файла;

  • d3$: видалення до кінця поточного рядка плюс наступні дві рядки.

Хоча багато з цих команд здаються не дуже зрозумілими, найкращий спосіб для їх запам'ятовування буде практика. Проте, як бачите, висловлення “звернути гори кількома клавішами” не настільки вже й перебільшене.

2.4. Вирізання, копіювання, вставка

У Vi є команда, яку ми вже бачили при копіювання тексту - це команда y. Для вирізання тексту використовуйте команду d. Для зберігання тексту виділяється 27 осередків пам'яті чи буферів: анонімна пам'ять і 26 осередків з іменами у вигляді літер англійського алфавіту в нижньому регістрі.

Для використання анонімної пам'яті введіть команду “як є”. Так, команда y12w скопіює в анонімну пам'ять 12 слів після курсора[21]. Використовуйте d12w, якщо ви хочете вирізати цю область.

Щоб скористатися одним з 26 названих осередків пам'яті, введіть перед командою послідовність "<x>, lt;xgt; k, quot;ky12w, quot;kd12w, </x>

Щоб вставити вміст анонімної пам'яті, використовуйте команди p або P (від слова Paste) для вставки тексту після чи до курсору відповідно. Щоб вставити вміст іменованого осередку пам'яті, таким самим чином використовуйте "<x>p чи "<x>P (наприклад, "dp вставить після курсору вміст осередку пам'яті d).

Давайте розглянемо приклад:

Рисунок 8.5. VIM, перед копіюванням текстового блоку

VIM, перед копіюванням текстового блоку

Щоб виконати це, ми:

  • повторно скопіюємо перші 6 слів речення в осередок пам'яті r (для прикладу): "ry6w[22];

  • перейдемо в буфер file2, який перебуває знизу: Ctrl-wj;

  • вставимо перед курсором вміст осередку пам'яті r: "rp.

Ми отримали очікуваний результат, як показано на Рисунок 8.6, “VIM, після копіювання текстового блоку”.

Рисунок 8.6. VIM, після копіювання текстового блоку

VIM, після копіювання текстового блоку

Пошук тексту є дуже простим: просто введіть в командному режимі /, рядок, який шукаєте, і натисніть клавішу Enter. Наприклад, /kyiv шукатиме рядок kyiv від поточної позиції курсору. Натискання на n перемістить вас до наступного знайденого збігу, а якщо ви досягнете кінця файла, пошук розпочнеться знову з початку файла. Для пошуку в зворотному напрямку замість / використовуйте ?.

2.5. Вихід з Vi

Команда для виходу - :q (насправді, як ми вже бачили, вона закриває активний буфер, але якщо це єдиний відкритий буфер, ви завершите роботу Vi). Є скорочена клавіатурна команда, бо в більшості випадків ви редагуєте один файл. Тому для виходу ви скористаєтеся:

  • :wq чи :x для збереження змін і (швидшим рішенням буде ZZ), або

  • :q! для виходу без збереження.

Вам слід звернути увагу на те, що якщо у вас відкрито кілька буферів, то :wq запише і закриє лише активний буфер.



[20] Скорочена клавіатурна команда для dl (видалення одного символу справа) - x; скорочена клавіатурна команда для dh (видалення одного символу зліва) - X; dd видаляє поточний рядок.

[21] Але тільки, якщо курсор знаходиться в початку першого слова!

[22] У буквальному сенсі y6w означає: “Вырізати 6 слів”.