Тексты программ на Фортране надо где-то набирать, редактировать и отлаживать. Особенно остро вопрос встает при работе удаленно через ssh, поскольку есть только консоль. Не так давно я освоил вим и присоединяюсь к тем, кто утверждает: это лучший инструмент для указанной цели. Впрочем, как любой профессиональный инструмент, он требует некоторого изучения и освоения.
Итак, что такое vim? Это текстовый редактор, клон древнего vi. Он позволяет редактировать текст, причем очень быстро перемещаться по тексту, осуществлять поиски, замену, копировать, удалять и перемещать фрагменты, и вообще - хорошо владея им, можно работать очень быстро и эффективно. Подсветка синтаксиса для любых языков (Фортран, ТеХ, Perl входят, разумеется, в список), умная расстановка отступов, поддержка складок (folds) - сокрытие блоков текста, запуск make из редактора с просмотром ошибок и возможностью перехода к строке ошибки, закладки, автодополнение разными способами, выполнение команд системы, пакетная обработка строк, абсолютная настраиваемость, многооконность, поддержка разных кодировок - это лишь неполный список возможностей. Владея вим, можно очень быстро поменять местами две главы книги (или функции в модуле), записать каждую функцию в свой файл и инвертировать порядок строк (если надо, конечно). Кажется мелочью лишнее нажатие клавиши или перенос руки на мышь - но оптимальная система очень сильно повышает удобство и скорость работы - если хорошо владеешь инструментом. К примеру, как скопировать строку - сделать две одинаковые из одной - в классическом редакторе? Допустим, курсор на строке. Нажимаем Home, Shift+End, Ctrl+Insert, End, Enter, Shift+Insert. Девять нажатий. В Minight Commander с его довольно удобной системой: Home, F3, End, F3, Enter, F5. Шесть нажатий. В Вим: yyp. Три нажатия, причем первые два можно считать за одно, палец не переносится с клавиши на клавишу. Частая опечатка - переставленные два символа; исправим командой xp (удалить символ, вставить его).
Вим знает кое-что о тексте: умеет работать со словами, предложениями, абзацами, разделами, строками. Это отличает его от классики, в которой текст - это набор символов и не более того. В Вим c2w - это "заменить два слова", два слова исчезают и можно вводить другие. Аналогично, d2w - удалить два слова (возможно, для последующей вставки). y2w - скопировать два слова. Это реально удобно, поверьте.
Почему же вим не любят (те, кто его не знают)? Дело в том, что вим не интуитивен и требует освоения. Примерно как самокат и автомобиль - первый прост, интуитивен, надежен, безопасен; второй сложен, опасен (для новичка), какие-то передачи, педали, лампочки и ручки. В отличие от классических редакторов, vim имеет несколько режимов.
В основном, или командном режиме нажатия на клавиши - это команды - перемещения по тексту, удаления, копирования и вставки текста, перехода в другие режимы, отмены сделанных действий и т.п. Именно про этот режим ходит шутка, что набрав свое имя можно непредсказуемо изменить текст. Несколько примеров: ctrl+f - сдвиг на экран вперед, ctrl+b - назад, gg - в начало, G - в конец, h,j,k,l - стрелки влево, вниз, вправо, вверх (обычные стрелки тоже работают), 0 и $ - в начало и конец строки, ^ и _ - на первый непустой символ строки, z. - поместить строку в центр; fx - сдвиг по строке к следующему символу x (курсор после него), а tx - то же, но курсор - до, Fx и Tx - аналогично назад, % - переход к парной скобке; dd - удаление строки, yy - копирование строки, p - вставка удаленного или скопированного текста (P вставляет перед или выше курсора). Удалять можно в общий "буфер обмена", а можно - в именованные, которых 26 по числу букв - команды удаления, копирования и вставки предваряются комбинацией "x, где вместо x - любая буква в нижнем регистре. Если в верхнем, то к буферу дописывается текст. Оцените удобства. Кстати, в регистр можно занести последовательность команд и потом вызывать ее @x. Более того, есть еще нумерованные регистры, их 9 - туда сохраняется удаляемый текст, если его много (от одной строки) - страховка от ошибок, дополнительно к обычному UNDO (символ u). Кстати, U восстанавливает строку к исходному виду, а ctrl+R - повторяет отмененные действия. ZZ - выход с сохранением. Еще полезные команды: gd - ищет первое вхождение слова под курсором (go definition) - полезно для поиска объявления переменной; * и # - поиск следующего/предыдущего вхождения слова под курсором; g, или g; - переход к месту предыдущей/следующей правки. `` - возврат туда, откуда была отдана команда перехода. Есть система меток: mx ставит метку с именем x (любая буква), затем 'x или `x переходит в начало помеченной строки или точно на метку. Список меток можно посмотреть командой :marks. Метку или метки можно удалить - :delmarks - указав список меток или символ ! (удалить все). Метки-цифры использует Вим, но на них можно переходить; метки в нижнем регистре - для переходов в пределах файла, а заглавные - между файлами.
Режим вставки - это обычный режим текстового редактора. Вызывается клавишей i, а также I, a, A, c, C, cc, s - и Insert (отличия - вставка перед курсором, в начале строки, после курсора, в конце строки, вместо указанного текста, вместо остатка строки и вместо всей строки, вместо указанного числа символов, а Insert равнозначен i). При создании нового файла сразу переходим в этот режим; но большую часть времени мы ведь проводим, читая и подправляя готовый текст или код, не так ли? Режим замены - при котором текст идет поверх уже существующего - вызывается из командного буквой R. Также Insert переключает режим вставки на замену и обратно. В этом смысле вим вполне может притвориться обычным редактором. Выход в командный режим - Esc.
Визуальный режим - это возможность выделить кусок текста. В командном режиме он включается буквами v (посимвольное выделение, как в классике), V (построчное выделение) и ctrl+v (выделение прямоугольного блока - ныне почти не встречается, а ведь иногда полезно). Следующая команда относится к выделенному блоку. Это может быть копирование y, удаление d, замена c, изменение регистра ~ и т.д. В командном режиме r заменяет символ под курсором на символ, введенный после без сдвига курсора; если применить операцию при выделенном тексте, то он весь заполнится введенным символом. Операция полезна при редактировании числовых таблиц. Например, очень удобно занулить знаки после запятой у целого столбца.
Режим командной строки - включается символами :, /, ?, ! - позволяет отдавать команды глобальной обработки текста, включая поиск, а также задание настроек. :q! - выход без сохранения, :w - запись, :saveas name делает копию, :s/rrr/RRR/ - поиск текста, удовлетворяющего выражению rrr и замена его на RRR в строке, /rrr - поиск вперед, ?rrr - поиск назад (символы n и N потом - повтор поиска в том же или обратном направлении). :!cmd - выполнение команды внешней системы. :g/ - ищет строки, подпадающие под указанное выражение - потом может идти команда. Например, :g/^!/d находит строки, в начале которых (^) стоит восклицательный знак (комментарий в Фортране) и удаляет их. :tabnew открывает новую вкладку, а ctrl+PgUp, ctrl+PgDn позволяют переключать их. Можно и мышкой, если включена опция mouse (:set mouse=a). Можно задавать аббревиатуры (текст, который заменяется на другой, например dblprec на DOUBLE PRECISION), включать проверку орфографии, определять множество опций.
Вообще двоеточие вводит режим командного редактора ex. Он полезен для пакетной обработки строк текста. Можно работать со строками текста по номерам, отбирать строки по регулярному выражению и потом перемещать, копировать, удалять. И так далее.
Существует файл .vimrc, содержащий команды, которые выполняются при запуске. Можно включить свои любимые настройки, а также привязать часто выполняемые действия к клавишам. Например, у меня F2 сохраняет файл; F3 в режимах вставки и замены включает переназначение клавиш, в результате я могу печатать по-русски, не переключая раскладку, которая остается латинской; F4 открывает текущий каталог и позволяет открыть файл в новой вкладке. F5 выходит в bash (обратно - ctrl+D). F8 выводит меню с кодировками, позволяя выбрать одну либо стиль концов строк (DOS или UNIX). F9 выводит меню трансляторов - Перл, Фортран, Латех и пакет, запускающий латех дважды, потом бибтех, потом опять латех. Выбор пункта меню отправляет редактируемый файл соответствующему компилятору или интерпретатору. make можно вызвать прямо из Vim, командой :make. F10 закрывает файл, если он сохранен (:q) Пробел в командном режиме вставляет пробел, а Enter - делает новую пустую строку. Мне так удобно. Помимо команд, можно создавать целые скрипты на специальном скриптовом языке - или использовать готовые. Если Vim скомпилирован с поддержкой Perl, то можно выполнять команды и скрипты Perl прямо из Vim, причем передавать им некоторый текст для обработки.
Отметим отличие от классических редакторов, в которых различаются операции копирования, вырезания и удаления. В Вим удаления как такового нет. Все удаляемое копируется в буфер. Буферов зато много - более 26. Есть буфер по умолчанию, все копируемое и удаляемое идет туда и может быть вставлено (командой p). 26 буферов имеют имена из одной строчной английской буквы. Можно при удалении, копировании либо вставке указать буфер, тогда копия текста пойдет еще и туда (или оттуда). Например, "adW удаляет слово (символы до пробела) в буфер а. Потом можно вставить это слово: "ap . Если указать заглавную букву, текст будет добавлен к содержимому буфера. Буферы-цифры содержат историю операций удаления/копирования. Есть и другие буферы, включая "черную дыру" _, позволяющую безвозвратно удалить текст (правда, неограниченный откат все равно запомнит текст). Поначалу непривычно: вырезал текст, переместился, стер пару символов и сделал вставку - а вставился удаленный символ. Надо либо сначала вставлять, а потом удалять новое, либо использовать один из именованных буферов.
Команда u отменяет последнюю операцию. В отличие от vi, в котором вторая команда отменяла первую - получалось переключение между последним и предпоследним вариантом - в Вим отмена неограниченная. Сочетание ctrl+r позволяет возвращать изменения, двигаясь обратно. Команда U отменяет все изменения строки. Есть средства работы с деревом истории - если после отмены внесены новые изменения, возникает ветвление. Можно вывести список ветвлений с датой и временем и вернуться к любому.
Возможности автоматизации - колоссальные. Помимо команд, можно писать целые скрипты (хотя лучше это делать на Перле). Команда "точка" повторяет команду. Можно записать макрос двумя способами. Либо просто занести в именованный буфер строку команд, либо записать их туда по мере выполнения: команда q, затем буква буфера, затем - любые действия, и опять q. Запустить макрос можно в любой момент командой @ и затем буква-буфер. А @@ повторит выполненный макрос. Можно указать количество повторов: 50@@.
Вим способен работать с окнами, но эта возможность, хотя и полезна, отступает на второй план в сравнении со вкладками. Между вкладками можно переносить текст, в них можно открывать окна и т.п. Возможность открывать не файлы, а каталоги, тоже полезна. Работа со вкладками проста: довольно одной новой команды :tabnew, мыши и команды перехода к вкладке справа gt. vimdiff использует окна, складки и цветовое выделение для сравнения файлов - очень удобно, но не хватает некоторых возможностей diff, таких как сравнение без учета пробелов или регистра.
Программиста порадует цветовое выделение синтаксиса (:set syntax on) и стек меток. Метки заготавливаются утилитой вроде ctags, а Вим имеет средства перехода по меткам туда и обратно. Метки используются для также навигации по системе помощи. ctrl+] переходит к определению слова под курсором, ctrl+t - возвращает обратно.
Поскольку ресурс - о Фортране, следует сказать об отношениях Фортрана и Vim. Vim знает синтаксис Фортрана, причем и 77, и 90 (с новшествами 95, 2003 и 2008), как фиксированный формат, так и свободный. Пытается разобраться по расширению, но можно задать опцию let fortran_free_source=1, если используется свободный формат (как и должно). Автоматические отступы включаются filetype indent on, но у Фортрана своя специфика. Блоки циклов не отмечаются отступами, так как конец блока может быть отмечен меткой и одна метка может завершать несколько циклов. Что поделать, детские болезни. Если такое не используется, можно включить отступы для циклов: let fortran_do_enddo=1. Сворачивания для Фортрана тоже надо включить: let fortran_fold=1. При этом сворачиваются процедуры и более крупные единицы. let fortran_fold_conditionals=1 дает сворачивать блоки циклов и условий, а let fortran_fold_multilinecomments=1 - комментарии. Наконец, let fortran_more_precise=1 включает более тонкий разбор синтаксиса, что полезно, но более требовательно к ресурсам.См. :help fortran
Теперь материалы. Их очень много в Сети. Викиучебник, например. Вместе с Vim идет скрипт-самоучитель: vimtutor. Прекрасное введение, позволяющее тут же попробовать и потренироваться.
Artymiak J. vi Tips. Essential vi(vim) Editor Skills (2008) - Простая книга, позволяющая быстро овладеть основами. Скриншоты предельно упрощают процесс обучения. Даже непонятно, зачем они - если интеллект позволяет освоить Vim, они и не нужны. Я читал ее после vimtutor - очень вовремя, узнал много полезного без особых усилий. Доступна на rutracker.org
Robbins A., Hannah E., Lamb L. Learning the vi and Vim Editors. 7th ed. (2008) - Седьмое переиздание(!) прекрасного учебника. Там есть все, что нужно. Некоторые темы раскрыты поверхностно или лишь упомянуты (скрипты, некоторые методы свертки, деревья истории изменений и т.д., но обретенная квалификация позволяет разобраться по :help и материалам в интернете). Грамотно построена: сначала азы, потом более тонкие вещи, потом специальные удобства для программистов. Подробно описывает vi, Vim, и кратко - другие клоны vi. Доступна на rutracker.org
Schulz K. Hacking Vim. A cookbook to get the most out of the latest Vim editor (2007) - самая "крутая" из этих книг, требует определенного владения редактором. Содержит "рецепты", весьма полезные, по настройке и использованию Vim. Доступна на rutracker.org