вторник, июня 13, 2006

Новые возможности Vim 7

Тут попросили написать обзор новых возможностей в Vim 7. Ну что ж, получите… :)

Вкладки

Теперь Vim умеет работать со вкладками, как многие GUI текстовые редакторы. Конечно, и раньше можно было открыть два xterm с экземпляром vim в каждом. Но теперь можно нажать yy в одной вкладке, а p - в другой! Вместе с уже традиционной для vim возможностью разбивать каждое окно на два по вертикали или горизонтали вкладки дают потрясающую гибкость интерфейса.

Все команды, предназначенные для работы со вкладками, начинаются с :tab. Перечислю основные из них:

Команда Что делает
:tabnew Новая вкладка
:tabclose Закрыть вкладку
:tabn Перейти к вкладке
:tabnext Следующая вкладка
:tabprevious Предыдущая вкладка

Конечно, набирать такие длинные последовательности символов каждый раз не очень-то удобно. Спасает возможность vim определять для любых действий комбинации клавиш командой map. Например, в большом количестве программ создание новой вкладки назначено на комбинацию Ctrl-T. В vim эта комбинация традиционно используется для возврата по ссылке (а переход по ссылке - Ctrl-]). На мой взгляд, это не самый удачный выбор клавиатурной комбинации. Поэтому можно написать в ~/.vimrc следующее:

map g  :pop      " Вернуться по ссылке

map g " Перейти по ссылке

map :tabnew " Новая вкладка

map :tabclose " Закрыть вкладку

Теперь переход по ссылкам вперед-назад повешен на сочетания g, g, новая вкладка создается по Ctrl-T, а закрывается по Ctrl-A (традиционное во многих программах сочетание Ctrl-W в vim занято - это префикс для операций с окнами).

А я, например, предпочел для операций с вкладками выделить отдельный префикс Ctrl-T, подобно тому как для операций с окнами выделен префикс Ctrl-W:

map n :tabnew      " Новая вкладка

map c :tabclose " Закрыть вкладку

map h :tabprevious " Предыдущая вкладка

map l :tabnext " Следующая вкладка

Кроме перечисленных команд, есть еще целый ряд команд, образованных дописыванием к обычным командам vim префикса :tab. Они делают то же, что и обычные, но - в новой вкладке. Так, например, по команде :tabe filename файл filename откроется для редактирования в новой вкладке.

Еще одна важная команда, работающая со вкладками - :tabdo <команда>. Она выполняет указанную команду сразу во всех открытых вкладках. Это можно использовать, например, для замены текста сразу в нескольких открытых файлах.

Проверка орфографии

Теперь проверка орфографии встроена в vim. Чтобы она заработала, нужно взять с ftp://ftp.vim.org/pub/vim/runtime/spell/ файлы ru.koi8-r.sug и ru.koi8-r.spl (или другие, соответствующие вашей локали) и положить их в ~/.vim/spell. Теперь, чтобы включить проверку орфографии в текущем буфере, нужно дать команду :setlocal spell spelllang=ru (или en, или en,ru, в зависимости от языков вашего текста). Для выключения - :setlocal spell spelllang=. Ошибочные слова в консольном vim подсвечиваются красным фоном, а в gvim - подчеркиваются волнистой красной линией.

Приведу основные клавиатурные команды, относящиеся к проверке орфографии:

Команда Что делает
]s Перейти к следующей ошбке
[s К предыдущей ошибке
z= Выдать список возможных замен
zG Добавить слово в словарь
zW Пометить слово как ошибочное

Умное автодополнение

Vim теперь умеет автодополнение в стиле MS Visual Studio - с выпадающими списками. При редактировании исходного текста, скажем, на C++, находясь в режиме вставки, наберите первые буквы идентификатора, нажмите Ctrl-X,Ctrl-P - и получите выпадающий список с возможными вариантами продолжения (или идентификатор будет дополнен сразу, если продолжение единственно)! Самое удивительное, что выпадающие списки работают даже в консоли.

Умные отмены

Если предыдущие описанные возможности представляли собой перенос идей из других редакторов, то новая система отмен в vim - это пока что уникальная возможность, практически прорыв в нашем представлении о возможностях операции Undo.

Мы уже привыкли представлять себе последовательность действий в редакторе как обычный линейный список. Движение назад по нему возможно только с помощью отмены последнего действия. А если мы сделали действия 1, 2, 3, 4, 5, потом отменили действия 4 и 5 и сделали 6 и 7, то действия 4 и 5 безнадежно забыты.

Vim 7 изменяет это представление. Теперь действия в редакторе образуют не список, а дерево. И в упомянутой только что ситуации мы можем вернуться к состоянию, когда сделаны действия 1, 2, 3 и 4, одной командой :undo 4. А потом можем передумать и сказать :undo 7.

Разберем более наглядный примерчик. Пусть в файле у нас есть слово one. Мы добавляем к нему слово too. Потом исправляем слово too на two. Потом отменяем последнее действие, снова получаем one too. Теперь меняем слово one на me и получаем me too. Добавляем восклицательный знак. Эту последовательность действий можно представить такой диаграммой:

          'one'

|

change 1

|

'one too'

/ \

change 2 change 3

| |

'one two' 'me too'

|

change 4

|

'me too!'

Хотите теперь вернуться к ситуации, когда у вас было one two? Пожалуйста - наберите :undo 2. Передумали и хотите получить me too - наберите :undo 3.

Команда :undo с числовым аргументом полезна, когда вы помните номер изменения, к которому вы хотите вернуться. Посмотреть список последних операций с их номерами можно по команде :undolist. А можно двигаться вперед-назад по дереву отмен, нажимая g+ и g-.

Vim 7 запоминает время, когда было произведено каждое действие. И благодаря этому появляется еще одна инновационная возможность - отмена и отмена отмены по времени. Скажем, вы редактируете большой файл. Например, пишете статью. И вдруг решаете, что все, что вы изменили в ней за последние 30 минут, было сделано неправильно. Наберите :earlier 30m - и получите текст, который был у вас полчаса назад. Решили, что все-таки первые несколько правок за эти 30 минут были правильными - наберите :later 5m.

Ну что я могу сказать?

Воистину, у Vim 7 есть только один конкурент - Emacs с его ELisp-ом (правда, дерева отмен нет и там). И создатели Vim в очередной раз показали, что самый классический редактор в *nix является самым современным.


Last updated 13-Jun-2006 20:32:15 YEKST

1 комментарий:

  1. Анонимный7/14/2007 1:30 AM

    в емаксе дерево отмен было задолго до седьмого вима

    ОтветитьУдалить