Vi

?vi(1) є стандартною для Юнікс програмою редагування файлів. На будь-якій машині Юнікс ви завжди знайдете встановлений vi або один із його різновидів - ?elvis, vile чи vim. Всі версії vi поділяють стандартний набір властивостей і команд, тож якщо ви навчились користуватись однією з них, у вас не виникне проблем перейти на іншу.

vi включає ряд корисних властивостей, таких як підсвітка синтаксису, форматування коду, потужний механізм пошуку і заміни по тексту, макроси тощо. Ці властивості роблять редактор особливо привабливим для програмістів і веб-розробників. Системні адміністратори також оцінять автоматизацію й інтеграцію з оболонкою.

На Slackware встановленою за замовчуванням версією vi(1) є elvis. Інші версії, такі як vim або gvim, також доступні, якщо ви встановили ?віконне середовище X і відповідні бібліотеки. Не буде помилкою вказати, що останні дві є найрозвинутішими і найпопулярнішими версіями vi(1). Якщо vim все ще використовується у текстовому режимі, то gvim - це вже графічна версія того самого vim із підтримкою пеналу, меню і діалогових вікон.

Насправді vim і gvim є тим самим бінарним файлом, gvim - це лише символічне посилання на vim.

Запуск vi

?vi(1) можна запустити з командношо рядка ріними способами. Найпростішим буде:

$ vi

Останнє запустить ?vi з пустим буфером. Ви отримаєте практично порожній екран, знаходячись у командному стані (стани vi розглянуто у наступному розділі), ?vi очікуватиме від вас певних дій. Щоб покинути ?vi, введіть наступне:

:q

Якщо ви не зробили жодних змін у файлі, остання команда (скорочення від quit) виведе вас із ?vi.

Ілюстрація 1. Сесія vi.

 +-------------------------------------------------+
 |*/                                               |      
 |void                                             |          
 |TabReset(Tabs tabs)                              |          
 |{                                                |       
 |      int i;                                     |          
 |                                                 |
 |      for (i = 0; i < TAB_ARRAY_SIZE; ++i)       |          
 |            tabs[i] = 0;                         |         
 |                                                 |
 |      for (i = 0; i < MAX_TABS; i += 8)          |        
 |            TabSet(tabs, i);                     | 
 |}                                                |
 +-------------------------------------------------+                                                                
 |tabs.c                                           |             
 +-------------------------------------------------+
 |   if ((tmp = TypeCallocN(Char, length)) == 0)   |           
 |      SysError(ERROR+SREALLOC);                  |           
 |   *sbufaddr = tmp;                              |             
 |                                                 |
 |   for (i = k = 0; i < nrow; i++) {              |             
 |      k += BUF_HEAD;                             |            
 |      for (j = BUF_HEAD; j < old_max_ptrs; j++) {|             
 |            memcpy(tmp, base[k++], ncol);        |              
 |            tmp += ncol;                         |           
 |      }                                          |
 +-------------------------------------------------+
 |screen.c                                         |          
 +-------------------------------------------------+

Ви також можете вказати який саме файл vi має відкрити. Скажімо, щоб відредагувати /etc/resolv.conf, вам необхідно виконати:

$ vi /etc/resolv.conf

vi дозволяє вам під час запуску автоматично перейти на вказаний рядок файла. Це особливо зручно програмістам, коли у повідомленнях про компіляцію вказано рядок із помилкою. Так, скажімо, щоб переміститись на 47-ий рядок файла /usr/src/linux/init/main.c, виконайте:

$ vi +47 /usr/src/linux/init/main.c

vi відкриє вказаний файл і розмістить курсор на 47-му рядку. Якщо ви вказали рядок, який знаходиться поза межами файла, vi розмістить курсор на останньому рядку.

Стани: командний, вводу.

vi працює в різноманітних станах, які дозволяють здійснити різні завдання. Коли ви запускаєте vi, ви автоматично опиняєтесь у командному стані (command mode). Цей стан, як вказує його назва, дозволяє вводити різноманітні команди команди (перелічені у таблиці...) - переміщення по тексту, пошуку-заміни, запису файла, завершення роботи, зміни стану, тощо. Для, власне, вводу тексту, вам необхідно перейти у стан вводу (insert mode). Останній дозволяє вам, буквально, друкувати текст у вашому файлі. Перехід з командного стану у стан вводу не є складним, притисніть i клавішу (або Insert) для стану вводу і Esc для командного стану.

Командний стан.

Як ми вже вказали, у командному стані ви ме в змозі безпосередньо вводити текст і редагувати відкритий вами файл. Ти не менш у вас є можливість непрямої маніпуляції тексту, пошуку по тексту, збереження тексту, завантаження інших файлів, виходу з редактора. У командному стані ви можете оперувати лише за допомогою команд і спеціальних комбінацій клавіш. Більшість команд починаються з двокрапки (:). Нижче наведений список найпоширеніших команд і їхнє пояснення:

Переміщення курсора:
h, j, k, l | Переміщення по тексту. h - вліво, j - униз, k - вверх, l - вправо.
^ | Перемістить курсор на початок лінії.
$ | Перемістить курсор на кінець лінії.
gg | Перемістить курсор на початок файла.
G | Перемістить курсор на кінець файла.
:1 | Перемістить курсор на перший рядок файла (рівносильне gg).
:47 | Перемістить курсор на 47-у лінію файла.
:$ | Перемістить курсор на останню лінію файла (рівносильне G).

Пошук по тексту: || /word | Пошук наступного випадку word у тексті. ?word | Зворотній пошук word у тексті. / | Повторить останній пошук. ? | Повторить останній пошук у зворотньому напрямку. n | Повторить останній пошук у тому самому напрямку. N | Повторить останній пошук у зворотньому напрямку.

Редагування: || x | Видалить знак що знаходиться під курсором. 10x | Видалить 10 наступних знаків, включаючи той що під курсором. r | Замінить знак під курсором знаком який ви введете одразу після r. dd | Видалить поточну лінію. 5dd | Видалить 5 наступних лінії, включаючи поточну. J | З'єднає поточну і наступну лінії у одну лінію. u | Скасує останню дію. %s/old/new/g | Глобальний пошук і заміна old на new.

Збереження змін і припинення роботи: || :q | Покине редактор. :q! | Покине редактор без збереження змін. :w | Запис файла. :wq | Запише файл і покине редактор. :e! | Перезавантажить поточний файл. :w abcd | Збереже файл під назвою 'abcd. :e dcba | Відкриє файл із назвою dcba. :r !ls | Прочитає вивід ls команди у буфер.

Додаткові команди: || :h | Допомога (help). :sh | Тимчасове повернення до оболонки.

Вищенаведені команди, це лише мала частина всіх можливих команд і комбінацій vi у командному стані. Скажімо, ми не згадали комбінацій на кшталт 10k яка перемістить курсор вище на 10 ліній.

Командний режим також може використовуватись для вирізки і вклеювання, вставки тексту, зчитування інших файлів у поточний буфер. Копіювання тексту здійснюється завдяки y ключу (yank). Копіювання поточної лінії можна здійснити якщо ввести yy, остання команда також може мати як префікс кількість ліній що ви хочете копіювати. Після вказівки що саме копіювати у буфер, перемістіться у те місце у файлі куди ви хочете копіювати і притисніть p (paste). Текст буде вставлено на одну лінію нижче поточної лінії.

Команда dd, насправді, означає вирізку тексту, ви можете вклеїти його назад тією самою p командою.

Щоб добавити текст з іншого файла у поточний, просто виконайте команду :r (read) із назвою файлу текст якого ви хочете добавити. Текст буде вклеєно у поточний буфер одразу за лінією на якій знаходиться курсор. Більш розвинені vi клони, vim наприклад, включають навіть механізм доповнення назви файла, коли ви можете ввести лише декілька перших букв і притиснути Tab клавішу для доповнення. (Ви також завжди можете повернутися до оболонки завдяки :sh команді, виконати ls, потім exit або Ctrl+D, що поверне вас назад у vi).

Командний режим дозволяє як простий пошук по тексту, так і складнішу операцію пошуку і заміни що використовує синтаксис розширених регулярних виразів (extended regular expressions). Звичайно, це передбачає базові знання мови регулярних виразів і створення шаблонів, які ми не в змозі охопити у цьому тексті.

Простий пошук здійснюється за допомогою / ключа за яким слідує рядок тексту що вас цікавить. Наприклад, щоб знайти слово "system" у тексті, введіть /system. Не цілковиті зпівпадання також будуть включені, тож vi зупиниться також на таких словах як "subsystem", "unsystematical", тощо. Після знаходження першого співпадання, ви можете продовжити пошук просто ввівши / знак і притиснувши Enter. Ви також можте шукати у зворотньому напрямку у файлі, ввівши ? замість слеша.

Стан вводу.

Як ми вже вказали, щоб перейти з командного стану у стан вводу, притисніть у командному i або Insert клавішу. Стан вводу тому так і називається що дозволяє вводити текст, тобто друкувати. Спершу класичний vi і його клон elvis можуть видатись незвичними під час друку оскільки стирання знаків за допомогою Backspace не підтримується і доводиться часто перемикатись зі стану вводу у командний щоб видалити щось. Якщо це дратує вас, спробуйте використати зручніший vim, де Backspace підртимується.

Клавіша a (append) також розпочне стан вводу, якщо ви знаходитесь у комадному стані, різниця полягає у тому ввід почнеться на один знак вправо від курсора.

Одним з різновидів стану вводу є стан заміни. Скажімо, ви помилились однією буквою у слові, наведіть курсор на цю букву у командному стані, притисніть r (replace) клавішу, потім введіть правильну букву. r ключ працюватиме лише для одного знаку, для заміни багатьох, використайте R ключ у командному стані або ще раз притисніть Insert у стані вводу.

Зі стану вводу ви завжди можете повернутися у командний стан з допомогою Esc клавіши.

Щоб уможливити Baclspace ключ у vim, ви повинні запускати прогаму з -N (noncompatible) прапорцем, або, краще, скопіюйте файл ініціалізації /usr/share/vim/vim62/vimrc_example.vim у ваш домашній каталог як .vimrc.

Відкриття файла.

Крім вказування назви файла як під час запуску vi, ми також можемо відкривати файли зсередини програми. Так, знаходячись у командному стані, виконайте, наприклад:

:e /etc/lilo.conf

Якщо у вас уже був попередньо завантажений файл, який ви змінили але не зберерегли, vi видасть повідомлення про помилку. Ви всерівно можете відкрити новий файл без збереження попереднього якщо введете :e! із назвою нового файла. Саме для блокування повідомлень про помикли використовується знак оклику за командами.

У випадку якщо ви хочете заново відкрити той самий файл, введіть просто :e!. Це зручно якщо ви якимось чином зіпсували файл і хочете почати знова.

Деякі vi клони, наприклад vim, надають можливіть відкрити багато буферів одночасно. Так, скажімо, щоб відкрити /etc/hosts одночасно з іншим файлом, введіть:

:split /etc/hosts

Новий файл буде зображено на верхній половині екрану, тоді як старий - на нижній. Існує велика кількість команд для маніпуляції роздліленого екрану, найкраще якщо ви заглянете у посібник vim(1).

Збереження файла.

Існує декілька спосоів зберегти файл у vi. Якщо ви хочете зберегри поточний буфер у файл something.txt, введіть:

:w something.txt

Щоб зберегти знову у той самий файл, все що необхідно, це :w команда. Всі зміни будуть збережені у тому самому something.txt. Якщо ви хочете зберегти файл і одночасно покинути vi (доволі поширена операція), виконайте :wq (wtite-quit). vi збереже поточний файл і поверне вас назад до оболонки.

Іноді ви, можливо, захочете редагувати файл із правами тільки на читання. Щоб зберегти зміни у такому файлі, необхідно також використати знак оклику:

:w!

Тим не менш, ви не зможете змінити файл який належить іншому користувачеві і групі, в таких випадках ви повинні стати root користувачем.

Припинення роботи.

Як ми вже вказали у минулому розділі, найуживанішим способом завершення роботи є зберегти зміни і вийти з програми за допомогою :wq команди. Якщо ви не внесли жодних змін у файл, можете просто вийти з vi виконавши :q. Якщо ви хочете негайно вийти з програми без збереження змін що ви внесли, скористайтесь :q! командою.

Якщо під час редагування якогось файла ваш комп'ютер або vi програма аварійно завершили роботу, редактор включає механізм відновлення аварійно перерваної роботи, збарігаючи поточний буфер у тимчасовий файл. Тож, якщо ви пізніше спробуєте знову редагувати той самий файл, vi запропонує вам відновити роботу з того місця де сталася аварія.

Конфігурація vi

Ваш vi клон може бути конфігуровано у декілька способів.

Різноманітні команди можуть бути введені у командному стані для налагодження vi як вам зручніше, що працюватиме для однієї сесії. В залежності від вашого редактора, ви можете включити властивості що зроблять програмування, скажімо, набагато приємнішим, а саме підсвітку синтаксису, автоматичні відступи вправо, тощо. Також ви можете наладити макроси для автоматизації завдань, текстові автоматичні заміни, і.т.д.

Всі команди конфігураці можуть бути поміщені також у конфігураційному файлі у вашому домашньому каталозі. Так, наприклад, elvis очікує .exrc файла, тоді як vim - .vimrc. Більшість команд налагодження що можна ввести у командному стані можна розмістити у цих файлах, макроси і текстові заміни включно.

Біліьшість команд налагодження починаються з set команди, вони можуть дещо відрізнятися у різних варіантах vi. Вам варто проконсультувати посібних вашого редактора для деталей. Крім посібника, такий редактор як vim, наприклад має надзвичайно зручну вбудовану :help команду. Крім того, vim включає приклад конфігураційного файла /usr/share/vim/vim63/vimrc_example.vim, який ви можете скопіювати як .vimrc (зверніть увагу що vim63 каталог відображає версію редактора, у вас може бути інакша).

Наступне є невеличким прикладом .vimrc, зауважте що подвійні лапки починають коментар і все що стоїть за ними не береться до уваги:

" Simple .vimrc file.

" Finish when started as "evim".
if v:progname =~? "evim"
  finish
endif

" Use Vim settings, rather then Vi settings.
set nocompatible 

" Allow backspacing in insert mode.
set backspace=indent,eol,start 

set nobackup            " not keeping backup
set history=50          " keep 50 lines of command line history
set ruler               " show the cursor position all the time
set showcmd             " display incomplete commands
set incsearch           " do incremental searching 

" Switch syntax highlighting on, when the terminal has colors
if &t_Co > 2 || has("gui_running")
  syntax on
  set hlsearch
endif

set autoindent          " autoindent on

Багато прогам у Лінуксі за замовчуванням завантажать текстовий файл у vi. Наприклад, редагування завдань cron програми автоматично викличе vi . Якщо вам, скажімо, не подобається vi і ви хочете щоб програми використовували інший редактор, вам необхідно налагодити VISUAL (а для деяких програм EDITOR) змінну середовища щоб вона вказувала на редактор якому ви надаєте перевагу. Для інформації стосовно змінних середовища зверніться до Розділу 8.1. Щоб упевнитись що вказаний вами редактор буде стандартним кожний раз як ви реєструватиметесь у системі, добавте змінну середовища VISUAL до .bash_profile або .bashrc конфігураційних файлів Bash оболонки.