Vim
Лектор: Наану Александр Аднанович
Диктофонная запись: http://esyr.org/lections/audio/uneex_2008_summer/uneex_08_04_02.ogg
Сталкиваться с ним совершенно необязательно, но про него есть поговорка: первые несколько недель вы его ненавидете, после этого вы без него не можете.
Первый vi написал Bill Joy. Дяденька учился в беркли и стоит у истоков Sun. Вроде её основал, до трёх назад был в статусе главного учёного.
Лектор решил начать с редактора по имени qed. Это были древние времена были терминалы, которые представляли собой большие принтеры, телетайпы. Редакторы были командными. ed --- слегка расширенная версия qed. Все команды у него в одну букву. важный ист. этап, поскольку из него выросло много чего, что етсь сейчас. Билл Жой написал ex, extended ed. Из ex появился vi. Также из ed'а выросли sed, grep, из них вырос awk. Также в ed была первая регекспов. Из awk вырос Perl. Собственно, awk, как и perl --- ЯП.
Возвращаясь к vi. vi --- visual ed. Поначалу это были фронтенд для ex. Они немного выводят на экран, поскольку в то время надо было экономить бумагу. В ex появлиись расширенные регекспы, появились многобуквенные команды, появились расширенные диапазоны. Поначалу vi был визуальной оболочкой. Когда появились нормальные терминалы, то построчный режим стал не столь удобным. В vi были режимы: ex режим и режим редактирования(?), появились кнопки hjkl для навигации.
Переходим к ветке vi. Все, кто пользовались BSD, видели nvi. Он отлмичается от vi тем, что он умеет много файлов, буферов. Потом vim. Ещё elvis. Ещё странная вещь vile. Последний живой клон --- bvi. Отличается тем, что зачёсан под бинарные файлы. Два самых навороченных --- nvi и vim, но мы будем говорить про vim.
Основные отличия: есть режим полной совместимости с vi. Чем vim отличатеся от совр. родственников? Workflow. У него есть буферы, окошки. Начиная с седьмой версии, появились табы. Ну, и самое главное, у него есть не два режима, а штук 7. Про часть из них никто не знает, но лектор про них расскажет.
- Insert-режим
- Командный режим (нормальный режим в vi)
- Режим командной строки (он же ex-режим; то, что набираете после двоеточия)
- Select
- Посимвольный
- Построчный
- Блочный
- Визуальный режим. Похожий на select, но отличается
- Операторный режим.
Остальные лектор опустит.
Чем отличаются режимы? Тем, как работает в них клавиатура. Инсерт режим --- ввод вставляется в буфер. Командный --- воспр. как команда. Командная строка --- команда исп. после enter. Селект --- изменение выделения. Визуальный --- почти то же самое, но можно ывделять мышкой. Операторный --- режим набора операторов команды.
Далее: струкртура команды --- команда, оператор, диапазон. Пример: gUw --- сделать апперкейсом одно слово. Это что касается команд в командном режиме.
Командлайновый режим --- то, что после двоеточия, например :wqa. То есть, сохранить и выйти для всех. Некоторые команды можно сохранить.
Команды идентифицируются по минимальной уникальной последовательности.
Главная команда --- :he[lp], вызов помощи. Из 9 мегабайт дистрибутива помощь занимает 8.
Есть ещё evim --- vim в интерактивном режиме
По умолчанию vim живёёт в командном режиме. По умолчанию ESC --- выход из любого режима.
Когда ставите vim, появляются след. команды:
- ex
- vim
- gvim
При стандартном режиме компиляции вима это один бинарник.
Пример: конвертация концов строк и кодировки:
#! /bin/sh { echo ":se ft=unix" echo ":se enc=utf-8" echo ":wqa" } | ex -s $1
- se --- set
- ft --- ?
- enc --- encoding
- wqa --- write, quit all
Команды:
- :e --- открыть фай
- :w --- сохранить
- :q --- выход
- :help --- помощь
gvim --- оконный режим вима, получите окошко с менюшками и кнопочками. Минусы вима и плюсы гвима:
- vim умеет раскрашивать текст, нов терминалах некоторых есть ограничение на 16 цветов, гвим же умеет
- gvim умеет антиалиазинг
- В терминале некоторые кнопочки не существуют, например shift+enter, ctrl+enter
Модели организации работы есть следующие: есть файлы, файлы загружаются в буфера. Буфера загружаются в окошки. Окошки могут загружаться в табы.
- Буферы
- :ls --- список буферов
- :b[#] --- выбор буфера
- Окна
- :sp
- : ...
- ^w
- Табы
- :tab
:make --- пытается найти мейкфайл и собрать умолчальный таргет. Кроме того, если исп. стандартные компиляторы, то output компилятора выведется в специальные буферы и можно будет ходить по ошибкам
:cl --- ?
:grep --- позволяет фильтровать строки. Отличается от команды поиска, которая работает по слешу.
Полный цикл работы с ЯП можно и нужно запихивать в vim, потому что это удобнее, чем всё остальное.
Для тех, кто вим собирал: vim -s make.vim
Сложая, странная вещь номер раз: почему нужен -s? Есть команда :so[urce]. Она выполняет какой-то вимовский скрипт. Есть два режима выполн. скриптов: командный и выполнение скриптов. Функцию в командном режиме написать можно, но её надо написать в одну строчку.
Вимовские команды образуют собой скриптовый язык. Можно писать разной степени навороченности программы на виме. В принципе, универсальные программы на виме писать не надо. Но при этом он полноценный алгоритмически полный. Вимовские ТД: строки, буфера, окошки. Сейчас появились числа, списки, хэши. Для чего же этот ЯП нужен? Если вы пишете плагин для вима, новый синтаксис, новый режим, новую командочку, то альтернативы практически нет.
Про написание на альт. языках: ...
Правильно собран: ...
Новый режим: ...
Спеллчекер: ... . Стандартная проблема --- недокументированность и то, что народ забывает написать выход из режима и ремап обратно.
Про ctags: ...
Переход между режимами:
- По умолчанию командный режим
- Переход в режим редактирования: oO (переход на строчку вверх/вниз), i, cC (изменить что-то), Ins, a, R, s...
- Переход в режим командной строки: :
- Переход в режим выделения: v, V, ^V
- Визуальный режим: :visual. Отличается тем, что потом переход в режим замены
- Операторный --- после любого модификатора
В виме есть magic-режимы. Регекспы заточены на модификацию сишных фалов, поэтосу стандартные сишные символы набираются без бэкслеша. Для людей, которые не на С есть режимы magic и automagic. В nomagic-режиме сишные последовательности не квотируются. В совсем magic режиме они квотируются всегда. В обычном magic режиме квотируются нккоторые.