Vim-2 або “що може бути простіше?”, Інші текстові редактори і програми для верстки, Програмні керівництва, статті

Володимир Попов, СофтТерра

Замітка з роздумами про vim, Опублікована 04.09.2001, мала деякий резонанс, у зв’язку з чим розмова про це потужному редакторі хочеться продовжити. Парадоксально, але, визнавши деяку складність vim в минулий раз, зараз я спробую обгрунтувати твердження про його виняткової простоті. Парадоксу, власне, ніякого і немає: все залежить від того, з чиєї позиції дивитися. Для користувача, щойно завантажив дистрибутив vim, він дійсно складний. Досить сказати, що у файлі index.txt понад 1200 рядків, але ж цей файл – всього лише перелік доступних команд з короткими описами в одне, максимум дві пропозиції. 1000, нехай 500 команд не сприяють бажанню познайомитися з редактором. Не будемо поспішати. По-перше, команди досить часто дублюються. По-друге, частина з них успадкована від vi і припускає можливість введення на якому алфавітно-цифровому терміналі. Сучасному користувачеві більш природним здасться використання функціональних клавіш і клавіш позиціонування курсора, миші, нарешті. Всі ці можливості vim, зрозуміло, підтримує, але й старі варіанти набору команд не відміняються. Список скорочується: припустимо, до 150 команд. Не так вже й багато для редактора, який може “все” (уточнювати і в цей раз не будемо), але чи є підстави говорити про “виключної простоті”? Як це не дивно, є. І підстави ці наступні:

Таким чином сконфігурованих, документований і доповнений системою меню vim стає “зразком дружності” до користувача. Вас щось не влаштовує? Зробіть так, як вважаєте більш зручним! Для цього не потрібно володіти якимись спеціальними знаннями, але щось РОБИТИ – дійсно потрібно. Тут доведеться ще раз визнати (і нагадати), що vim написаний програмістами і для програмістів. Але оскільки ряди останніх все ширяться, то і коло користувачів також повинен розширюватися. Якщо це не так, то, можливо, й тому, що вищезазначені більш ніж 1000 рядків одного перерахування команд когось “Відштовхнули” при знайомстві. Саме на цього когось і орієнтований даний матеріал.

Для початку варто пояснити, навіщо все-таки потрібна така кількість команд, якщо більшість редакторів цілком обходиться системою меню. Для прикладу пропоную взяти частини тексту, що виділяються для виконання над ними якийсь операції і звані, як правило, текстовими об’єктами. Можна виділяти їх мишею, як це і робиться в багатьох редакторах: рішення універсальне, але вкрай не ергономічне – спробуйте виділити абзаців 5-6. У загальному випадку текстовим об’єктом може бути символ, слово, речення, абзац, текст в цілому плюс блоки, які, в свою чергу, можуть бути обмежені кутовими, квадратними, фігурними або круглими дужками (адже ми говоримо про текст програми). Курсор (або покажчик миші) в момент вибору також може знаходитися на початку, кінці або всередині текстового об’єкта. Можна, звичайно, “мітити” почало і кінець текстового об’єкта – але це буває так втомлює … Погодьтеся, також, що меню, що відображають всі ці можливості, виглядало б дуже громіздким. А от як це зроблено в vim: якщо курсор на початку об’єкта, то перша буква команди виділення – <a> (Add), а якщо всередині, то <i> (Inner). Тепер залишилося вказати, що є об’єктом. Друга літера – <w>, <s>, <p> або <b>. Неважко здогадатися про їх походження: word, sentence, paragraph, block. Не помилитеся, якщо припустити, що будь-яка з можливих дужок в якості другого символа команди, означає, що об’єкт – це блок, обмежений цим типом дужок. Витончено. І просто. А між тим, це без малого три десятки команд в візуальному режимі.

Логіка інтерфейсу така, що якщо ви виявили якусь можливість в одному з режимів, то майже напевно знайдете аналогічну в іншому. Згадані в першій статті <Ctrl-n> і <Ctrl-p>, Що забезпечують в режимі вставки перехід до наступного (next) і попереднього (previous) варіантів автозаповнення, при автозаповнення працюють практично скрізь. Одні й ті ж символи в командах, як правило, несуть одну і ту ж смислову навантаження: <i> – Ідентифікатор, <d> – Макровизначення, <f> – Файл. Тому <[i> – Знайти перша поява ідентифікатора (фактично – визначення змінної), <[d> – То ж для макровизначення. Поняття “перша поява” для файлу сенсу не має, тому <[f> ідентично <gf> і означає відкриття для редагування файлу, ім’я якого знаходиться під курсором. Якщо тим же i,d,f передує <Ctrl-W> (Ознака window-Команд), то результатом буде відкриття нового вікна (а для файлу – і нового буфера) з переходом до визначення змінної або дії. Якщо команда має “сусідів за змістом”, то швидше за все вони будуть викликатися зміною регістра другого (уточнюючого) символу. Так, <[I> і <[D> роздрукують всі рядки з даними ідентифікатором або макропеременной. Ті ж символи присутні в складі <Ctrl-X> (EXtended – розширеного) підрежими режиму вставки. Цей подрежь повністю орієнтований на автозаповнення. Неважко здогадатися, що символи <I>, <D>, <F> в якості завершальних (після <Ctrl-X-Ctrl>) Ініціюють автозаповнення імен змінної, дії і файлу відповідно, а <n> і <p>, Як і колись, будуть означати наступний і попередній варіанти автозаповнення.

“Універсальними” можуть бути не тільки останні символи команд, як в попередніх прикладах, а й перші. Перш за все, це вже згадувані <Ctrl-X> – Перший символ розширеного підрежими вставки, і <Ctrl-W> – Перший символ window-Команд. Як правило, команда деталізується другий символ. Крім уже названих, для window-Команд це: <+> – Збільшити, <-> – Зменшити, <=> – Зробити рівними розміри вікон, <s> – Розділити (split), <c> – Закрити (close), <n> – Відкрити нове (new), <r> і <R> – Поміняти місцями (rotate) вікна. Ще одним “універсальним” символом може бути символ, що ідентифікує іменований буфер або, відповідно до документації, реєстр. Якщо пам’ятаєте, комбінація <“x> (Де ‘x’ – Будь-який символ: a-zA-Z0-9%#:-“) Означає використання регістра з командами <y>,<d>,<p> – Копіювання, видалення, вставка (yank, delete, paste). Аналогічно, <qx> означає перехід в режим запису в регістр, а <q> – Вихід з нього. Записуються як символи, так і керуючі послідовності (фактично – команди редактора). Якщо в регістр записані команди редактора, то його вміст можна виконати командою <@x>. Але це можливо вже тільки з регістрами a-z. Вміст регістра можна вставити командою <Ctrl-R>, Причому це допустимо як безпосередньо в тексті (режим вставки), Так і в командному режимі. На цьому список символів – “універсальних складових” команд – можна вважати вичерпаним, але – не вичерпним, оскільки є і унікальні комбінації, що не мають аналогів в інших режимах. Наприклад, <Ctrl-U> в режимі вставки видаляє рядок, а <Ctrl-V> дозволяє ввести символ призначення введенням тризначного десяткового коду. В нормальному режимі <Ctrl-L> перемальовує екран, <Ctrl-R> скасовує дії undo (<u>), А <Ctrl-A> і <Ctrl-X> інкрементіруется або декрементируется число під курсором. Так само унікальні команди пошуку та заміни, перераховані в першій статті. <U> в візуальному режимі переводить виділений фрагмент у верхній регістр, а <u> – В нижній. <~> поміняє регістр для одного символу в нормальному режимі і для виділеного фрагмента – в візуальному.

Деякі символи зберігають своє призначення і в командному режимі: <!> – Фільтр, <@x> – Виконати вміст регістра ‘x‘, ‘<'І'>‘- Зменшити і, відповідно, збільшити “відступ” рядків. Взагалі, командний режим варто трохи “особняком”, оскільки є практично самодостатньою: у ньому доступні практично всі дії, що ініціюються командами інших режимів, хіба що обсяг введення буде більше. Зате текст команд достатньо “прозорий”. Наприклад:
:buffer N – Перейти до буферу N;
:Print – Роздрукувати;
:set – Показати або встановити опції.
А кількість символів, що вводять зменшується завдяки допустимим скорочень і вже неодноразово згадуваному автозаповнення. Перераховувати ці самі “EX” команди немає сенсу – їх без малого три сотні, а ось переглянути цей список – варто. Хоча б для того, щоб знати, які ще можливості має vim. Крім команд, які дублюють команди інших режимів, ми знайдемо тут команди управління буферами (== відкритими файлами), меню, “прив’язкою” команд до клавіатурним послідовностей (map), засоби програмування, індексації (tags), управління редактором і багато, багато іншого.

Так ми підійшли до наступного гідності vim, що забезпечує його “простоту” – винятковим можливостям настройки. Насамперед звернемося до конфігураційному файлу vimrc (Для графічного режиму – gvimrc). На www.vim.org варто взяти vimrc.forall – Файл написаний Свеном ГУКБ (Sven Guckes) “На всі випадки життя”. Файл прекрасно прокоментовано і дійсно при деяких модифікаціях може влаштувати багатьох. Але краще використовувати його як “керівництво до дії”. Познайомившись для початку з командою map:
map   \\   <C-]>
яка замінює <Ctrl-]> (Перехід за посиланням у help (tag)), на більш зручну послідовність <\\>, Переходимо до вельми обширного блоку визначення опцій (set …). Автоотступ, автоматичне збереження копій, розмір табуляції і так далі, і так далі: перерахування в рамках статті є неможливим – vimrc.forall має об’єм в 75К. Але одну опцію я все-таки наведу:
set langmap = йцу … ЙЦУ …; qwe … QWE …
Три крапки в даному випадку означають “всі інші символи на клавіатурі” в нижньому і верхньому регістрах для розкладок ru і us. <;> перед ‘qwe’ відокремлює “підміняється” набір від “підміняє”. Крапку з комою (в наборі, а не розділяє) і подвійні лапки потрібно виключати (quote) за допомогою backslash (\), як зазвичай. Дана опція робить не потрібним перемикання розкладки клавіатури, коли потрібно латинський символ в нормальному режимі – неіснуючий, як бачите, недолік vim, про який я писав в першій статті. Спасибі всім вказали на цю опцію. Що стосується Свена ГУКБ, то, подбавши про введення таких необхідних йому умляутами, він дійсно не врахував нашу прихильність до кирилиці – цілком простимо для жителя Берліна. Наступна секція vimrc.forall навчить використовувати скорочення – abbreviations. Справа смаку. Цікаво використовувати скорочення в якості “автокорректора” опечаток: aslo-> also. Або – записної книжки: Ysnail-> Sven Guckes Pariser Str. 52 D-10719 Berlin. Зверніть увагу, що скорочення команди abbreviate (ab) можуть передувати символи <i>, <c> і <un> (Insert, command, undo). Як Ви, напевно, здогадалися, це означає актуальність (дієвість) скорочення для режимів вставки і команд або скасування скорочення. Якщо цей невеликий список ми розширимо ще символами <a>, <n>, <o> і <v> (All, normal, operator і visual) – то отримаємо список “універсальних” модифікаторів, які можна застосувати і до деяких інших командам, таким, як map і menu. Пізнавана логіка, чи не так? Наступна секція ‘MAPings’ містить визначення прив’язки команд до визначеним користувачем клавіатурним послідовностей. Ось де справжній простір для “підгонки” vim під Ваші смаки. Хочете виходити з редактора по ? Будь ласка:
map    <F10>   :q<CR>
imap   <F10>   <Esc>:q<CR>
cmap   <F10>   <Esc><Esc>:q<CR>
Останні дві команди можна замінити однією: map! : Q , але для цього вже треба знати про існування map! (Map для режимів команд і вставки) У другій позиції може бути і послідовність символів. Наприклад,
map   <F6>:set number<CR>
map   n<F6>:set nonumber<CR>
буде по <F6> включати нумерацію рядків, а по <n><F6> – Вимикати.
Наступні секції, що описують застосування автокомандами для використання vim в якості поштового клієнта, PGP-шифрування та операції з синтаксисом, дуже цікаві, але вже не мають відношення до розмови про “простоті” vim.

Вищевикладене мало переконати читача, що “не такий страшний vim …” і вивчати страхітливих розмірів help може бути, і не доведеться … У мене, у всякому разі, на якомусь етапі знайомства в цим редактором склалося враження, що якби я мав під рукою 1-2 сторінки підказок … А чому – ні? Оскільки за <F1> vim викликає файл help.txt з каталогу $ VIMRUNTIME / doc / (значення $ VIMRUNTIME можна уточнити по: set helpfile), чому б його не “підмінити”, зберігши оригінальний help.txt і перейменувавши в help.txt свій файл? Кілька “варварський”, але дієвий спосіб. Витонченіше буде вставити свій help в існуючу систему допомоги: шлях до персонального help-у подовжиться на пару натиснень клавіш, але зате у Вашому розпорядженні завжди будуть і свій файл і оригінальна система допомоги. Не вдаючись у тонкощі роботи з посиланнями (tags) наведу короткий рецепт:

Готово. Запускаємо vim, натискаємо <F1> і переходимо за посиланням $MyHelp (<Ctrl-]> – За умовчанням, <\\> – Якщо Ви скористалися порадою Свена, або подвійний клік, якщо віддаєте перевагу миша).

Ну, а оскільки “еталоном” дружності інтерфейсу довгий час вважалася система випадаючих меню, то залишилося подивитися, як така реалізується в vim. Дистрибутив містить файл menu.vim, Активний за замовчуванням тільки для графічного середовища. Для появи меню в консольному режимі під все той же vimrc потрібно вставити наступні команди:
source $VIMRUNTIME/menu.vim
set wildmenu
set cpo-=<
set wcm=<C-Z>
map <F9> :emenu <C-Z>

На місці <F9> може бути, зрозуміло, будь-яка клавіатурна послідовність. Можна мати особистий меню-файл, тоді перший рядок повинна вказувати на нього. Меню як меню. Але це – vim, а, значить, його можна модифікувати. Файл menu.vim порівняно невеликий: менше 22К для версії 5.6. Частина його складають функції, власне і забезпечують функціонування системи меню. Оскільки програмування в vim нас на даний момент не цікавить, то звернемо увагу лише на блоки, першим словом рядків яких є команда menu з попередніми їй уже відомими модифікаторами <a>, <c>, <i>, <n>, <o> і <v> відповідно до існуючих режимами. Плюс tmenu – Для організації спливаючих підказок (tooltips) в графічному середовищі. Зазвичай рядок такого блоку виглядає наступним чином:
amenu  10.330  &File.&Close<Tab>:q  :confirm q<CR>
Елементи рядка розділяються пробілами. В даному випадку перший з них, amenu – Команда, що забезпечує появу даної позиції меню у всіх (all) режимах. Другий – число, частина до точки якого визначає позицію в головному (горизонтальному), а після крапки – в випадаючому (вертикальному) меню. Подібним чином лексеми до і після точки третього елемента рядки являють собою текстовий зміст позиції меню. Недруковані символи у складі лексем вводяться відповідно до правил для конфігураційного файлу, прогалини і точки виключаються (quote) за допомогою зворотного косою риси (backslash). Провідним (hot) символам у складі лексем передує Амперсенд (&). Четвертий елемент – власне команда, яку потрібно виконати. Просто і ефективно. Якщо команда припускає редагування або якщо Вам потрібен додатковий контроль над командами – не завершуйте рядка . Фактично, система меню просто вводить за вас необхідну “EX”-команду.

Таким чином vim може обретесті інтерфейс, простіше якого (при заданому рівні функціональності) вже не буде. Всі бажані удосконалення Ви можете зробити самі. Коштів для цього – достатньо. Чи не стану стверджувати, що шлях до цієї “простоті” так вже, вибачте за тавтологію, простий, але “немає нічого ціннішого хорошого інструменту”. У тому числі і для програміста.

Багатьох можливостей vim, до речі, ні, перша ні друга стаття навіть не торкалися. Поза розгляду залишилися інтеграція з Perl і Python, програмування для користувача функцій, форматування тексту і багато інші теми, гідні окремого обговорення.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*